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

时间:2014-06-27 13:45:11

标签: nginx reverse-proxy proxypass http-status-code-504

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

如果我去mywebsite.com或做一个wget,我会在60秒后获得504网关超时...但是,如果我加载mywebsite.com:8001,应用程序会按预期加载!

因此阻止Nginx与上游服务器进行通信。

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

这是我的虚拟服务器阻止:

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"

9 个答案:

答案 0 :(得分:125)

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

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

答案 1 :(得分:46)

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

我有同样的问题,我发现它与连接上不使用keep-alive有关。我实际上无法回答为什么会这样,但是,在清除连接头我解决了这个问题并且请求被代理就好了:

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 close upstream connection after request Keep-alive header clarification http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

答案 2 :(得分:9)

  

如果您想为所有网站增加或添加时间限制,则可以在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

答案 3 :(得分:3)

如果上游服务器使用域名,并且 其IP地址更改(例如:您的上游指向AWS Elastic Load 平衡器)

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

一旦缓存,您可以告诉nginx使用名称服务器来re-resolve域 条目过期:

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 with dynamic upstreams" (tenzer.dk)致敬,了解详细信息 说明,其中还包含有关此说明的一些相关信息 有关转发的URI的方法。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

user2540984,以及其他许多人指出,您可以尝试增加超时设置。我本人也遇到了与此类似的问题,并试图更改 /etc/nginx/nginx.conf 文件中的超时设置,几乎所有这些线程中的每个人都建议这样做。但是,这并没有帮助我。 NGINX的超时设置没有明显变化。经过数小时的搜索,我终于设法解决了问题。

解决方案位于this forum thread中,它的意思是您应该将超时设置放在 /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 中的超时更改没有任何作用,希望此答案对您有所帮助!

答案 6 :(得分:1)

就我而言,我重新启动php,一切正常。

答案 7 :(得分:0)

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

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

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

上下文在我的情况下,在Google Cloud上,反向代理NGINX放置在具有NAT网关的子网中。 NGINX实例正在通过NAT网关将请求重定向到与我们的后端API(上游)相关联的域。

This documentation from GCP将帮助您了解NAT与NGINX 504超时的关系。

答案 8 :(得分:0)

如果使用了nginx_ajp_module,尝试添加 ajp_read_timeout 10m; 在 nginx.conf 文件中。