Nginx反向代理导致504网关超时

我使用nginx作为反向代理,它接受请求,然后执行代理_传递,以从运行在端口8001上的上游服务器获取实际的Web应用程序。

如果我转到mywebsite.example或执行wget,我会在60秒后收到504网关超时..但是,如果我加载mywebsite.example:8001,应用程序将按预期加载。

所以有些东西阻止了Nginx与上游服务器的通信。

这一切都是在我的托管公司重置了我的东西运行的机器之后开始的,在此之前没有任何问题。

以下是我的vHosts服务器块:

server {
listen   80;
server_name mywebsite.example;


root /home/user/public_html/mywebsite.example/public;


access_log /home/user/public_html/mywebsite.example/log/access.log upstreamlog;
error_log /home/user/public_html/mywebsite.example/log/error.log;


location / {
proxy_pass http://xxx.xxx.xxx.xxx:8001;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

以及我的Nginx错误日志的输出:

2014/06/27 13:10:58 [error] 31406#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: xxx.xx.xxx.xxx, server: mywebsite.example, request: "GET / HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8001/", host: "mywebsite.example"
327650 次浏览

可能可以添加更多的行以增加上游的超时时间。以下示例将超时设置为300秒:

proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;

增加超时不太可能解决您的问题,因为正如您所说,实际的目标Web服务器响应良好。

我也遇到了同样的问题,我发现这与没有在连接上使用保持连接有关。我无法回答为什么会这样,但在清除连接头时,我解决了这个问题,请求被代理得很好:

server {
location / {
proxy_set_header   X-Real-IP $remote_addr;
proxy_set_header   Host      $http_host;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://localhost:5000;
}
}
看看

这个帖子,它更详细地解释了它: Nginx请求后关闭上游连接 保活标头说明 http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

如果要增加或添加所有站点的时间限制,则可以在nginx.conf文件中添加以下行。

将以下行添加到/usr/local/etc/nginx/nginx.conf/etc/nginx/nginx.conf文件的http部分。

fastcgi_read_timeout 600;
proxy_read_timeout 600;

如果conf文件中不存在上述行,则添加它们,否则增加fastcgi_read_timeoutproxy_read_timeout,以确保nginx和PHP-FPM没有超时。

要仅增加一个站点的时间限制,您可以在Vim中编辑/etc/nginx/sites-available/example.com

location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass  unix:/var/run/php5-fpm.sock;
fastcgi_read_timeout 300;
}

nginx.conf中添加这些行之后,不要忘记重新启动nginx.

service php7-fpm reload
service nginx reload

或者,如果您使用的是代客泊车服务,则只需键入valet restart

有同样的问题。原来这是由上游服务器上的iptables连接跟踪引起的。从防火墙脚本中删除--state NEW,ESTABLISHED,RELATED并使用conntrack -F进行刷新后,问题消失。

如果您的上游服务器使用域名,并且 其IP地址发生变化(例如:您的上游指向AWS弹性负载 平衡器)

问题是nginx将解析IP地址一次,并将其缓存 用于后续请求,直到重新加载配置。

你可以告诉nginx使用一个名称服务器来重新解决域名,一旦缓存。 条目过期时间:

location /mylocation {
# use google dns to resolve host after IP cached expires
resolver 8.8.8.8;
set $upstream_endpoint http://your.backend.server/;
proxy_pass $upstream_endpoint;
}

代理_通过上的文档解释了此技巧有效的原因:

参数值可以包含变量。在这种情况下,如果指定了地址 作为域名,在所描述的服务器组中搜索该名称, 如果未找到,则使用解析器确定。

感谢“具有动态上游的Nginx ”(tenzer.DK)提供的详细信息 解释,其中还包含一些关于这一警告的相关信息 关于转发URI

的方法。

用户2540984,以及许多其他人已经指出,您可以尝试增加您的超时设置。我自己也遇到了类似的问题,并尝试在/etc/nginx/nginx.conf文件中更改我的超时设置,就像这些帖子中几乎所有人建议的那样。然而,这对我一点帮助都没有。Nginx的超时设置没有明显变化。经过几个小时的搜索,我终于设法解决了我的问题。

解决方案位于这个论坛的主题中,它表示您应该将超时设置放在/etc/nginx/conf.d/timeout.conf中(如果此文件不存在,您应该创建它)。我使用了线程中建议的相同设置:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

这可能不是您的特定问题的解决方案,但如果其他人注意到/etc/nginx/nginx.conf中的超时更改没有任何作用,我希望这个答案对您有所帮助!

Nginx本身可能不是根本原因。

如果每个VM实例的最少端口数在NAT网关上设置--站在你的Nginx实例和proxy_pass目标--对于并发请求数来说太小,必须增加它。

解决方案:增加NAT网关上每个虚拟机的可用端口数。

上下文在我的例子中,在Google Cloud上,一个反向代理Nginx被放置在一个子网中,带有一个NAT网关。Nginx实例通过NAT网关将请求重定向到与我们的后端API(上游)关联的域。

来自GCP的此文档将帮助您了解NAT如何与Nginx 504超时相关。

在我的例子中,我重新启动PHP,它就可以了。

如果使用的是nginx_AJP_模块,请尝试添加 ajp_read_timeout 10m; 在nginx.conf文件中.

Nginx

proxy_read_timeout          300;

在我使用AWS的情况下,我还编辑了负载平衡设置。 属性=>;空闲超时