Django项目部署
内文部分内容参考至:https://www.cnblogs.com/mapel1594184/p/13973205.html
方式一:Nginx + uWSGI + Virtualenv
Nginx :
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。
特点:
占有内存少,并发能力强
反向代理,可以拦截一些web攻击,保护后端的web服务器
负载均衡,根据轮询算法,分配请求到多节点web服务器
缓存静态资源,加快访问速度,释放web服务器的内存占用
uWSGI :
Virtualenv:
第三方库,用来建立一个虚拟的python环境,一个专属于项目的python环境
1.请求处理整体流程:
nginx接收到浏览器发送过来的http请求,将包进行解析,分析url
静态文件请求:就直接访问用户给nginx配置的静态文件目录(html/css/js/图片),直接返回用户请求的静态文件。
动态接口请求: nginx将请求转发给uWSGI服务器,最后到达django处理
开发服务器与部署在生产服务器后请求与响应的处理方式见下图:

2.各模块作用:
nginx:是对外的服务器,外部浏览器通过url访问nginx,nginx主要处理静态请求(html/css/js/图片)
uWSGI:是对内的服务器,主要用来 处理动态请求 。(从mysql、redis、es等中动态查询到的 数据)。
uwsgi:是一种web协议,接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi。
wsgi:是python专用的web协议,根据请求调用应用程序(django)的某个文件,某个文件的某个函数。
django:是真正干活的,查询数据等资源,把处理的结果再次返回给WSGI, WSGI将返回值进行打包,打包成uwsgi能够接收的格式。
uwsgi:接收wsgi发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

部署步骤:
部署相关文档:
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/uwsgi/
1. 安装uwsgi
pip3 install uwsgi
安装后须进行测试,具体测试步骤见:https://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
2. 安装虚拟环境virtualenv
pip3 install virtualenv
创建虚拟环境
virtualenv --python=python3 虚拟环境名
启用虚拟环境
source 虚拟环境名/bin/activate
虚拟环境python第三方库一键导出与安装
pip freeze > requirements.txt
pip install -r requirements.txt
退出虚拟环境
deactivate
3. nginx安装与配置
sudo apt-get install nginx
cd /etc/nginx
sites-available:可用配置
sites-enabled:已启用配置
nginx.conf:配置文件(一般无需修改)
cd sites-available
vim 项目名.conf
配置项目相关配置:配置详情指导见https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/uwsgi/
例如:
server {
listen 80(端口);
server_name ××.××.××.××(域名);
charset utf-8;
client_max_body_size 75M;
location /static {
alias /home/项目名/static;
}
location / {
uwsgi_pass 127.0.0.1:8001(将80端口转发到uwsgi的8001端口);
include /etc/nginx/uwsgi_params;
}
}
4. 配置uwsgi
cd /home
创建ini文件专属文件夹:
mkdir /uwsgi_conf
配置项目专属ini文件:
vim 项目名称.ini
例如:
[uwsgi]
chdir = /home/项目名
home = /home/虚拟环境文件夹
module = 项目名.wsgi:application
master = True
processes = 4
harakiri = 60
max-requests = 5000
socket = 127.0.0.1:8001(与项目名.conf相对应)
uid = 1000
gid = 2000
pidfile = /home/uwsgi_conf/master.pid
daemonize = /home/uwsgi_conf/master1.log(存储服务log信息)
vacuum = True
详细配置参考:https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/uwsgi/
按配置启动UWSGI:
uwsgi --ini /home/uwsgi_conf/项目名.ini
cd /etc/nginx
创建软链接,链接sites-available中.conf文件的改动
ln -s /etc/nginx/sites-available/项目名.conf /etc/nginx/sites-enabled/项目名.conf
判断nginx配置是否正确:
nginx -t
正常结果:nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启nginx服务:
service nginx restart
5. 代码提交修改后重启服务生效
杀死uwsgi
killall -9 uwsgi
启动uwsgi(虚拟环境中)
uwsgi --ini /home/uwsgi_conf/项目名.ini
重启nginx
service nginx restart
6.注意事项:
(1)修改 : /home/virtual_env/lib/python3.5/site-packages/django/db/backends/mysql/operations.py(146行),将decode改为encode
(2)apache2 与 nginx未改变配置(默认监听端口号相同)时不要同时启动,否则会启动报错,安装时最好将先安装的apache2或者nginx服务stop 。

浙公网安备 33010602011771号