191 votes

NGINX : upstream timed out (110 : Connection timed out) lors de la lecture de l'en-tête de réponse depuis upstream

J'ai Puma comme serveur d'applications en amont et Riak comme cluster de base de données. Lorsque j'envoie une requête qui réduit un morceau de données pour environ 25 000 utilisateurs et le renvoie de Riak vers l'application, j'obtiens une erreur dans le journal de Nginx :

upstream timed out (110 : Connection timed out) lors de la lecture du l'en-tête de réponse de l'amont

Si j'interroge mon amont directement sans proxy nginx, avec la même requête, j'obtiens les données requises.

Le délai d'attente de Nginx se produit une fois que le proxy est mis en place.

**nginx.conf**

http {
    keepalive_timeout 10m;
    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    include /etc/nginx/sites-enabled/*.conf;
}

**virtual host conf**

upstream ss_api {
  server 127.0.0.1:3000 max_fails=0  fail_timeout=600;
}

server {
  listen 81;
  server_name xxxxx.com; # change to match your URL

  location / {
    # match the name of upstream directive which is defined above
    proxy_pass http://ss_api; 
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache cloud;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_cache_bypass $http_authorization;
    proxy_cache_bypass http://ss_api/account/;
    add_header X-Cache-Status $upstream_cache_status;
  }
}

Nginx dispose d'un grand nombre de directives de délai d'attente. Je ne sais pas si je manque quelque chose d'important. Toute aide serait très appréciée....

91voto

Sergio Gonzalez Points 366

Cela se produit parce que votre amont prend trop de temps pour répondre à la demande et NGINX pense que l'amont a déjà échoué dans le traitement de la demande, il répond donc avec une erreur. Il suffit d'inclure et d'augmenter proxy_read_timeout dans location bloc de configuration. La même chose m'est arrivée et j'ai utilisé un délai d'une heure pour une application interne au travail :

proxy_read_timeout 3600;

Avec cela, NGINX attendra pendant une heure (3600s) que son amont retourne quelque chose.

58voto

Almund Points 1351

Vous devriez toujours vous abstenir d'augmenter les délais d'attente, je doute que le temps de réponse de votre serveur dorsal soit le problème dans tous les cas.

J'ai contourné ce problème en désactivant l'indicateur de connexion keep-alive et en spécifiant la version http comme indiqué dans la réponse ici : https://stackoverflow.com/a/36589120/479632

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;

        # these two lines here
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://localhost:5000;
    }
}

Malheureusement, je ne peux pas expliquer pourquoi cela fonctionne et je n'ai pas non plus réussi à le déchiffrer dans les documents mentionnés dans la réponse liée. Si quelqu'un a une explication, je serais très intéressé de l'entendre.

51voto

Commencez par déterminer quel amont ralentit en consultant le journal des erreurs de nginx. et ajustez le temps de lecture en conséquence dans mon cas, c'était fastCGI

2017/09/27 13:34:03 [error] 16559#16559: *14381 upstream timed out (110: Connection timed out) while reading response header from upstream, client:xxxxxxxxxxxxxxxxxxxxxxxxx", upstream: "fastcgi://unix:/var/run/php/php5.6-fpm.sock", host: "xxxxxxxxxxxxxxx", referrer: "xxxxxxxxxxxxxxxxxxxx"

Je dois donc ajuster le fastcgi_read_timeout dans la configuration de mon serveur.

 location ~ \.php$ {
     fastcgi_read_timeout 240;
     ...
 }

Voir : poste original

19voto

Dimitrios Points 21

Dans votre cas, cela aide un peu à optimiser le proxy, ou vous pouvez utiliser "# time out settings".

location / 
{        

  # time out settings
  proxy_connect_timeout 159s;
  proxy_send_timeout   600;
  proxy_read_timeout   600;
  proxy_buffer_size    64k;
  proxy_buffers     16 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_pass_header Set-Cookie;
  proxy_redirect     off;
  proxy_hide_header  Vary;
  proxy_set_header   Accept-Encoding '';
  proxy_ignore_headers Cache-Control Expires;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Host   $host;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

16voto

tleding Points 11

Je vous recommande de regarder les error_logs et plus particulièrement à la en amont la partie où il montre l'amont spécifique qui est en retard.

Ensuite, en fonction de cela, vous pouvez ajuster proxy_read_timeout , fastcgi_read_timeout o uwsgi_read_timeout .

Vérifiez également que votre configuration est chargée.

Plus de détails ici Nginx upstream timed out (pourquoi et comment le réparer)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X