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

Dav*_*oma 103 reverse-proxy nginx proxypass http-status-code-504

我使用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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

我的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"
Run Code Online (Sandbox Code Playgroud)

小智 136

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

proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;
Run Code Online (Sandbox Code Playgroud)

  • 我们具体应该在哪里添加这些行? (7认同)
  • 我发现在后端调试时我只需要 `proxy_read_timeout`。谢谢! (5认同)
  • 我认为增加超时很少是答案,除非你知道你的网络/服务将永远或在某些情况下响应非常缓慢.除非您下载内容(文件/图像),否则现在很少有网络请求需要几秒钟的时间 (3认同)

Alm*_*und 62

增加超时可能无法解决您的问题,因为正如您所说,实际目标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;
    }
}
Run Code Online (Sandbox Code Playgroud)

看一下这篇文章,它更详细地解释了它: nginx关闭上游连接后请求 保持活动标题澄清 http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

  • 这次真是万分感谢。这是为什么 HTTP 1.1 是必要的官方解释。默认情况下,NGINX 使用 HTTP/1.0 连接到上游服务器,并相应地将 Connection: close 标头添加到转发到服务器的请求中。结果是,尽管上游{}块中存在 keepalive 指令,但每个连接都会在请求完成时关闭。来源:https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives (6认同)
  • 单个行`proxy_set_header Connection'"解决问题的几个月;`lol,不要使用runcloud (5认同)

Ade*_*eel 12

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

下面添加行的http部分/usr/local/etc/nginx/nginx.conf/etc/nginx/nginx.conf文件.

fastcgi_read_timeout 600;
proxy_read_timeout 600;
Run Code Online (Sandbox Code Playgroud)

如果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; 
}
Run Code Online (Sandbox Code Playgroud)

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

service php7-fpm reload 
service nginx reload
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用的是代客,那么只需输入即可valet restart.


And*_*löw 12

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;
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,在带有 ubuntu 和 Nginx 的 Laravel homestead 中,这不起作用。:( 你的意思是只添加这些行吗?没有 `server{}` 或者其他东西?这个错误在 5 分钟后出现。我重新加载、重新启动,但它永远不会超过 5 分钟或 300 秒。是还有更多的想法来解决它吗? (2认同)

el.*_*omo 7

如果您的上游服务器使用域名,并且其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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这个答案很金,正是发生在我身上的事情。上游指向 aws elb 并且网关突然超时。 (5认同)

Jef*_*ang 5

nginx

proxy_read_timeout          300;
Run Code Online (Sandbox Code Playgroud)

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