简介
Gunicorn是一个Python WSGI HTTP Server。WSGI代表Web服务器网关接口(Python Web Server Gateway Interface),是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。主要负责:接受HTTP请求、解析HTTP请求、发送HTTP响应。
简单使用:
1 | # gunicorn [OPTIONS] APP_MODULE |
APP_MODULE
形如:$(MODULE_NAME):$(VARIABLE_NAME)
。MODULE_NAME
是app模块源代码.py
文件的路径(/
用.
代替)。VARIABLE_NAME
指的是WSGI callable的一个变量名称,也可以是一个返回WSGI callable的函数调用:$ gunicorn "myproject:create_app()"
日志
Gunicorn主要的logger:
gunicorn.error
gunicorn.access
gunicorn.http
可以将Gunicorn的logger对应的handler把原始模块的logging的handler替换(或者添加),这样原始logger输出的日志也会被Gunicorn的logger对应的handler所处理。示例代码如下:
1 | logger_name = 'gunicorn.error' |
信号
所有信号的定义:官网文档
常用:
重启app:一个个关闭worker,然后再一个个开启worker(并不是关一个,起一个,再关下一个)。
1 | kill -HUP masterpid |
架构
Gunicorn是一种基于pre-fork
的woker模型。这里的pre
是指在请求到来之前,所有的worker已经fork
好了。也就是说,master是一个进程,所有的woker是都有单独的进程。
master
master进程是一个循环监听器,接收各种信号。
sync worker
默认的woker类型就是同步woker,一个worker在同一时刻只能处理一个请求。同步woker不支持持久连接。
async worker
异步woker基于greenlets(通过eventlet或者gevent)。
调用
用gunicorn启动一个app时的调用顺序:
1 | bin.gunicorn -> gunicorn.app.wsgiapp:WSGIApplication.run() |
utils:import_app()
:
1 | def import_app(module): |
也就是:gunicorn的worker使用__import__
加载用户的app module代码,再使用eval()
获取app对象。
使用案例
gunicorn的文档相对比较少,建议多看官方仓库的example目录。