我使用 nginx 和 gunicorn 在两台服务器上托管我的网站,
两台服务器都具有相同版本的软件包,并且网站已成功托管,
但是在我的其中一台服务器中,gunicorn 总是超时,并且出现错误
[CRITICAL]Worker Timeout
Booting worker with pid
Worker cannot boot with pid
此后,网页中出现 502 Badgateway 错误。我必须重新启动 gunicorn 进程才能打开网站。
以下是错误日志:
2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)
2014-02-16 14:29:53 [1267] [CRITICAL] WORKER TIMEOUT (pid:4994)
2014-02-16 14:29:53 [22140] [INFO] Booting worker with pid: 22140
我不断收到这样的错误,
2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:53 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
2014-02-16 14:29:57 [22140] [DEBUG] Ignoring EPIPE
Ignoring EPIPE
然后工人又开始工作,
2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [1267] [CRITICAL] WORKER TIMEOUT (pid:4993)
2014-02-16 14:32:44 [22276] [INFO] Booting worker with pid: 22276
再次忽略 EPIPE 错误,这种情况持续到我重新启动 gunicorn。当我收到此错误时,我从 nginx 收到 504 网关错误
答案1
要解决此问题,请增加 Nginx 中的超时标志,
在 Nginx 中增加proxy_connect_timeout
和proxy_read_timeout
,可以在 nginx.conf 文件下的http
指令中添加以下内容。它们默认为 60 秒。
代理连接超时300秒;
代理读取超时300秒;
重启 Nginx 服务器。参见nginx 超时文档。
如果上述修复不起作用,则在 Gunicorn 配置中增加 Gunicorn 超时标志,默认 Gunicorn 超时为 30 秒。
--超时 90
Gunicorn 有关超时的文档
-t INT, --timeout INT 30 静默超过此秒数的工作者将被杀死并重新启动。
通常设置为 30 秒。只有当您确定同步工作进程会产生影响时,才应将其设置得更高。对于非同步工作进程,这仅意味着工作进程仍在通信,并且不受处理单个请求所需的时间长度的限制。
希望这能解决这个问题。