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....
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.
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.
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
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".
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;
}
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)
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;
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.
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.
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.