/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

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