Nginx+uwsgi+Django部署
Nginx+uwsgi+Django部署
术语简介
web框架
- Web应用框架有助于减轻网页开发时共通性活动的工作负荷,例如许多框架提供数据库访问接口、标准样板以及会话管理等,可提升代码的可再用性。
- Web应用框架(Web application framework)是一种开发框架,用来支持动态网站、网络应用程序及网络服务的开发。其类型有基于请求的和基于组件的两种框架
web服务器
- web服务器即用来接受客户端请求,建立连接,转发响应的程序,至于转发的内容是什么,交由web框架来处理,即处理这些业务逻辑。如查询数据库、生成实时信息等。
- Nginx就是一个web服务器
uWSGI和WSGI
WSGI
简介
全称Python Web Server Gateway Interface,指定了web服务器和Python web应用或web框架之间的标准接口,以提高web应用在一系列web服务器间的移植性
- WSGI是一套接口标准协议/规范;
- 通信(作用)区间是Web服务器和Python Web应用程序之间;
- 目的是制定标准,以保证不同Web服务器可以和不同的Python程序之间相互通信
处理流程
- 接受用户操作浏览器发送的请求
- 接受用户的请求转发至对应的web服务器
- web服务器将请求转交给web应用程序,web应用程序处理请求
- web应用将请求结果返回给web服务器,由web服务器返回用户响应结果
- 浏览器收到响应,向用户展示
产生背景
请求时Web服务器需要和web应用程序进行通信,但是web服务器有很多种啊,Python web应用开发框架也对应多种啊,所以WSGI应运而生,定义了一套通信标准。试想一下,如果不统一标准的话,就会存在Web框架和Web服务器数据无法匹配的情况,那么开发就会受到限制,这显然不合理的。
uwsgi
与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述,与WSGI协议是两种东西,据说该协议是fcgi协议的10倍快。
uWSGI
- 是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。
- WSGI协议主要包括server和application两部分:
部署流程
项目部署
uWSGI
安装
pip install uwsgi
启动文件
[uwsgi]
#使用nginx连接时使用
socket=127.0.0.1:9999 # ip和端口
#项目目录
chdir=/root/projects/dayfresh
#项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=dayfresh/wsgi.py
# 进程数
processes = 4
# 线程数
threads = 2
# uwsgi服务器的角色
master = True
pidfile=/root/project/dayfresh/pidfile/uwsgi.pid # uwsgi的pid生成文件
logto=/root/project/dayfresh/daemonize/uwsgi.log # 日志文件
virtualenv=/root/project/.virtualenv/dailyfresh
启动
uwsgi --ini uwsgi.ini # 启动py
# 手动启动 协程方式
uwsgi --gevent 100 --gevent-early-monkey-patch uwsgi.ini
(dailyfresh) [root@SR dayfresh]# ps -aux | grep uwsgi # 查看uwsgi
收集python静态文件
python3.6 manage.py collectstatic # 收集django所需的静态文件
Nginx
server {
listen 80;
server_name 10.1.1.6; # 监听地址
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9999; # 与uwsgi中的地址端口一样
}
location /static {
alias /var/www/html/dailyfresh/static/; # 静态文件
}
}
(dailyfresh) [root@SR dayfresh]# nginx -t # 查看配置是否有错误
(dailyfresh) [root@SR dayfresh]# nginx -s reload # 重启nginx服务
配置uwsgi开机启动
创建开机启动的服务脚本
vim /lib/systemd/system/uwsgi.service
[Unit]
Description=HTTP Interface Server
After=syslog.target
[Service]
KillSignal=SIGQUIT
ExecStart=/usr/bin/uwsgi --ini /uwsgi路径/uwsgi.ini
Restart=always
Type=notify
NotifyAccess=all
StandardError=syslog
[Install]
WantedBy=multi-user.target
# 加载配置
systemctl daemon-reload
开启命令
systemctl stop uwsgi.service 关闭uwsgi服务
systemctl start uwsgi.service 开启uwsgi服务
systemctl restart uwsgi.service 重启uwsgi服务
注意事项
如果uwsgi配置文件中配置了 daemonize=/path/uwsgi.log (uwsgi服务以守护进程运行)会导致sytemctl启动时多次重启而导致启动失败
需改为 logto=/path/uwsgi.log