J'utilise Nginx comme proxy inverse qui prend les demandes puis effectue un proxy_pass pour obtenir l'application Web réelle du serveur en amont fonctionnant sur le port 8001.
Si je vais sur mywebsite.com ou que je fais un wget, j'obtiens un délai d'expiration de la passerelle 504 après 60 secondes ... Cependant, si je charge mywebsite.com:8001, l'application se charge comme prévu!
Donc, quelque chose empêche Nginx de communiquer avec le serveur en amont.
Tout cela a commencé après que ma société d'hébergement a réinitialisé la machine sur laquelle mes affaires fonctionnaient, avant cela, aucun problème.
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 des 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"
nginx
reverse-proxy
proxypass
http-status-code-504
Dave Roma
la source
la source
Réponses:
Peut probablement ajouter quelques lignes supplémentaires pour augmenter le délai d'expiration vers l'amont. Les exemples ci-dessous définissent le délai d'expiration à 300 secondes:
la source
proxy_read_timeout
lors du débogage sur le backend. Merci!L'augmentation du délai d'expiration ne résoudra probablement pas votre problème car, comme vous le dites, le serveur Web cible réel répond très bien.
J'ai eu ce même problème et j'ai trouvé que cela avait à voir avec le fait de ne pas utiliser de keep-alive sur la connexion. Je ne peux pas vraiment répondre pourquoi mais, en effaçant l'en-tête de connexion, j'ai résolu ce problème et la demande a été envoyée par proxy très bien:
Jetez un œil à ces articles qui l'expliquent plus en détail: nginx ferme la connexion en amont après la demande Clarification de l'en-tête Keep-alive http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
la source
proxy_set_header Connection "";
lol, n'utilisez pas runclouduser2540984 , ainsi que beaucoup d'autres ont souligné que vous pouvez essayer d'augmenter vos paramètres de délai d'expiration. J'ai moi-même été confronté à un problème similaire à celui-ci et j'ai essayé de modifier mes paramètres de délai d'expiration dans le fichier /etc/nginx/nginx.conf , comme le suggèrent presque tout le monde dans ces threads. Cela ne m'a cependant pas aidé du tout; il n'y avait aucun changement apparent dans les paramètres de délai d'expiration de NGINX. Après de nombreuses heures de recherche, j'ai finalement réussi à résoudre mon problème.
La solution réside dans ce fil de discussion du forum , et ce qu'il dit, c'est que vous devez mettre vos paramètres de délai d'expiration dans /etc/nginx/conf.d/timeout.conf (et si ce fichier n'existe pas, vous devez le créer). J'ai utilisé les mêmes paramètres que ceux suggérés dans le fil:
Ce n'est peut-être pas la solution à votre problème particulier, mais si quelqu'un d'autre remarque que les changements de délai dans /etc/nginx/nginx.conf ne font rien, j'espère que cette réponse vous aidera!
la source
server{}
ou autre chose? Cette erreur survient juste après 5 minutes. Je recharge, redémarre et elle ne dépasse jamais ces 5 minutes ou 300 secondes. Y a-t-il d'autres idées à corriger ça?Ajoutez les lignes ci-dessous à la
http
section du fichier/usr/local/etc/nginx/nginx.conf
ou/etc/nginx/nginx.conf
.Si les lignes ci-dessus n'existent pas dans le
conf
fichier, ajoutez-les, sinon augmentezfastcgi_read_timeout
etproxy_read_timeout
assurez-vous que nginx et php-fpm n'ont pas expiré.et après avoir ajouté ces lignes
nginx.conf
, n'oubliez pas de redémarrer nginx.ou, si vous utilisez un valet, tapez simplement
valet restart
.la source
fastcgi_read_timeout 600;
proxy_read_timeout 600;
Vous pouvez également faire face à cette situation si votre serveur en amont utilise un nom de domaine et que son adresse IP change (par exemple: votre amont pointe vers un AWS Elastic Load Balancer)
Le problème est que nginx résoudra l'adresse IP une fois et la conservera en cache pour les demandes suivantes jusqu'à ce que la configuration soit rechargée.
Vous pouvez dire à nginx d'utiliser un serveur de noms pour résoudre à nouveau le domaine une fois que l'entrée mise en cache expire:
La documentation sur proxy_pass explique pourquoi cette astuce fonctionne:
Félicitations à "Nginx avec amont dynamique" (tenzer.dk) pour l'explication détaillée, qui contient également des informations pertinentes sur une mise en garde de cette approche concernant les URI transmis.
la source
Avait le même problème. Il s'est avéré que cela était dû au suivi de la connexion iptables sur le serveur en amont. Après la suppression
--state NEW,ESTABLISHED,RELATED
du script de pare-feu et le nettoyageconntrack -F
du problème, le problème a disparu.la source
NGINX lui-même n'est peut-être pas la cause première.
SI "les ports minimum par instance de VM" définis sur la passerelle NAT - qui se trouvent entre votre instance NGINX et la
proxy_pass
destination - sont trop petits pour le nombre de requêtes simultanées, il doit être augmenté.Solution: augmentez le nombre de ports disponibles par VM sur la passerelle NAT.
Contexte Dans mon cas, sur Google Cloud, un proxy inverse NGINX a été placé dans un sous-réseau, avec une passerelle NAT. L'instance NGINX redirigeait les demandes vers un domaine associé à notre API backend (en amont) via la passerelle NAT.
Cette documentation de GCP vous aidera à comprendre comment NAT est pertinent pour le délai d'expiration du NGINX 504.
la source
Dans mon cas, je redémarre php pour et cela devient ok.
la source