web-dev-qa-db-fra.com

NGINX: dépassement du délai d'attente en amont (110: dépassement du délai de connexion) lors de la lecture de l'en-tête de réponse depuis le sens amont

Puma est le serveur d'applications en amont et Riak, mon cluster de base de données d'arrière-plan. Lorsque j'envoie une demande qui mappe-réduit un bloc de données pour environ 25 000 utilisateurs et le renvoie de Riak à l'application, un message d'erreur s'affiche dans le journal Nginx:

le délai d'attente en amont a expiré (110: la connexion a expiré) lors de la lecture en-tête de réponse en amont

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

Le délai d’expiration de Nginx survient une fois le proxy installé. 

**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 a un tas 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....

78
user2768537

Vous devez toujours vous abstenir d'augmenter les délais d'attente. Je doute que le temps de réponse de votre serveur principal soit le problème ici en tout cas.

J'ai contourné ce problème en effaçant l'indicateur de connexion persistante et en spécifiant la version http comme indiqué ci-dessous: 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 réussi à le déchiffrer à partir de la documentation mentionnée dans la réponse associée, donc si quelqu'un a une explication, je serais très intéressé de l'entendre.

18
Almund

Cela est dû au fait que votre amont prend trop de temps pour répondre à la demande et que NGINX pense que le traitement en amont a déjà échoué dans le traitement de la demande et qu'il répond donc par une erreur . Il suffit d'inclure et d'augmenter proxy_read_timeout à l'emplacement . La même chose m'est arrivée et j'ai utilisé 1 heure de timeout pour une application interne au travail:

proxy_read_timeout 3600;

Avec cela, NGINX attendra une heure que son amont retourne quelque chose.

14
Sergio Gonzalez

Commencez par identifier le processus en amont qui ralentit en consultant le fichier .jn du journal des erreurs nginx et ajustez le délai 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"

Donc, je dois ajuster le fastcgi_read_timeout dans la configuration de mon serveur

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

Voir: original post

13

Je pense que cette erreur peut se produire pour diverses raisons, mais elle peut être spécifique au module que vous utilisez. Par exemple, j'ai vu cela en utilisant le module uwsgi, donc je devais définir "uwsgi_read_timeout".

8
Richard

Dans votre cas, cela aide un peu d'optimisation dans le proxy, ou vous pouvez utiliser "# paramètres de délai"

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;
}
7
Dimitrios

Je recommanderais d’examiner les error_logs, en particulier la partie en amont, qui indique que le temps écoulé en amont est dépassé.

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

Assurez-vous également que votre configuration est chargée.

Plus de détails ici Nginx en amont expiré (pourquoi et comment y remédier)

6
gansbrest

Comme de nombreux autres l’ont souligné, augmenter les paramètres de délai d’expiration de NGINX peut résoudre votre problème. 

Toutefois, augmenter vos paramètres de délai d'attente n'est peut-être pas aussi simple que le suggèrent nombre de ces réponses. J'ai moi-même fait face à ce problème et essayé de modifier mes paramètres de délai d'attente dans le fichier /etc/nginx/nginx.conf, comme le suggèrent presque tous les utilisateurs de ces discussions. Cela ne m'a pas aidé un peu; il n'y avait aucun changement apparent dans les paramètres de délai d'attente de NGINX. Maintenant, plusieurs heures plus tard, j'ai finalement réussi à résoudre ce problème.

La solution réside dans ce fil de discussion , et il indique que vous devez définir vos paramètres de délai d'attente dans /etc/nginx/conf.d/timeout.conf (et si ce fichier n'existe pas, vous devriez le créer). J'ai utilisé les mêmes paramètres que ceux suggérés dans le fil de discussion:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
0
Andreas Forslöw

De notre côté, il utilisait spdy avec cache de proxy. Lorsque le cache expire, nous obtenons cette erreur jusqu'à ce que le cache soit mis à jour.

0
timhaak

Espérons que cela aide quelqu'un: J'ai rencontré cette erreur et la cause en était une mauvaise autorisation sur le dossier de connexion de phpfpm, après l'avoir modifiée pour que phpfpm puisse y écrire, tout allait bien.

0
Maurício Otta

J'ai eu le même problème et il en a résulté une erreur "tous les jours" dans le contrôleur Rails. Je ne sais pas pourquoi, mais en production, puma répète l'erreur encore et encore, provoquant le message:

expiration de la connexion montante (110: connexion expirée) lors de la lecture de l'en-tête de la réponse depuis l'amont

Probablement parce que Nginx essaie d’obtenir les données de puma encore et encore. La chose amusante est que l’erreur a causé le message de dépassement de délai même si j’appelle une action différente dans le contrôleur, une seule faute de frappe bloque toute l’application. 

Vérifiez votre fichier log/puma.stderr.log pour voir si tel est le cas. 

0
aarkerio