nginx errore 499

fare il debug del timeout di nginx idenditificato dal codice di stato 499 (Client Closed Request)

Il codice di stato HTTP 499 è stato inserito da nginx

per identificare quando il "client" chiude la connessione, dopo aver atteso la risposta che non è arrivata entro il tempo di timeout (in genere di default 60 secondi). Ciò accade specialmente quando viene richiesto un report o foglio dati che deve essere generato realtime dal backend.

 

In una infrastruttra del genere chi è il client e come faccio ad identificare il collo di bottiglia:

 

browser ···> varnish (cache server; porta: 80) -> nginx (webserver; porta: 81) -> zope (backend; porta 8080)

 

Prima di tutto modifico il file di log di nginx per avere ulteriori informazioni sui tempi della richiesta:

server {
   ...
   log_format custom '$remote_addr - $remote_user [$time_local]  '
                     '"$request" $status $body_bytes_sent '
                     'request: $request_time upstream: $upstream_response_time '
                     '"$http_referer" "$http_user_agent"';

   access_log      /var/log/nginx/domain.access.log custom;
   ...
}

 in questo modo nell'access log di nginx verranno visualizzate le sguenti informazioni aggiuntive:

127.0.0.1 - ... HTTP/1.1" 200 1459991 request: 93.230 upstream: 93.230 "http:// ...

 

Adesso escludiamo varnish dall'insieme, in modo da ridurre i componenti coninvolti, inviando la richiesta direttamente ad nginx:

http://dominio.tld:81/request

 

L'errore persiste, pertanto in questo caso il "client" è proprio nginx, che chiude la connessione prima che il backend abbia il tempo d'inviare la risposta. Tant'è vero che l'errore 499 viene restituito ad una richiesta inoltrata da 127.0.0.1 .

Quindi incrementiamo nel Virtual Host di nginx il tempo d'attesa della risposta dal backend:

server {
   ...
   location ^~ /request {
      ...
      proxy_read_timeout 120s;
      proxy_pass http://127.0.0.1:8080;
   }
   ...
}

 

Probabilmente adesso sarà varnish ad andare ancora in timeout ("Guru Meditation

"), pertanto dovrà essere modificato anche il file di configurazione di varnish:

backend backend_0 {
        .host = "127.0.0.1";
        .port = "81";
        .first_byte_timeout = 120s;
}
...

Share this on

Share |

On same topics

Commenti

comments powered by Disqus