当一个web应用层序开发好后,无论你是用什么语言,最后都要考虑部署到服务器上测试使用,这里就常见的服务器上部署进行如下的摸索总结。WSGI
(Web Server Gateway Interface),翻译为Python web
服务器网关接口,即Python
的Web
应用程序(如Flask
)和Web
服务器(如Nginx
)之间的一种通信协议。也就是说,如果让你的Web
应用在任何服务器上运行,就必须遵循这个协议。
那么实现WSGI
协议的web服务器有哪些呢?就比如uWSGI
与gunicorn,下面总结了
5个常用的WSGI
容器
可能你在许多地方看到的都是采用Nginx
+ uWSGI
(或gunicorn
)的部署方式。实际上,直接通过uWSGI
或gunicorn
直接部署也是可以让外网访问的,那你可能会说,那要Nginx
何用?别急,那么接来下介绍另一个Web服务器——Nginx
Nginx
作为一个高性能Web服务器,具有负载均衡、拦截静态请求、高并发...等等许多功能,你可能要问了,这些功能和使用Nginx
+ WSGI
容器的部署方式有什么关系?
- 首先是负载均衡,如果你了解过OSI模型的话,其实负载均衡器就是该模型中4~7层交换机中的一种,它的作用是能够仅通过一个前端唯一的URL访问分发到后台的多个服务器,这对于并发量非常大的企业级Web站点非常有效。在实际应用中我们通常会让
Nginx
监听(绑定)80
端口,通过多域名或者多个location分发到不同的后端应用。 - 其次是拦截静态请求,简单来说,
Nginx
会拦截到静态请求(静态文件,如图片),并交给自己处理。而动态请求内容将会通过WSGI
容器交给Web
应用处理; Nginx
还有其他很多的功能,这里便不一一介绍。那么前面说了,直接通过uWSGI
或gunicorn
也可以让外网访问到的,但是鉴于Nginx
具有高性能、高并发、静态文件缓存、及以上两点、甚至还可以做到限流与访问控制,所以选择Nginx
是很有必要的;
这里可以说明,如果你选择的架构是:Nginx + WSGI容器 + web应用,WSGI容器相当于一个中间件;如果选择的架构是uWSGI + web应用,WSGI容器则为一个web服务器。那nginx+uwsgi 和nginx+gunicorn,这两种方案,应该如何选择呢?其实这个看自己的选择,两者都还行,不过第二种配置简单点。下面就这两种方式不同配置方式进行阐述。
(1)nginx+gunicorn
Gunicorn是一个WSGI HTTP服务器,python自带的有个web服务器,叫做wsgiref,Gunicorn的优势在于,它使用了pre-fork worker模式,gunicorn在启动时,会在主进程中预先fork出指定数量的worker进程来处理请求,gunicorn依靠操作系统来提供负载均衡,推进的worker数量是(2*$num_cores)+1。我们知道,python是单线程的语言,当进程阻塞时,后续请求将排队处理。所用pre-fork worker模式,极大提升了服务器请求负载。
- 安装及简单使用
pip install gunicorn
gunicorn -h
- 简单示例
####测试脚本test.py
from flask import Flask
app = Flask(__name__)
@app.route('/demo', methods=['GET'])
def demo():
return "gunicorn and flask demo."
###gunicorn运行脚本 -w 表示2个线程 -b 表示映射的ip及端口 -c 加载配置文件
gunicorn -w 2 -b 172.0.0.1:4000 test:app
- 生产环境
在生产环境,起停和状态的监控最好用supervisior之类的监控工具,然后在gunicorn的前端放置一个http proxy server, 譬如nginx。
supervisorctl status //查看所有进程的状态
supervisorctl stop es //停止es
supervisorctl start es //启动es
supervisorctl restart //重启es
supervisorctl update //配置文件修改后使用该命令加载新的配置
supervisorctl reload //重新启动配置中的所有程序
(2)nginx+uwsgi
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx在Http Uwsgi Module中的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
- WSGI看过前面小节的同学很清楚了,是一种通信协议。
- uwsgi同WSGI一样是一种通信协议。
- 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
- 安装简单使用
pip install uwsgi
uwsgi --ini uwsgi.ini ####启动
uwsgi --stop uwsgi.pid ##停止 当配置了pidfile = uwsgi.pid选项
killall -s INT /虚拟环境/bin/uwsgi ##停止 ,未配置uwsgi.pid选项
ps -ef|grep uwsgi ###查看与uwsgi相关的进程信息
使用示例可以参考https://blog.csdn.net/xiaomu_347/article/details/107191671。
补:supervisor
supervisor
是一个用python
语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor
监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制,更详细的使用方法请参考之前的文章 https://xugaoxiang.com/2019/12/04/supervisor/
首先创建/etc/supervisor/conf.d/gunicorn.conf
文件,这是gunicorn
服务的配置文件
[program:gunicorn]
command=/home/xugaoxiang/anaconda3/bin/gunicorn -w 2 -b :5000 run:app
directory=/home/xugaoxiang/workshop/Flask-10-wtf
autostart=true
autorestart=true
user=xugaoxiang
redirect_stderr=true
接着还是同样的方法创建nginx
的配置文件,/etc/supervisor/conf.d/nginx.conf
,内容是
[program:nginx]
command=/usr/sbin/nginx -g 'daemon on;'
autostart=true
autorestart=true
user=root
redirect_stderr=true
nginx
是需要root
权限的,所以user
应该设置成root
。最后就可以重启supervisor
了
sudo /etc/init.d/supervisor restart
参考链接:
1、深入理解uwsgi和gunicorn网络模型_uwsgi三层模型-CSDN博客(深入理解uwsgi和gunicorn网络模型)
2、https://segmentfault.com/a/1190000020386810?utm_source=tag-newest(Django搭建个人博客:将项目部署到阿里云服务器)
3、https://www.cnblogs.com/2mei/p/9213785.html(DJANGO项目部署到服务器上)
4、如何把本地的Django项目部署到服务器(亲测)_django webapi服务如何发布到服务器-CSDN博客(如何把本地的Django项目部署到服务器(亲测))
5、nginx+uwsgi 和nginx+gunicorn区别、如何部署
6、深入理解uwsgi和gunicorn网络模型
7、Flask教程(十二)项目部署-CSDN博客