/articles/2017_04_08-gunicorn.md
https://github.com/jiajunhuang/blog · Markdown · 56 lines · 40 code · 16 blank · 0 comment · 0 complexity · 208f64cdf6530bea99eb3f3059782d06 MD5 · raw file
- # Gunicorn 简明教程
- Gunicorn是Python下的一个WSGI服务器,听起来很普通,不过因为它支持很多特性,在
- Python界还是很流行,例如作为起Flask的父进程,支持用gevent把Flask打个patch等。
- 它使用的是pre-fork的模式,即启动的时候fork出n个进程,然后master进程负责监听
- 信号和子进程,如果子进程挂了,那么master会拉一个新的起来,如果有对应信号,
- master会发起相应的动作。
- Gunicorn的选项从三个地方读取:
- - 首先从框架里指定,这里只有一个叫Paste的框架才有,我们可以忽略之
- - 其次从 `-c <path/to/configuration>`中指定的python文件里读取
- - 最后从命令行参数里读取
- 顺序是从上往下,优先级递增。
- 详细的配置都在这里:http://docs.gunicorn.org/en/stable/settings.html
- 一般来说,起一个gunicorn作为服务器足以,但是有时候我们可以在Gunicorn前面挡一个
- Nginx,原因如下:
- - Nginx可以缓存住请求,然后内网再次发起请求,并且可以配置负载均衡,如果一台机器
- 的多进程(Gunicorn就是多进程)吃不消的情况下,负载均衡可以把请求打向多个机器
- - Nginx替代Python处理静态文件的请求,以提高性能
- - 很多时候一个机器上可能不止一个服务,需要像Nginx这样的web服务器做一次proxy_pass
- 示例配置文件:
- ```python
- # coding: utf-8
- workers = 2
- worker_class = "gevent"
- max_requests = 1024
- daemon = False
- loglevel = 'info'
- capture_output = True
- errorlog = "-"
- bind = "0.0.0.0:10086"
- ```
- 示例启动命令:
- ```bash
- gunicorn -c gunicorn_config.py main:app
- ```
- 通过gevent打patch实现的协程相比Tornado有以下不同:
- - Tornado内置IOLoop,但是很多第三方库不支持,例如不能愉快的使用requests和SQLAlchemy,
- 否则就是阻塞,虽然网上有一些解决方案但是都不完美
- - gevent性能比Tornado稍高
- - gevent虽然是monkey patch但是有很多人维护,目前也比较稳定
- - gevent打完补丁之后,我们以同步阻塞的方式写代码,但是最后能得到异步的效果