我有一个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而不是枪炮,因为如果我从机器内部卷曲,我会得到回复。
谢谢,
答案 0 :(得分:3)
您确实指定了proxy_connect_timeout
和proxy_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 ......