为什么要使用gunicorn?
Flask 作为一个 Web 框架,内置了一个 webserver, 但这自带的 Server 到底能不能用?
官网的介绍:
While lightweight and easy to use, Flask’s built-in server is not suitable for production as it doesn’t scale well. Some of the options available for properly running Flask in production are documented here.
很显然,内置的 webserver 是能用的。但不适合放在生产环境。这个 server 本来就是给开发者用的。框架本身并不提供生产环境的 web 服务器,SpringBoot 这种内置 Tomcat 生产级服务器 是例外。
假设我们使用的是 Nginx+Flask Run 来当作生产环境,全部部署在一台机器上。劣势如下:
- 单 Worker。
只有一个进程在跑所有的请求,而由于实现的简陋性,内置 webserver 很容易卡死。并且只有一个 Worker 在跑请求。在多核 CPU 下,仅仅占用一核。当然,其实也可以多起几个进程。 - 缺乏 Worker 的管理。
接上,加入负载量上来了,Gunicorn 可以调节 Worker 的数量。而这个东西,内置的 Webserver 是不适合做这种事情的。一言以蔽之,太弱,几个请求就打满了。
Gunicorn 作为 Server 相对而言可以有什么提升?
- gunicorn 的优点如下, 帮我 scale worker, 进程挂了帮我重启
- 用 python 的框架 flask/django/webpy 配置起来都差不多。
- 还有信号机制。可以支持多种配置。
- 其他:在管理 worker 上,使用了 pre-fork 模型,即一个 master 进程管理多个 worker 进程,所有请求和响应均由 Worker 处理。Master 进程是一个简单的 loop, 监听 worker 不同进程信号并且作出响应。比如接受到 TTIN 提升 worker 数量,TTOU 降低运行 Worker 数量。如果 worker 挂了,发出 CHLD, 则重启失败的 worker, 同步的 Worker 一次处理一个请求。 PS: 如果没有静态资源并且无需反向代理的话,抛弃 Nginx 直接使用 Gunicorn 和 Flask app 也能搞定。
搭建步骤
本文是简化版的步骤描述。详细步骤见:【Flask】Nginx / Gunicorn入门:部署你的Flask项目
环境:Centos7,python2.7+nginx+Flask +Gunicorn+mysql5.7
1、安装Gunicorn
虚拟机里面安装完成Gunicorn后,用flask写一个python文件test.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World,test python!'
if __name__ == '__main__':
from werkzeug.contrib.fixers