1、WSGI协议
Web框架致力于如何生成HTML代码,而Web服务器用于处理和响应HTTP请求。Web框架和Web服务器之间的通信,需要一套双方都遵守的接口协议。WSGI协议就是用来统一这两者的接口的。
2、WSGI容器
常用的WSGI容器有Gunicorn和uWSGI,但Gunicorn直接用命令启动,不需要编写配置文件,相对uWSGI要容易很多
3、gunicorn介绍
gunicorn是一个python Wsgi http server,只支持在Unix系统上运行,来源于Ruby的unicorn项目。Gunicorn使用prefork master-worker模型(在gunicorn中,master被称为arbiter),能够与各种wsgi web框架协作。
为啥要用 gunicorn
Flask 是一个 Platform,他本身并不包括 Web Server,为了使用方便,Flask 内置了一个 Werkzeug wsgi server 但是这个 server 并不高效。 如果是工业部署的话, 就需要用 Gunicorn 去替代掉这个内置的 Wsgi Server.
简单说下几种部署方式
- Flask 内置 WebServer + Flask App = 弱鸡版本的 Server, 单进程(单 worker) / 失败挂掉 / 不易 Scale
- Gunicorn + Flask App = 多进程(多 worker) / 多线程 / 失败自动帮你重启 Worker / 可简单Scale
- 多 Nginx + 多 Gunicorn + Flask App = 小型多实例 Web 应用,一般也会给 gunicorn 挂 supervisor
在生产环境中:一般都是请求的走向都是 Nginx->gunicorn->flask/django app
4、gunicorn安装
gunicorn安装非常简单,使用命令pip install gunicorn即可。一般使用它,主要是为使用其异步的worker模型,还需要安装对应的异步模块。
$ pip install gunicorn
$ pip install greenlet # 使用异步必须安装
$ pip install eventlet # 使用eventlet workers
$ pip install gevent # 使用gevent workers
5、gunicorn使用
这里使用gunicorn来部署一个flask项目举例,此处flask框架的使用不过多阐述,不是本文的重点。
如下例子,保存为app.py
from flask import Flask
app = Flask(__name__)@app.route("/")
def hello():return "Hello World!"
gunicorn通常使用的参数如下:
-c CONFIG, --config=CONFIG # 设定配置文件。
-b BIND, --bind=BIND # 设定服务需要绑定的端口。建议使用HOST:PORT。
-w WORKERS, --workers=WORKERS # 设置工作进程数。建议服务器每一个核心可以设置2-4个。
-k MODULE # 选定异步工作方式使用的模块。
在shell中输入你的启动配置,比如:
gunicorn -w 3 -b 127.0.0.1:8080 app:app
# 此处app:app中,第一个app为flask项目实例所在的包,第二个app为生成的flask项目实例
这样运行正常就可以启动服务器了。
如果要通过网络访问,则需要绑定不同的地址(也可以同时设置监听端口),设置0.0.0.0可以监听到所有ip的请求:
gunicorn -b 0.0.0.0:8080 app:app
6、绑定端口
linux通常会禁止绑定使用1024以下的端口,除非在root用户权限。很多人在使用gunicorn时试图将其绑定到80或者443端口,发现无效。如果想绑定到这些端口,常见的有如下的几种方法:
- 使用Nginx代理转发。
- sudo启动gunicorn。
- 安装额外的程序。
7、结束gunicorn服务进程
使用ps -ef | grep gunicorn命令找出gunicorn所有进程。
# ps -ef | grep gunicorn
root 16843 23035 0 Oct14 ? 00:00:02 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root 22445 23035 0 Oct04 ? 00:00:15 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root 22581 23035 0 Oct11 ? 00:00:05 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
root 23035 1 0 Sep27 ? 00:04:11 /root/Envs/myflask/bin/python3.6 /root/Envs/myflask/bin/gunicorn -w 3 -b 172.17.0.12:80 app:app
然后使用 kill -9 进程ID 命令来杀掉进程,注意,我们找到主进程杀掉即可,子进程会随之结束,在上例中,主进程号为23035.
# kill -9 23035
# ps -ef | grep gunicorn
杀掉进程后,稍等几秒,再使用ps -ef | grep gunicorn查看,发现gunicorn服务进程已全部杀掉。
8、配置文件
通过gunicorn -h可以看到gunicorn有非常多的配置项,因此通常会写成一个配置文件来进行配置。
比如gunicorn.conf文件
# gunicorn.confbind = "0.0.0.0:5000"
workers = 4
backlog = 2048
pidfile = "log/gunicorn.pid"
accesslog = "log/access.log"
errorlog = "log/debug.log"
timeout = 600
# debug=False生产环境不用这个配置项,但调试的时候debug=True还是挺好用的。而且,开启debug项后,在启动gunicorn的时候可以看到所有可配置项的配置
debug=False
capture_output = True
注意上面log项,如果需要将这些log文件统一放到log文件夹下,事先要先建好,不然运行时会报错。
运行代码为:
gunicorn --config gunicorn.conf main:app