9

我试图了解以下情况:

  • 我有一个前面有 nginx 的网站(使用 SSL,配置见下文)
  • 对 Django 应用程序的请求由 gunicorn 处理(0.18,配置见下文,由 supervisord 管理)
  • 当用户加载网站时,gunicorn 会处理 10 个请求(其他请求是由 nginx 提供的静态文件)——这些请求不是长时间运行的请求
  • gunicorn 被配置为每个工作人员最多接受 1000 个请求,直到工作人员重生
  • 大约 450 人能够在短时间内(1-2 分钟)加载页面
  • 之后gunicorn以某种方式阻塞并且不再处理任何连接,结果是nginxGateway 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
4

1 回答 1

3

不太确定这里可能是什么问题。

但是,您可以尝试使用服务器挂钩进行调试,例如:

  • on_reload:在通过 SIGHUP 重新加载期间调用以回收工作人员。可调用对象需要接受仲裁器的单个实例变量。

    def on_reload(server): #Print some debug message

  • worker_int:在工作人员退出 SIGINT 或 SIGQUIT 后立即调用。

    def worker_int(worker): #Print some debug message

  • pre_request:在工作人员处理请求之前调用。

    def pre_request(worker, req): #Print some debug message #worker.log.debug("%s %s" % (req.method, req.path))

  • post_request:在工作人员处理请求后调用。

    def post_request(worker, req, environ, resp): #Print some debug message

这可能会帮助您找到问题的根源。

gunicorn 文档中的参考: http ://docs.gunicorn.org/en/stable/settings.html#server-hooks

于 2017-07-16T20:48:55.850 回答