Django的部署能够有不少方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。html
在这种方式中,咱们的一般作法是,将nginx做为服务器最前端,它将接收WEB的全部请求,统一管理请求。nginx把全部静态请求本身来处理(这是NGINX的强项)。而后,NGINX将全部非静态请求经过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。前端
可见,uwsgi的做用就相似一个桥接器。起到桥梁的做用。node
Linux的强项是用来作服务器,因此,下面的整个部署过程咱们选择在Ubuntu下完成。python
1、安装Nginx
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特色是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。nginx
Nginx一样为当前很是流行的web服务器。利用其部署Django,咱们在此也作简单的介绍。web
Nginx官网:http://nginx.org/django
打开ubuntu控制台(ctrl+alt+t)利用Ubuntu的仓库安装。ubuntu
fnngj@ubuntu:~$ sudo apt-get install nginx #安装
启动Nginx:c#
fnngj@ubuntu:~$ /etc/init.d/nginx start #启动 fnngj@ubuntu:~$ /etc/init.d/nginx stop #关闭 fnngj@ubuntu:~$ /etc/init.d/nginx restart #重启
修改Nginx默认端口号,打开/etc/nginx/nginx.conf 文件,修改端口号。服务器
server { listen 8088; # 修改端口号 server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; }
大概在文件36行的位置,将默认的80端口号改为其它端口号,如 8088。由于默认的80端口号很容易被其它应用程序占用。
而后,经过上面命令重启nginx。访问:http://127.0.0.1:8088/
若是出现如上图,说明Nginx启动成功。
2、安装uwsgi
经过pip安装uwsgi。
root@ubuntu:/etc# python3 -m pip install uwsgi
测试uwsgi,建立test.py文件:
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"]
经过uwsgi运行该文件。
fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --wsgi-file test.py
接下来配置Django与uwsgi链接。此处,假定的个人django项目位置为:/home/fnngj/pydj/myweb
fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --chdir /home/fnngj/pydj/myweb/ --wsgi-file myweb/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191
经常使用选项:
http : 协议类型和端口号
processes : 开启的进程数量
workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)
chdir : 指定运行目录(chdir to specified directory before apps loading)
wsgi-file : 载入wsgi-file(load .wsgi file)
stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
threads : 运行线程。因为GIL的存在,我以为这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
master : 容许主进程存在(enable master process)
daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最经常使用的,仍是把运行记录输出到一个本地文件上。
pidfile : 指定pid文件的位置,记录主进程的pid号。
vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)
3、Nginx+uwsgi+Django
接下来,咱们要将三者结合起来。首先罗列一下项目的所须要的文件:
myweb/
├── manage.py
├── myweb/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── myweb_uwsgi.ini
在咱们经过Django建立myweb项目时,在子目录myweb下已经帮咱们生成的 wsgi.py文件。因此,咱们只须要再建立myweb_uwsgi.ini配置文件便可,固然,uwsgi支持多种类型的配置文件,如xml,ini等。此处,使用ini类型的配置。
# myweb_uwsgi.ini file [uwsgi] # Django-related settings socket = :8000 # the base directory (full path) chdir = /home/fnngj/pydj/myweb # Django s wsgi file module = myweb.wsgi # process-related settings # master master = true # maximum number of worker processes processes = 4 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true
这个配置,其实就至关于在上一小节中经过wsgi命令,后面跟一堆参数的方式,给文件化了。
socket 指定项目执行的端口号。
chdir 指定项目的目录。
module myweb.wsgi ,能够这么来理解,对于myweb_uwsgi.ini文件来讲,与它的平级的有一个myweb目录,这个目录下有一个wsgi.py文件。
其它几个参数,能够参考上一小节中参数的介绍。
接下来,切换到myweb项目目录下,经过uwsgi命令读取myweb_uwsgi.ini文件启动项目。
fnngj@ubuntu:~$ cd /home/fnngj/pydj/myweb/ fnngj@ubuntu:~/pydj/myweb$ uwsgi --ini myweb_uwsgi.ini [uWSGI] getting INI configuration from myweb_uwsgi.ini *** Starting uWSGI 2.0.12 (32bit) on [Sat Mar 12 13:05:06 2016] *** compiled with version: 4.8.4 on 26 January 2016 06:14:41 os: Linux-3.19.0-25-generic #26~14.04.1-Ubuntu SMP Fri Jul 24 21:18:00 UTC 2015 nodename: ubuntu machine: i686 clock source: unix detected number of CPU cores: 2 current working directory: /home/fnngj/pydj/myweb detected binary path: /usr/local/bin/uwsgi !!! no internal routing support, rebuild with pcre support !!! chdir() to /home/fnngj/pydj/myweb your processes number limit is 15962 your memory page size is 4096 bytes detected max file descriptor number: 1024 lock engine: pthread robust mutexes thunder lock: disabled (you can enable it with --thunder-lock) uwsgi socket 0 bound to TCP address :8000 fd 3 Python version: 3.4.3 (default, Oct 14 2015, 20:37:06) [GCC 4.8.4] *** Python threads support is disabled. You can enable it with --enable-threads *** Python main interpreter initialized at 0x8b52dc0 your server socket listen backlog is limited to 100 connections your mercy for graceful operations on workers is 60 seconds mapped 319920 bytes (312 KB) for 4 cores *** Operational MODE: preforking *** WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x8b52dc0 pid: 7158 (default app) *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 7158) spawned uWSGI worker 1 (pid: 7160, cores: 1) spawned uWSGI worker 2 (pid: 7161, cores: 1) spawned uWSGI worker 3 (pid: 7162, cores: 1) spawned uWSGI worker 4 (pid: 7163, cores: 1)
注意查看uwsgi的启动信息,若是有错,就要检查配置文件的参数是否设置有误。
再接下来要作的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,添加以下内容。
…… server { listen 8099; server_name 127.0.0.1 charset UTF-8; access_log /var/log/nginx/myweb_access.log; error_log /var/log/nginx/myweb_error.log; client_max_body_size 75M; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; uwsgi_read_timeout 2; } location /static { expires 30d; autoindex on; add_header Cache-Control private; alias /home/fnngj/pydj/myweb/static/; } } ……
listen 指定的是nginx代理uwsgi对外的端口号。
server_name 网上大多资料都是设置的一个网址(例,www.example.com),我这里若是设置成网址没法访问,因此,指定的到了本机默认ip。
在进行配置的时候,我有个问题一直想不通。nginx究竟是如何uwsgi产生关联。如今看来大概最主要的就是这两行配置。
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口与myweb_uwsgi.ini配置文件中的必须一直。
如今从新启动nginx,翻看上面重启动nginx的命令。而后,访问:http://127.0.0.1:8099/
经过这个IP和端口号的指向,请求应该是先到nginx的。若是你在页面上执行一些请求,就会看到,这些请求最终会转到uwsgi来处理。