如何解决 gunicorn 关键工人超时错误?

s.m*_*s.m 44 nginx gunicorn

我使用 nginx 和 gunicorn 在两台服务器上托管我的网站,

两台服务器具有相同版本的软件包并且网站已成功托管,

但是在我的其中一台服务器中,gunicorn 总是超时并且出现错误

[CRITICAL]Worker Timeout
Booting worker with pid
Worker cannot boot with pid
Run Code Online (Sandbox Code Playgroud)

在此之后,我在网页中收到 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
Run Code Online (Sandbox Code Playgroud)

我得到这样的连续错误,

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
Run Code Online (Sandbox Code Playgroud)

工人又开始工作,

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
Run Code Online (Sandbox Code Playgroud)

再次忽略 EPIPE 错误,这种情况一直持续到我重新启动 gunicorn。当我收到此错误时,我从 nginx 收到 504 网关错误

小智 43

要解决此问题,请在 Nginx 中增加超时标志,

在Nginx增加proxy_connect_timeoutproxy_read_timeout,你可以在nginx.conf文件中的http指令下添加以下内容。它们默认为 60 秒。

proxy_connect_timeout 300s;

proxy_read_timeout 300s;

重启 Nginx 服务器。请参阅有关超时的 nginx 文档

如果上述修复不起作用,则在 Gunicorn 配置中增加 Gunicorn 超时标志,默认 Gunicorn 超时为 30 秒。

--超时 90

关于超时的 Gunicorn 文档

-t INT, --timeout INT 30 工人沉默超过这么多秒被杀死并重新启动。

一般设置为三十秒。如果您确定对同步工作者的影响,则仅将此设置明显更高。对于非同步工作人员,这仅意味着工作进程仍在通信,并且与处理单个请求所需的时间长度无关。

关于工人超时的 Gunicorn 文档

希望这能解决它。

  • 在我整天寻找解决方案之后,这个解决方案救了我的命。如果您确实有一个运行时间超过 30 秒的进程(这是我的问题),那么这绝对是正确的解决方案。 (2认同)