I am using Nginx as a reverse proxy that takes requests then does a proxy_pass to get the actual web application from the upstream server running on port 8001.
If I go to mywebsite.com or do a wget, I get a 504 Gateway Timeout after 60 seconds... However, if I load mywebsite.com:8001, the application loads as expected!
So something is preventing Nginx from communicating with the upstream server.
All this started after my hosting company reset the machine my stuff was running on, prior to that no issues whatsoever.
Here's my vhosts server block:
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;
}
}
And the output from my Nginx error log:
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"
Add below lines to the
http
section of/usr/local/etc/nginx/nginx.conf
or/etc/nginx/nginx.conf
file.If the above lines doesn't exist in
conf
file then add them, otherwise increasefastcgi_read_timeout
andproxy_read_timeout
to make sure that nginx and php-fpm did not timeout.and after adding these lines in
nginx.conf
, then don't forget to restart nginx.or, if you're using valet then simply type
valet restart
.You can also face this situation if your upstream server uses a domain name, and its IP address changes (e.g.: your upstream points to an AWS Elastic Load Balancer)
The problem is that nginx will resolve the IP address once, and keep it cached for subsequent requests until the configuration is reloaded.
You can tell nginx to use a name server to re-resolve the domain once the cached entry expires:
The docs on proxy_pass explain why this trick works:
Kudos to "Nginx with dynamic upstreams" (tenzer.dk) for the detailed explanation, which also contains some relevant information on a caveat of this approach regarding forwarded URIs.
Had the same problem. Turned out it was caused by iptables connection tracking on the upstream server. After removing --state NEW,ESTABLISHED,RELATED from the firewall script and flushing with conntrack -F the problem was gone.
Probably can add a few more line to increase the timeout period to upstream. The examples below sets the timeout to 300 seconds :
Increasing the timeout will not likely solve your issue since, as you say, the actual target web server is responding just fine.
I had this same issue and I found it had to do with not using a keep-alive on the connection. I can't actually answer why this is but, in clearing the connection header I solved this issue and the request was proxied just fine:
Have a look at this posts which explains it in more detail: nginx close upstream connection after request Keep-alive header clarification http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive