使用 gunicorn + nginx 运行长时间请求

使用 gunicorn + nginx 运行长时间请求

我为基于 Django 的应用程序组建了一个集成服务器。其中一些功能仍处于试验阶段,导致请求时间过长。

目前,我可以接受糟糕的性能,但我需要能够集成。每当我们使用导致长请求的功能时,应用程序就会挂起(如预期的那样),然后,大约一分半钟后,返回“502 - 错误网关”。应用程序的其余部分运行良好。

我检查了 gunicorn 日志,每当发生这种情况时,我都会得到如下一行

2012-01-20 17:30:13 [23128] [DEBUG] GET /results/
2012-01-20 17:30:43 [23125] [ERROR] WORKER TIMEOUT (pid:23128)
Traceback (most recent call last):
  File "/home/demo/python_envs/frontend/lib/python2.6/site-packages/gunicorn/app/base.py", line 111, in run
    os.setpgrp()
OSError: [Errno 1] Operation not permitted

但是,这发生在实际工作超时之前,我将其设置为 10 分钟以确保万无一失。以下是运行 gunicorn 的 upstart 脚本的一部分。

description "..."

start on runlevel [2345]
stop on runlevel [!2345]
#Send KILL after 5 seconds
kill timeout 5
respawn

env VENV="/path/to/a/virtual/env/"

#how to know the pid
pid file $VENV/run/guniconr-8080.pid

script
exec sudo -u demo $VENV/bin/gunicorn_django --preload --daemon -w 4 -t 600 --log-level debug --log-file $VENV/run/gunicorn-8080.log -p $VENV/run/gunicorn-8080.pid -b localhost:8080 /path/to/settings.py
end script

我正在运行 gunicorn 版本 0.13.4。如能得到任何帮助我将不胜感激。

答案1

502 Bad Gateway表示你的 gunicorn worker 超时了。你可以在命令--timeout中添加选项gnuicorn。默认是 30 秒。

正如@greg-k所说,proxy_read_timeoutNginx 的选项控制另一个超时。如果您看到504 Gateway Timeout错误,可以调整此选项。

答案2

这可能是您的 nginx 配置问题。您是否配置了 proxy_read_timeout 值?

此指令设置代理服务器响应的读取超时。它决定了 nginx 等待获取请求响应的时间。超时不是针对整个响应设置的,而是仅在两次读取操作之间设置的。

来源:http://wiki.nginx.org/HttpProxyModule#proxy_read_timeout

相关内容