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


127

我将Nginx用作接收请求的反向代理,然后执行proxy_pass以从端口8001上运行的上游服务器获取实际的Web应用程序。

如果我访问mywebsite.com或执行wget,则60秒后会收到504网关超时...但是,如果加载mywebsite.com:8001,则应用程序将按预期加载!

因此,有些事情阻止了Nginx与上游服务器进行通信。

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

这是我的vhosts服务器块:

server {
    listen   80;
    server_name mywebsite.com;

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

    access_log /home/user/public_html/mywebsite.com/log/access.log upstreamlog;
    error_log /home/user/public_html/mywebsite.com/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.com, request: "GET / HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8001/", host: "mywebsite.com"

服务器正在运行SELinux吗?
CrackerJack9

在我的案例中,NAT网关是问题所在,而不是NGINX或后端API。stackoverflow.com/a/62351959/9956279
Sushilinux

Answers:


152

可能可以增加几行以增加到上游的超时时间。下面的示例将超时设置为300秒:

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

5
我认为,除非您知道您的网络/服务将始终或在某些情况下响应非常缓慢,否则增加超时很少是答案。如今,除非您要下载内容(文件/图像),否则很少有Web请求应该花费几秒钟的时间
Almund

@Almund我也想过同样的事情(几乎没有去尝试这个问题),但是无论出于什么原因,这都对我有用。(以前在60秒后超时,现在立即获得响应)。
达克斯·弗尔

@Dax Fohl:很好奇。我拉下源代码并进行了快速浏览,从我所看到的来看,设置除proxy_pass之外的任何proxy_设置都会初始化一堆设置,我认为这将以不同的方式运行代理,因此也许设置任何东西都可以得到相同的效果行为。
Almund

对于使用nodejs服务器的问题,我没有解决问题
vpx

3
我发现proxy_read_timeout在后端调试时只需要使用。谢谢!
杰夫·普基特

79

如您所说,增加超时可能不会解决您的问题,因为正如您所说,实际的目标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关闭上游连接 Keep-alive标头说明 http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive


7
由单行proxy_set_header Connection "";大声笑出来的问题的大声笑,不要使用runcloud
nodws

21

user2540984以及许多其他工具指出,您可以尝试增加超时设置。我自己也遇到了与此类似的问题,并试图更改/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中的超时更改没有任何作用,希望此答案对您有所帮助!


嗨,在我的config.d目录中没有timeout.conf。您说过创建它,我想确认一下,只是在timeout.conf中添加以上设置?
tktktk0711

是的,只需添加它们。您可以根据自己的需要修改它们,但是这些对我有用!
AndreasForslöw,

不幸的是,在带有ubuntu和Nginx的Laravel宅基地中,这不起作用。:(您是说只添加这些行吗?没有server{}其他内容?此错误在5分钟后出现。我重新加载,重新启动,但从不超过5分钟或300秒就无法解决。还有更多的想法要解决吗?它吗
Pathros

15

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

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

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


1
谢谢你的工作:fastcgi_read_timeout 600; proxy_read_timeout 600;
亚历杭德罗

13

如果您的上游服务器使用域名,并且其IP地址发生更改,您也可能会遇到这种情况(例如:您的上游指向AWS Elastic Load Balancer)

问题在于,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;
}

proxy_pass上的文档解释了此技巧为何起作用:

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

对于“带动态上游Nginx的Nginx”(tenzer.dk)的详细说明表示敬意,其中还包含有关此方法有关转发URI的警告的一些相关信息。


1
这个答案是金子,正是我发生的一切。上游指向awb elb,并且所有网关突然超时。
内森(Nathan Do)

2

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


0

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

如果在NAT网关(位于NGINX实例与proxy_pass目标之间)上设置的“每个VM实例的最小端口数” 对于并发请求数而言太小,则必须增加它。

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

背景信息就我而言,在Google Cloud上,反向代理NGINX放置在子网中,并带有NAT网关。NGINX实例正在通过NAT网关将请求重定向到与我们的后端API(上游)关联的域。

GCP的这份文档将帮助您了解NAT与NGINX 504超时的关系。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.