一、前言
在工作中 写了一个小的 django项目,需要上线,考虑使用 uwsgi+nginx
,就对部署过程进行总结一下。
二、理论铺垫
1、为什么要用 uwsgi
+nginx
?
一个成熟的站点提供服务,需要 Web 服务器 [静态数据] 和 App 服务器[动态数据]
Web 服务器目前属 Nginx 最强大,请求代理过来后,把数据返回给请求客户端,但是目前的互联网发展时代,都是包含动态数据处理的,这样一般 Nginx 不处理业务逻辑,就外包给后端的 App 服务器,这里就是你的 django 服务器。
2、python manage.py runserver
启动方式
平时开发的时候 大家都基本上启动服务都是通过 python manage.py runserver
去直接启动项目,那为什么上线就不可以通过这种方式启动呢?
大佬源码解析:https://blog.csdn.net/Aifore/article/details/86721626
从上可以看到,其实通过 python manage.py runserver
开启也是 django内置的web服务器是封装的wsgiref,是一个用于开发调试的简易服务器。此服务器和uwsgi都符合wsgi协议,当然是可以实现你的需求。但是性能肯定是很低的。
3、uWSGI
1、wsgi:
一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
利用它,web.py或bottle或者django等等的python web开发框架,就可以轻松地部署在不同的web server上了;
2、uwsgi:
同WSGI一样是一种通信协议
3、uwsgi协议:
是一个uWSGI服务器自有的协议,它用于定义传输信息的类型,它与WSGI相比是两样东西。
4、uWSGI:
一种python web server或称为Server/Gateway
uWSGI类似tornadoweb或者flup,是一种python web server,uWSGI是实现了uwsgi和WSGI两种协议的
Web服务器,负责响应python 的web请求。因为apache、nginx等,它们自己都没有解析动态语言如php的功能,
而是分派给其他模块来做,比如apache就可以说内置了php模块,让人感觉好像apache就支持php一样。
uWSGI实现了wsgi协议、uwsgi协议、http等协议。 Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
参考大佬文章:https://blog.csdn.net/c465869935/article/details/532421262
4、WSGI的工作原理,从http原始请求到web框架的处理过程
http的请求 - 响应过程,简单而言,就是浏览器向服务器发送请求,服务器处理请求并返回响应给浏览器展示。
这个请求 - 响应的过程具体是如何实现的呢?整个过程,如下图所示。
参考大佬文章:https://blog.csdn.net/qq_39378657/article/details/107302561
5、项目流程和每个组件的用途
1、首先客户端请求服务资源,
2、nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析,
3、如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源,
4、如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi,
5、wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi,
6、wsgi将返回值进行打包,转发给uWSGI,
7、uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。
*注:不同的组件之间传递信息涉及到数据格式和协议的转换
6、作用
1. 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
2. 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
3. uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
4. django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。
三、安装与配置
1、安装 nginx
yum install nginx
2、安装 uwsgi
pip3 install uwsgi
四、项目配置
1、django项目配置
1、setting.py
文件配置
# 用于收集静态文件
STATIC_ROOT = '/usr/share/nginx/dpia/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
2、运行 python manage.py collectstatic
通过运行上边代码就可以从 /usr/share/nginx/dpia/static/
目录下看到你的静态文件
2、配置 uwsgi
1、项目地址:/opt/dpia
2、uwsg.ini 文件地址 /opt/dpia/uwsgi.ini
3、uwsg.ini 文件内容
[uwsgi]
# 项目目录
chdir = /opt/dpia
# 指定sock的文件路径,用于和 nginx 进行数据交互的端口,一定要和nginx配置保持一致!!
socket = 127.0.0.1:8082
# 指定项目的application
module = dpia.wsgi
# 启用主进程
master = true
# 进程数量
processes = 10
# 配置每个进程的线程数
threads = 2
max-requests = 2000
# 前后端传输数据大小
buffer-size = 65536
# 指定uWSGI日志的存储路径
daemonize = /opt/dpia/uwsgi.log
# 服务启动 pid
pidfile = /opt/dpia/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum = true
3、uwsgi操作命令
# 后台运行
uwsgi -d --ini uwsgi.ini
# 单纯启动
uwsgi --ini uwsgi.ini
# 查看对应程序的进程号码
ps aux|grep uwsgi
# 关闭
uwsgi --stop uwsgi.pid
# 杀死进程
pkill -f uwsgi -9
# 重启uwsgi
uwsgi --reload uwsgi.pid
4、配置 nginx
1、文件路径:/etc/nginx/conf.d/dpia.conf
2、文件内容
server {
# 启动的nginx进程监听请求的端口
listen 80;
#定义使用域名访问
server_name localhost;
charset utf-8;
access_log /etc/nginx/logs/dpia_access.log;
error_log /etc/nginx/logs/dpia_error.log;
# max upload size
client_max_body_size 75M; # adjust to taste
# 静态文件访问的url
location /static/ {
# 指定静态文件存放的目录
alias /usr/share/nginx/dpia/static/;
}
#location /static/ {
#try_files $uri /usr/share/nginx/dpia/static/;
# }
# 将所有非媒体请求转到Django服务器上
location / {
# 包含uwsgi的请求参数,路径为uwsgi_params绝对路径
include /etc/nginx/uwsgi_params;
# 转交请求给uwsgi
uwsgi_pass 127.0.0.1:8082;
}
}
3、nginx命令
nginx -t
nginx -s reload
五、总结
总体不是特别难,注意小细节。