django – Gunicorn在高负载时具有最大请求限制块

我试图了解以下情况:

>我有一个前面有nginx的网站(使用SSL服务,配置见下文)
>对Django应用程序的请求由gunicorn处理(0.18,配置见下文,由supervisord管理)
>当用户加载网站时,10个请求由gunicorn处理(其他是由nginx提供的静态文件) – 此请求不是长时间运行的请求
>枪炮配置为每个工人需要maximum of 1000 requests,直到工人重生为止
>约450人可以在短时间内(1-2分钟)加载页面
>之后,gunicorn以某种方式阻止并且不再处理任何连接,结果是nginx在一段时间后响应Gateway Timeout

我想重新启动工作人员并没有真正发生,或者机制被负载阻止了?我想了解解决此问题的方法.

任何人都可以解释这里发生了什么?非常感谢!

PS:我使用gunicorn 18.0,现在不可能使用更新的版本.

这是我使用的配置.

nginx的:

# nginx
upstream gunicorn_app {
    server 127.0.0.1:8100;
}
server {
    listen 443 ssl;
    ...
    # skipping static files config
    ...
    location @proxy_gunicorn_app {
        proxy_read_timeout 1800;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto https;
        proxy_pass         http://gunicorn_app;
    }
}

gunicorn(通过supervisord开始):

# gunicorn
python manage run_gunicorn --workers 4 --max-requests 1000 -b 127.0.0.1:8100 --timeout 1800

解决方法:

不确定这里可能存在什么问题.

但是,您可以尝试使用Server钩子进行调试,例如:

> on_reload:通过SIGHUP重新加载时调用以回收工作程序.可调用者需要接受Arbiter的单个实例变量.

def on_reload(服务器):
    #Print一些调试消息
> worker_int:在SIGINT或SIGQUIT退出工作符之后调用.

def worker_int(worker):
    #Print一些调试消息
> pre_request:在工作程序处理请求之前调用.

def pre_request(worker,req):
    #Print一些调试消息
    #worker.log.debug(“%s%s”%(req.method,req.path))
> post_request:在工作者处理请求后调用.

def post_request(worker,req,environ,resp):
    #Print一些调试消息

这可能有助于您找到问题的根源.

在gunicorn文档中引用:
 http://docs.gunicorn.org/en/stable/settings.html#server-hooks

上一篇:Nginx Gunicorn Django高延迟


下一篇:在CentOs上部署Gunicorn