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"
63
demandé sur Daniel Serodio 2014-06-27 17:45:10

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;
106
répondu user2540984 2014-12-11 10:36:18

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

32
répondu Almund 2017-05-23 12:34:33

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 .

4
répondu Adeel 2018-05-06 15:48:02

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ètre

peut 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.

1
répondu el.atomo 2018-09-13 10:03:11

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.

0
répondu mindlab 2018-08-19 21:50:48