Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。
在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。
Linux的强项是用来做服务器,所以,下面的整个部署过程我们选择在Ubuntu下完成。
一、安装Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx同样为当前非常流行的web服务器。利用其部署Django,我们在此也做简单的介绍。
wuzlxadmin@WUZLX004:/$ sudo apt-get install nginx # 安装nginx
启动nginx:
wuzlxadmin@WUZLX004:~$ /etc/init.d/nginx start wuzlxadmin@WUZLX004:~$ /etc/init.d/nginx stop wuzlxadmin@WUZLX004:~$ /etc/init.d/nginx restart
配置nginx
nginx默认会读取/etc/nginx/sites-enabled/default
文件中的配置:
server {
listen default_server;
listen [::]: default_server;
...........
输入你的ubuntu ip即可访问, 正常是127.0.0.1:80
如果出现上图,则说明Nginx已经安装配置成功。
二、安装uwsgi
wuzlxadmin@WUZLX004:~$ pip3 install uwsgi
测试uwsgi,创建test.py文件:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
通过uwsgi运行该文件
wuzlxadmin@WUZLX004:~$ uwsgi --http: --wsgi-file test.py
接下来配置Django与uswgi连接。我的Django项目位置为:
uwsgi支持通过配置文件的方式启动,可以接受更多的参数,高度可定制。我们在Django项目下新建ini文件default_app_uwsgi.ini(注意:不是django目录下的同名子文件夹)
# Django-related settings socket = : # the base directory (full path)
chdir = /usr/app/DataAnalysis # Django s wsgi file
module = DataAnalysis.wsgi # process-related settings
# master
master = true # maximum number of worker processes
processes = # ... with appropriate permissions - may be needed
# chmod-socket =
# clear environment on exit
vacuum = true
其中chdir是django项目的根目录、module是相对路径指向项目同名目录下的wsgi.py文件
接下来,切换到Django项目目录下,通过uwsgi命令读取default_app_uwsgi.ini文件启动项目。
wuzlxadmin@WUZLX004:/usr/app/DataAnalysis$ uwsgi --ini default_app_uwsgi.ini
[uWSGI] getting INI configuration from default_app_uwsgi.ini
*** Starting uWSGI 2.0. (64bit) on [Tue Jun :: ] ***
compiled with version: 5.4. on May ::
os: Linux-4.10.--generic #~16.04.-Ubuntu SMP Thu Jul :: UTC
nodename: WUZLX004
machine: x86_64
clock source: unix
detected number of CPU cores:
current working directory: /usr/app/DataAnalysis/DataAnalysis
detected binary path: /home/wuzlxadmin/.local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
chdir() to /usr/app/DataAnalysis
your processes number limit is
your memory page size is bytes
detected max file descriptor number:
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket bound to TCP address : fd
Python version: 3.5. (default, Nov , ::) [GCC 5.4. ]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1d6b0d0
your server socket listen backlog is limited to connections
your mercy for graceful operations on workers is seconds
mapped bytes ( KB) for cores
*** Operational MODE: preforking ***
ImportError: No module named '/DataAnalysis'
unable to load app (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: )
spawned uWSGI worker (pid: , cores: )
spawned uWSGI worker (pid: , cores: )
spawned uWSGI worker (pid: , cores: )
spawned uWSGI worker (pid: , cores: )
再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,如下内容,添加在http花括号里面。
server {
listen ;
server_name 10.202.143.240
charset UTF-;
access_log /var/log/nginx/DataAnalysis_access.log;
error_log /var/log/nginx/DataAnalysis_error.log; client_max_body_size 75M; location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 10.202.143.240:;
uwsgi_read_timeout ;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /usr/app/DataAnalysis/static/;
}
}
listen 指定的是nginx代理uwsgi对外的端口号。
uwsgi_pass 10.202.143.240:8001;指的本机IP的端口号与ini文件配置中的必须一致。
/static 是配置静态文件的地方。可以直接通过10.202.143.240:8081/static访问此文件夹了。
重启nginx。
PS:
操作/etc/nginx/nginx.conf文件的时候,将下面这一句的注释去掉。
server_names_hash_bucket_size ;
另外注意一下 新加的server的位置问题:
http{
server{}
}
测试nginx的configuration是否ok
nginx -t -c /etc/nginx/nginx.conf
有时候我们会遇到报错说host不存在、那是因为没有把host加入到django项目的settings.py文件中。
ALLOWED_HOSTS = ['*']
改一下settings设置如上即可。记得重新运行一下。
Django admin css问题
1、修改django项目的settings.py文件
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
2、执行语句将文件整体从django default路径copy到static文件中
python manage.py collectstatic
现在你会发现static文件夹下面多了一个子文件夹admin。
重启下uwsgi。
这里没找到什么好的方法,只能通过杀死进程、重新开启来执行。
killall - uwsgi uwsgi --ini /usr/app/DataAnalysis/default_app_uwsgi.ini