您好,我是码农飞哥,感谢您阅读本文!本文主要将对gunicorn进行一个简单的总结。
Gunicorn 是一个 Python 的 WSGI HTTP 服务器。它所在的位置通常是在反向代理(如 Nginx)或者 负载均衡(如 AWS ELB)和一个 web 应用(比如 Django 或者 Flask)之间。它是一个移植自Ruby的Unicorn项目的pre-fork worker模型,即支持eventlet,也支持greenlet。
目前Gunicorn只能运行在Linux环境中,不支持windows平台
# 安装最新版本的gunicorn
$ pip install gunicorn
#安装指定版本的gunicorn
pip install gunicorn==19.9.0
#异步模式
pip install gevent==1.4.0
$ pip show gunicorn
$ gunicorn [OPTIONS] $(MODULE_NAME):$(VARIABLE_NAME)
其中MODULE_NAME对应的是python文件,VARIABLE_NAME对应web应用实例。 [OPTIONS]
的参数类型如下:
-c CONFIG, --config=CONFIG
指定项目路径下的配置文件,如gunicorn -c gunicorn.py manage:app
。gunicorn.py文件中设置了workers等参数。-b BIND, --bind=BIND
指定一个服务器的地址和端口,格式是 ( H O S T ) : (HOST): (HOST):(PORT)。例如:gunicorn -b 0.0.0.0:18005 manage:app
-w WORKERS, --workers=WORKERS
是指定工作进程的数量,单核机器上这个数量一般在2-4个之间。例如:gunicorn -w 4 manage:app
。-n APP_NAME, --name=APP_NAME
指定APP的名称-k WORKERCLASS, --worker-class=WORKERCLASS
指定工作模式。工作进程运行的模式,一共有 sync, eventlet, gevent, tornado, gthread 五种模式,默认是sys模式pip install gunicorn[gevent]
pip install gunicorn[eventlet]
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app
worker-connections 是对于 gevent worker 类的特殊设置。(2*CPU)+1
仍然是建议的workers 数量。因为我们仅有一核,我们将会使用 3 个worker。在这种情况下,最大的并发请求数量是3000。(3个worker*1000个连接/worker
)
当worker指定为gevent或者evenlet类型时,线程变成基于Greentlet的task(伪线程),这时候线程数量threads参数是无效的。
使用gevent模式会出现一些兼容性问题。
使用gevent时,系统会使用monkey patch。系统的部分函数会被修改,
有些库会兼容gevent的类型,
例如,任务调度的库apscheduler,web socket需要socketio的库等,需要专门选择gevent的函数。
而有些库则直接无法使用,例如多进程multiprocess。
例如,在一个api请求中,如果需要使用多核cpu资源,采用multiprocess进行多进程计算。则会出现卡死的问题。gevent中,不能使用multiprocess库
pip install gunicorn[tornado]
pip install gunicorn[gthread]
。gunicorn --workers=5 --threads=2 main:app
该命令等同于:
gunicorn --workers=5 --threads=2 --worker-class=gthread main:app
该例中里面的最大并发请求数是 worker*线程
,也就是10。
(2*CPU)+1
来支持这种编程范式。Gunicorn介绍
[译] 通过优化 Gunicorn 配置提高性能