gunicorn

作者: 点点渔火 | 来源:发表于2017-05-19 21:40 被阅读0次

http://www.nowamagic.net/academy/detail/1330316

http://www.tuicool.com/articles/aiami2

Gunicorn(gunicorn.org)是一个 Python WSGI UNIX 的 HTTP 服务器。这是一个预先叉工人模式,从 Ruby 的独角兽(Unicorn)项目移植。该 Gunicorn 服务器与各种 Web 框架兼容,只需非常简单的执行,轻量级的资源消耗,以及相当迅速。它的特点是与 Django 结合紧密,部署特别方便。 缺点也很多,不支持 HTTP 1.1,并发访问性能不高,与 uWSGI,Gevent 等有一定的性能差距。具体比较可以参看列举一些常见的Python HTTP服务器。

但其实Gunicorn从设计上就不是充当直接从外界接受请求的服务器,作者在 FAQ 里明确提到,Gunicorn 应该是在 Nginx 等服务器后面支持应用请求的。

  1. Gunicorn设计

Gunicorn 是一个 master进程,spawn 出数个工作进程的 web 服务器。master 进程控制工作进程的产生与消亡,工作进程只需要接受请求并且处理。这样分离的方式使得 reload 代码非常方便,也很容易增加或减少工作进程。 工作进程这块作者给了很大的扩展余地,它可以支持不同的IO方式,如 Gevent,Sync 同步进程,Asyc 异步进程,Eventlet 等等。master 跟 worker 进程完全分离,使得 Gunicorn 实质上就是一个控制进程的服务。

  1. Gunicorn源码结构

从 Application.run() 开始,首先初始化配置,从文件读取,终端读取等等方式完成 configurate。然后启动

Arbiter,Arbiter 是实质上的 master 进程的核心,它首先从配置类中读取并设置,然后初始化信号处理函数,建立

socket。然后就是开始 spawn 工作进程,根据配置的工作进程数进行

spawn。然后就进入了轮询状态,收到信号,处理信号然后继续。这里唤醒进程的方式是建立一个 PIPE,通过信号处理函数往 pipe 里

write,然后 master 从 select.select() 中唤醒。

工作进程在 spawn 后,开始初始化,然后同样对信号进行处理,并且开始轮询,处理 HTTP 请求,调用 WSGI 的应用端,得到 resopnse 返回。然后继续。

Sync 同步进程的好处在于每个 request 都是分离的,每个 request 失败都不会影响其他 request,但这样导致了性能上的瓶颈。

gunicorn -w 2 -b 0.0.0.0:8549 app:app   # 起两个并发进程,进程失败以后会重新拉起
  • 配合gevent

另外, gunicorn 默认使用同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好, 它还支持其它更好的模式,比如:gevent或meinheld。

gevent是一个基于libev的并发库。它为各种并发和网络相关的任务提供了整洁的API。gunicorn对于“协程”也就是Gevent的支持非常好。
gevent程序员指南:gevnet指南
gevent.monkey介绍详见:关于gevent monkey。

gunicorn -k gevent code:application
  • 指定配置文件

以上设置还可以通过 -c 参数传入一个配置文件实现。
gunicorn -c gun.conf code:application

gunicorn -c gun.py hello:app

配置 gun.conf

import os
bind = '127.0.0.1:5000' 
workers = 4
backlog = 2048
worker_class = "gevent"      #sync, gevent,meinheld
debug = True
proc_name = 'gunicorn.proc'
pidfile = '/tmp/gunicorn.pid'
logfile = '/var/log/gunicorn/debug.log'
loglevel = 'debug'

配置 gun.py

import os
import gevent.monkey
gevent.monkey.patch_all()
import multiprocessing

debug = True
loglevel = 'debug'
bind = '0.0.0.0:8800'
pidfile = 'log/gunicorn.pid'
logfile = 'log/debug.log'

#启动的进程数
workers = multiprocessing.cpu_count() * 2 + 1 
worker_class = 'gunicorn.workers.ggevent.GeventWorker'
x_forwarded_for_header = 'X-FORWARDED-FOR'

Gunicorn 框架图:

图片.png

相关文章

网友评论

      本文标题:gunicorn

      本文链接:https://www.haomeiwen.com/subject/lgcuxxtx.html