我使用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"
答案 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_timeout
和proxy_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 文件中。