NGINX: upstream scaduto (110: connessione scaduta) durante la lettura dell'intestazione della risposta dall'upstream


130

Ho Puma in esecuzione come server di app upstream e Riak come cluster db in background. Quando invio una richiesta che riduce la mappa di un blocco di dati per circa 25.000 utenti e lo restituisce da Riak all'app, ricevo un errore nel registro di Nginx:

upstream scaduto (110: connessione scaduta) durante la lettura dell'intestazione della risposta dall'upstream

Se interrogo il mio upstream direttamente senza proxy nginx, con la stessa richiesta, ottengo i dati richiesti.

Il timeout di Nginx si verifica una volta inserito il proxy.

**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 ha un sacco di direttive di timeout. Non so se mi sto perdendo qualcosa di importante. Qualsiasi aiuto sarebbe molto apprezzato ....


Dovrebbe scadere solo dopo 600 secondi vero? Puoi simulare il tempo impostando un server tcp su 127.0.0.1:3000 che accetta solo le connessioni e non fa nulla con esse, per vedere quanto tempo ci vuole. Dovrebbero essere 600s ...
Rogerdpack

Risposte:


47

Ciò accade perché l'upstream impiega troppo tempo per rispondere alla richiesta e NGINX pensa che l'upstream non sia già riuscito nell'elaborazione della richiesta, quindi risponde con un errore. Basta includere e aumentare proxy_read_timeout nel locationblocco di configurazione. La stessa cosa è successa a me e ho utilizzato 1 ora di timeout per un'app interna al lavoro:

proxy_read_timeout 3600;

Con questo, NGINX attenderà un'ora (3600s) affinché il suo upstream restituisca qualcosa.


6
Nota che avere proxy_read_timeoutnella sezione http potrebbe non aiutare. Ho la proxy_passdirettiva nella sezione posizione e solo lì l' proxy_read_timeoutimpostazione ha fatto la differenza. (nginx 1.16.0)
JonnyJD,

Sembra funzionare in http / server / location per me ... forse le cose sono cambiate :)
rogerdpack

39

Dovresti sempre evitare di aumentare i timeout, dubito che il tuo tempo di risposta del server di backend sia il problema qui in ogni caso.

Ho aggirato questo problema cancellando il flag di mantenimento della connessione e specificando la versione http come da risposta qui: 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;
    }
}

Sfortunatamente non riesco a spiegare perché funziona e non sono riuscito a decifrarlo dai documenti menzionati nella risposta collegata, quindi se qualcuno ha una spiegazione sarei molto interessato a ascoltarla.


1
Perché non dovreste modificare il proxy_read_timeoutse sapete che il proxy (anche per un URL specifico) richiede più tempo di elaborazione?
Josh M.

Ciao! Non ricordo più il problema esatto, ma penso che non fosse correlato al tempo effettivo per l'URL, ma piuttosto che il timeout non veniva elaborato correttamente senza queste impostazioni.
Almund

@magicbacon questo è stato anni fa, quindi ricordo a malapena il caso, ma hai cambiato il $http_hostdiritto? Immagino che non volerebbe per https. Potrebbero essere necessarie impostazioni aggiuntive anche per l'invio di richieste https.
Almund

+1 ... questo sembra un trucco imbarazzante ma in realtà proviene dai documenti ufficiali :) nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive Ho un problema leggermente diverso "connessione chiusa prematuramente a monte durante la lettura della risposta header from upstream "quando uso la direttiva upstream con keepalive e l'utilizzo di queste due righe sembra risolverlo.
Karussell

1
@TimDavis vedo, forse è meglio. Immagino che potrebbe dipendere dal traffico, come in questo post che dice che è richiesto per WebSocket: serverlab.ca/tutorials/linux/web-servers-linux/…
Almund

26

Per prima cosa scopri quale upstream sta rallentando consultando il file di log degli errori nginx e regola il timeout di lettura di conseguenza nel mio caso è stato 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"

Quindi devo regolare fastcgi_read_timeout nella configurazione del mio server

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

Vedi: post originale


Ecco un modo per aggiungere informazioni di temporizzazione la mancata vedere quanto si "bisogno" di aumentare a: stackoverflow.com/questions/18627469/... FWIW
rogerdpack

10

Nel tuo caso aiuta un po 'di ottimizzazione nel proxy, oppure puoi utilizzare "# impostazioni di timeout"

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

Per me fa la differenza avere queste impostazioni nella sezione posizione . Averli nella sezione http non ha aiutato (forse perché avevo anche proxy_passnella sezione posizione .
JonnyJD

Cosa stai ottimizzando esattamente con queste dichiarazioni?
Vlad

9

Penso che questo errore possa verificarsi per vari motivi, ma può essere specifico per il modulo che stai utilizzando. Per esempio l'ho visto usando il modulo uwsgi, quindi ho dovuto impostare "uwsgi_read_timeout".


2
Penso che uwsgi_read_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; per me va bene.
tyan

9

Consiglierei di guardare error_logs, in particolare a monte parte a dove mostra uno specifico a monte che è scaduto.

Quindi in base a ciò puoi regolare proxy_read_timeout, fastcgi_read_timeoutouwsgi_read_timeout .

Assicurati anche che la tua configurazione sia caricata.

Maggiori dettagli qui Timeout upstream di Nginx (perché e come risolvere)


4

Come molti altri hanno sottolineato qui, aumentare le impostazioni di timeout per NGINX può risolvere il tuo problema.

Tuttavia, aumentare le impostazioni di timeout potrebbe non essere così semplice come suggeriscono molte di queste risposte. Io stesso ho affrontato questo problema e ho provato a modificare le mie impostazioni di timeout in /etc/nginx/nginx.conf file , come suggeriscono quasi tutti in questi thread. Questo non mi ha aiutato neanche un po '; non ci sono stati cambiamenti apparenti nelle impostazioni di timeout di NGINX. Ora, molte ore dopo, sono finalmente riuscito a risolvere questo problema.

La soluzione sta in questo thread del forum , e quello che dice è che dovresti mettere le tue impostazioni di timeout in /etc/nginx/conf.d/timeout.conf (e se questo file non esiste, dovresti crearlo). Ho usato le stesse impostazioni suggerite nel thread:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

1

Ho avuto lo stesso problema e il risultato è stato un errore "quotidiano" nel controller dei binari. Non so perché, ma in produzione, puma esegue l'errore ancora e ancora causando il messaggio:

upstream scaduto (110: connessione scaduta) durante la lettura dell'intestazione della risposta dall'upstream

Probabilmente perché Nginx cerca di ottenere i dati da puma ancora e ancora. La cosa divertente è che l'errore ha causato il messaggio di timeout anche se sto chiamando un'azione diversa nel controller, quindi un singolo errore di battitura blocca tutta l'app.

Controlla il tuo file log / puma.stderr.log per vedere se questa è la situazione.


0

Da parte nostra stava usando spdy con cache proxy. Quando la cache scade, otteniamo questo errore finché la cache non è stata aggiornata.


0

Spero che aiuti qualcuno: mi sono imbattuto in questo errore e la causa era un'autorizzazione sbagliata sulla cartella dei log per phpfpm, dopo averla modificata in modo che phpfpm potesse scriverci, tutto andava bene.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.