一、为什么要在生产上部署Django?
由于django自带web server性能不够好,所以在生产上通常用uwsgi server来代替django自带web server。
二、uwsgi+Django部署

uwsgi介绍
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
- WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
- uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
- 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
- uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
uWSGI的主要特点如下
- 超快的性能
- 低内存占用(实测为apache2的mod_wsgi的一半左右)
- 多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)
- 详尽的日志功能(可以用来分析app性能和瓶颈)
- 高度可定制(内存大小限制,服务一定次数后重启等)
uwsgi的使用
1.安装uwsgi
pip install uwsgi
2.用uwsgi 启动django
uwsgi --http 127.0.0.1:8000 --file proj/wsgi.py --static-map=/static=static
3.通过配置文件启动uwsgi
可在proj同级目录创建script目录: (一般不建议将配置文件放在django项目里)
创建 /script/uwsgi.ini
1 [uwsgi] 2 #项目目录 3 chdir=/home/python/Desktop/test_bushu/myDjango/ 4 #启动uwsgi的用户名和用户组 5 uid=root 6 gid=root 7 #指定项目的application 8 module=myDjango.wsgi:application 9 #指定sock的文件路径 10 socket=/home/python/Desktop/test_bushu/script/uwsgi.sock 11 #启用主进程 12 master=true 13 #进程个数 14 workers=5 15 #记录进程使用了那些内存 16 pidfile=/home/python/Desktop/test_bushu/script/uwsgi.pid 17 #自动移除unix socket和pid文件当服务停止时^[OA 18 vacuum=true 19 #序列化接收的内容,如果可以的话 20 thunder-lock=true 21 #启用线程 22 enable-threads=true 23 #设置中断时间 24 harakiri=30 25 #设置缓冲 26 post-buffering=4096 27 #设置日志目录 28 daemonize=/home/python/Desktop/test_bushu/script/uwsgi.log 29 #指定ip端口 30 http=192.168.190.148:8880 31 #指定静态文件 32 static-map=/static=/home/python/Desktop/test_bushu/myDjango/static
启动
uwsgi --ini uwsgi.ini
停止
uwsgi --stop uwsgi.pid
重载配置
uwsgi --reload uwsgi.ini
三、uwsgi+nginx+django部署

由于uwsgi处理静态请求的能力较差,所以通常使用nginx server处理静态请求,uwsgi处理动态请求,实现动静分离。
静态请求:css,js,图片...
动态请求:提交表单,访问mysql,动态渲染html页面...
1.nginx安装使用
sudo apt-get install nginx sudo /etc/init.d/nginx start # start nginx
2.为你的项目生成Nginx配置文件
在路径/etc/nginx/conf.d/ 下创建你的项目配置文件 projectname.conf
server {
#要监听的端口
listen 8000;
#要访问的路径的前面的url名称,可写域名
server_name 127.0.0.1;
#nginx编码方式
charset utf-8;
#nginx日志配置
access_log /var/log/nginx/access.log main;
#启用压缩,压缩页面大小提高传输速度
gzip on;
#gzip支持压缩的类型
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/png application/octet-stream;
#错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
#指定项目路径uwsgi
location / {
#指定uwsgi的sock文件,将所有的动态请求交给他
uwsgi_pass unix:/home/python/Desktop/script/uwsgi.sock;
#导入一个nginx模块,它是用来和uwsgi进行通讯的
include /path/to/your/mysite/uwsgi_params;
#设置连接uwsgi超时时间
uwsgi_connect_timeout 30;
}
#指定静态文件路径
location /static/ {
alias /path/to/your/mysite/static;
}
}
!!!注意:nginx配置是重启生效的,如果你修改了不知是否正确,可以这样测试
/etc/init.d/nginx configtest
如果是生产环境下nginx正在运行,就不要直接stop start或restart,直接reload对线上影响最低。
浙公网安备 33010602011771号