长时间运行gunicorn + nginx请求

我已经为我们的Django驱动的应用程序整合了一个集成服务器。 一些function仍然是实验性的,并导致过长的请求。

我现在的performance还不错,但我需要能够整合。 无论何时我们使用导致长时间请求的function,应用程序都会挂起(如预期的那样),然后在一分半钟后返回“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的暴发剧本的一部分。

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

这个问题是从ServerFault的交叉post 。

你直接连接到gunicorn? 还是有一个ngnix之间呢? 如果我记得正确的话,nginx中有90秒的超时。

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

  • 缓存结果并得到一个cron作业来调用一个自定义的django管理命令来完成计算和填充缓存。

  • 一个像芹菜这样的异步任务队列会进行实际的计算,并且你会做一个单独的请求来检查它是否准备好。

你在Gunicorn尝试过异步工作吗?

特别适合慢需求等。