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,我们在此也做简单的介绍。
打开ubuntu控制台(ctrl+alt+t)利用Ubuntu的仓库安装。
fnngj@ubuntu:~$ sudo apt-get install Nginx #安装
启动Nginx:
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启动成功。
二、安装uwsgi
通过pip安装uwsgi。
root@ubuntu:/etc# python3 -m pip install uwsgi
测试uwsgi,创建test.py文件:
def application(env,start_response): start_response('200 OK',[(Content-Typetext/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(官网的说法是spawnthespecifiednumberofworkers/processes)
chdir:指定运行目录(chdirtospecifieddirectorybeforeappsloading)
wsgi-file:载入wsgi-file(load.wsgifile)
stats:在指定的地址上,开启状态服务(enablethestatsserveronthespecifiedaddress)
threads:运行线程。由于GIL的存在,我觉得这个真心没啥用。(runeachworkerinprethreadedmodewiththespecifiednumberofthreads)
master:允许主进程存在(enablemasterprocess)
daemonize:使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonizeuWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。
pidfile:指定pid文件的位置,记录主进程的pid号。
vacuum:当服务器退出的时候自动清理环境,删除unixsocket文件和pid文件(trytoremoveallofthegeneratedfile/sockets)
三、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