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

时间:2012-01-22 20:25:41

标签: django nginx gunicorn

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

我现在可以表现不佳,但我需要能够整合。每当我们使用导致长请求的功能时,应用程序就会挂起(如预期的那样),然后,在一两分钟之后,会返回“502 - Bad Gateway”。该应用程序的其余部分工作正常。

我检查了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的新手脚本的一部分。

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。任何帮助将不胜感激。

这个问题是cross-post from ServerFault

2 个答案:

答案 0 :(得分:3)

你直接连接到gunicorn吗?或者介于两者之间的ngnix?如果我没记错的话,在nginx中有大约90秒的超时。

另外,对于这种表现不佳的请求,通常有两种解决方案:

  • 缓存结果并获取一个cron作业来调用自定义django管理命令来执行计算并填充缓存。

  • 像芹菜这样的异步任务队列会进行实际计算,您会单独请求检查它是否已准备就绪。

答案 1 :(得分:0)

你在Gunicorn试过Asynchronous workers吗?

特别适合慢速请求等。