响应时间太长而无法回复时,nginx代理会导致错误

时间:2018-02-07 09:04:26

标签: django nginx gunicorn

我有一个nginx配置,重定向到Django休息服务(通过gunicorn)。

一切正常,但当响应太大(响应时间超过30秒)时,我收到503服务不可用错误。 我确信这是因为这个问题,因为它在其他请求上正常工作,并且仅在响应太大(并从第三方api获取请求)的特定请求上花费太长时间。

以下是我的nginx配置:

server {
listen       www.server.com:80;
server_name www.server.com;

client_max_body_size 200M;
 keepalive_timeout 300;

location /server/ {
    proxy_pass http://127.0.0.1:8000/;
    proxy_connect_timeout 120s;
    proxy_read_timeout 300s;
    client_max_body_size 200M;
}

 location / {
    root   /var/www/html;
    index  index.html index.htm;
}
}

我确信这个问题来自Nginx而不是枪炮,因为如果我从机器内部卷曲,我会得到回复。

谢谢,

2 个答案:

答案 0 :(得分:3)

您确实指定了proxy_connect_timeoutproxy_read_timeout,但从未指定proxy_send_timeout。 (TBH,我认为您不需要修改connect(2)的超时,因为该调用只是建立了TCP连接,并且不依赖于单个页面的大小或时间;但是其他两个看起来像一场公平的比赛。)

此外,根据https://stackoverflow.com/a/48614613/1122270,另一个考虑可能是proxy_http_version - 您的curl可能正在使用HTTP/1.1,而nginx默认会HTTP/1.0,并且你的后端可能会有不同的行为。

答案 1 :(得分:1)

当你跑到

以下时
$ gunicorn --help | grep -A2 -i time
  --graceful-timeout INT
                        Timeout for graceful workers restart. [30]
  --do-handshake-on-connect
                        Whether to perform SSL handshake on socket connect
--
  -t INT, --timeout INT
                        Workers silent for more than this many seconds are
                        killed and restarted. [30]

所以我假设超时发生在gunicorn而非nginx。因此,您不仅需要在nginx端增加超时,还需要gunicorn

您可以添加

timeout=180

到您的config.py文件,或者您可以在启动gunicorn时将其添加到命令行

gunicorn -t 180 ......