Reverse proxy Nginx provoquant 504 Gateway Timeout
j'utilise Nginx comme mandataire inversé qui prend les requêtes puis fait un proxy_pass pour obtenir l'application web réelle à partir du serveur amont tournant sur le port 8001.
si je vais à mywebsite.com ou faire un wget, je reçois un délai de 504 passerelle après 60 secondes... Cependant, si je charge mon site web.com: 8001, l'application se charge comme prévu!
donc quelque chose empêche Nginx de communiquer avec le serveur amont.
tous cela a commencé après que ma société d'hébergement a réinitialisé la machine sur laquelle mes affaires tournaient, avant cela aucun problème que ce soit.
Voici mon bloc serveur 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;
}
}
et la sortie de mon journal d'erreurs 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"
5 réponses
peut probablement ajouter quelques lignes supplémentaires pour augmenter la période d'arrêt en amont. Les exemples ci-dessous fixent le délai à 300 secondes:
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
send_timeout 300;
augmenter le délai ne résoudra probablement pas votre problème puisque, comme vous le dites, le serveur Web cible répond très bien.
j'ai eu ce même problème et j'ai trouvé que ça avait à voir avec le fait de ne pas utiliser un keep-alive sur la connexion. Je ne peux pas vraiment répondre pourquoi c'est cela mais, en nettoyant l'en-tête de connexion j'ai résolu ce problème et la demande a été tout simplement mandatée:
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;
}
}
regardez ces billets qui l'expliquent en plus détail: nginx proche en amont de la connexion après la demande clarification de l'en-tête Keep-alive http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
si vous voulez augmenter ou ajouter la limite de temps à tous les sites, vous pouvez ajouter les lignes ci-dessous au fichier
nginx.conf
.
ajouter les lignes suivantes à la section http
du fichier /usr/local/etc/nginx/nginx.conf
ou /etc/nginx/nginx.conf
.
fastcgi_read_timeout 600;
proxy_read_timeout 600;
si les lignes ci-dessus n'existent pas dans le fichier conf
, alors ajoutez-les, sinon augmentez fastcgi_read_timeout
et proxy_read_timeout
pour vous assurer que Nginx et php-fpm n'ont pas de timeout.
pour augmenter la limite de temps pour un seul site, alors vous pouvez éditer dans 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;
}
et après avoir ajouté ces lignes dans nginx.conf
, n'oubliez pas de redémarrer nginx.
service php7-fpm reload
service nginx reload
ou, si vous utilisez un voiturier, tapez simplement valet restart
.
vous pouvez également faire face à cette situation si votre serveur amont utilise un nom de domaine, et son adresse IP change (par exemple: vos points en amont d'une charge élastique AWS Balance)
le problème est que nginx résoudra l'adresse IP une fois, et la gardera en cache pour les requêtes suivantes jusqu'à ce que la configuration soit rechargée.
vous pouvez dire à nginx d'utiliser un serveur de noms pour re-resolve le domaine une fois le cache entrée expire:
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;
}
docs sur proxy_pass expliquer pourquoi cette astuce fonctionne:
La valeur du paramètrepeut contenir des variables. Dans ce cas, si une adresse est spécifiée en tant que nom de domaine, le nom est recherché parmi les groupes de serveurs décrits, et, si pas trouvé, est déterminée à l'aide d'un solveur.
Bravo "Nginx avec dynamique amonts" (tenzer.dk) pour le détail explication, qui contient également quelques informations pertinentes sur une mise en garde approche concernant les URI transmis.
Avait le même problème. Il s'est avéré qu'il était causé par le suivi de connexion iptables sur le serveur amont. Après suppression de --state NEW, ESTABLISHED, RELATED from the firewall script et flushing with conntrack-F le problème a disparu.