una risposta a monte è bufferizzata in un file temporaneo


62

Ho una piuttosto grande e lento (dati complessi, frontend complesso) costruire applicazioni web in RoRe servito da Pumacon nginxcome proxy inverso. Guardando il nginxregistro degli errori, vedo alcune voci come:

2014/04/08 09:46:08 [warn] 20058#0: *819237 an upstream response is buffered to a temporary file 
    /var/lib/nginx/proxy/8/47/0000038478 while reading upstream, 
    client: 5.144.169.242, server: engagement-console.foo.it, 
    request: "GET /elements/pending?customer_id=2&page=2 HTTP/1.0", 
    upstream: "http://unix:///home/deployer/apps/conversationflow/shared/sockets/puma.sock:/elements/pending?customer_id=2&page=2", 
    host: "ec.reputationmonitor.it", 
    referrer: "http://ec.foo.it/elements/pending?customer_id=2&page=3"

Sono piuttosto curioso in quanto è molto improbabile che la pagina rimanga la stessa per utenti diversi e interazioni utente diverse, e non penserei che il buffering della risposta su disco sia necessario / utile.

Conosco proxy_max_temp_file_sizee lo setto su 0, ma mi sembra un po 'imbarazzante (il mio proxy cerca di bufferizzare ma non ha file dove bufferizzare ... come può essere più veloce?).

Le mie domande sono:

  1. Come posso rimuovere [avvisa] ed evitare risposte di buffering? È meglio disattivare proxy_bufferingo impostare proxy_max_temp_file_sizesu 0? Perché?

  2. Se nginxbufferizza una risposta: quando serve la risposta bufferizzata, a chi e perché?

  3. Perché nginxsi proxy_bufferingattiva per impostazione predefinita e quindi [avvisa] se in realtà respinge una risposta?

  4. Quando una risposta attiva questa opzione? Quando ci vogliono> alcuni secondi (quanti?) Per servire la risposta? È configurabile?

TIA, ngw.


1
Ho la sensazione che stai confondendo il buffering con la memorizzazione nella cache. Il buffering è la procedura che consente di caricare più dati di quelli consentiti dall'allocazione di memoria.
Slavo

Risposte:


75

1) Come posso rimuovere [avvisa] ed evitare risposte di buffering? È meglio disattivare proxy_buffering o impostare proxy_max_temp_file_size su 0? Perché?

È necessario impostare proxy_max_temp_file_sizesu 0 per rimuoverlo. La proxy_bufferingdirettiva non è direttamente correlata all'avvertimento. Puoi spegnerlo per fermare qualsiasi buffering ma ciò non è raccomandato in generale (a meno che non sia necessario per Comet ).

2) Se nginx respinge una risposta quando serve la risposta bufferizzata, a chi e perché?

Server immediatamente, ma un client di solito ha una connessione molto più lenta e non può consumare i dati di risposta più velocemente di quanto prodotto dall'applicazione. Nginx tenta di bufferizzare l'intera risposta al fine di rilasciare l'applicazione al più presto.

Vedi anche: http://aosabook.org/en/nginx.html

3) Perché nginx attiva proxy_buffering per impostazione predefinita e poi [avvisa] se in realtà respinge una risposta?

Come ho già detto, il proxy_bufferingnon è direttamente correlato all'avvertimento. È generalmente necessario per operazioni proxy ottimizzate e la sua disattivazione riduce le prestazioni e la velocità effettiva.

Nginx ti avvisa solo quando una risposta non rientra nei buffer di memoria configurati. Puoi ignorare l'avvertimento se ti va bene.

4) Quando una risposta attiva questa opzione? Quando ci vogliono> di alcuni secondi (quanti?) Per servire la risposta? È configurabile?

Si attiva quando i buffer di memoria sono pieni. Per favore, guarda i documenti, l'intero meccanismo è spiegato: http://nginx.org/r/proxy_max_temp_file_size

Potrebbe essere necessario aumentare i buffer di memoria.


5
Per il n. 1, in che modo la rimozione del limite di dimensioni dei file temporanei impedisce l'avviso di buffering? Non credo sia corretto perché ho impostato questa direttiva su 0 e ricevo ancora avvisi.
Phil

Questa risposta non è abbastanza chiaro, è meglio per le prestazioni per impostare l' proxy_max_temp_file_sizea 0o questo è solo un modo per rimuovere questo avvertimento?
Offir Pe'er,

13

La seguente configurazione funziona bene sul mio server.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

2
La seconda direttiva è ridondante, vale 16ka dire che nella prima riga sta facendo esattamente lo stesso della seconda riga?
EoghanM,

1
@EoghanM secondo i documenti, n. Proxy_Buffer_size (buffer, non plurale) si applica alla prima parte della risposta del server proxy (ovvero le intestazioni) Sets the size of the buffer used for reading the first part of the response received from the proxied server. This part usually contains a small response header. Proxy_buffers è per il resto della risposta.
cde

2
Mi hai salvato alcuni capelli oggi. Stavo spostando nginx dal nostro server in un contenitore docker e ha iniziato ad essere INCREDIBILMENTE lento. Questo "risolto" esso. Non sono sicuro se la versione sul nostro server lo avesse attivato per impostazione predefinita o meno, ma quella nel contenitore aveva sicuramente bisogno di queste impostazioni.
Krystian,
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.