Eine vorgelagerte Antwort wird in eine temporäre Datei gepuffert

61

Ich habe eine ziemlich große und langsame (komplexe Daten, komplexes Frontend) Webanwendung eingebaut RoRund Pumamit einem nginxReverse-Proxy bedient. Wenn nginxich mir das Fehlerprotokoll ansehe, sehe ich einige Einträge wie:

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"

Ich bin ziemlich neugierig, da es sehr unwahrscheinlich ist, dass die Seite für verschiedene Benutzer und verschiedene Benutzerinteraktionen gleich bleibt, und ich würde nicht denken, dass das Puffern der Antwort auf der Festplatte notwendig / nützlich ist.

Ich kenne es proxy_max_temp_file_sizeund setze es auf 0, aber es scheint mir ein bisschen umständlich (mein Proxy versucht zu puffern, hat aber keine Datei zum Puffern ... wie kann das schneller sein?).

Meine Fragen sind:

  1. Wie kann ich die [Warnung] entfernen und das Puffern von Antworten vermeiden? Ist es besser auszuschalten proxy_bufferingoder proxy_max_temp_file_sizeauf 0 zu setzen ? Warum?

  2. Wenn nginxeine Antwort gepuffert wird: Wann wird die gepufferte Antwort an wen und warum gesendet?

  3. Warum nginxschaltet sich proxy_bufferingstandardmäßig aktiviert und dann [warnen] s Sie , ob es tatsächlich eine Antwort Puffer?

  4. Wann löst eine Antwort diese Option aus? Wann dauert es> einige Sekunden (wie viele?), Um die Antwort zu liefern? Ist das konfigurierbar?

TIA, ngw.

ngw
quelle
1
Ich habe das Gefühl, dass Sie das Puffern mit dem Zwischenspeichern verwechseln. Das Puffern ist das Verfahren, mit dem mehr Daten geladen werden können, als durch die Speicherzuweisung zulässig sind.
Slavic

Antworten:

75

1) Wie kann ich die [Warnung] entfernen und das Puffern von Antworten vermeiden? Ist es besser, proxy_buffering auszuschalten oder proxy_max_temp_file_size auf 0 zu setzen? Warum?

Sie sollten proxy_max_temp_file_sizeauf 0 setzen, um es zu entfernen. Die proxy_bufferingAnweisung steht in keinem direkten Zusammenhang mit der Warnung. Sie können es ausschalten, um das Puffern zu stoppen. Dies wird jedoch im Allgemeinen nicht empfohlen (es sei denn, es wird für Comet benötigt ).

2) Wenn nginx eine Antwort puffert, wann dient sie der gepufferten Antwort, an wen und warum?

Es wird sofort ausgeführt, aber ein Client hat normalerweise eine viel langsamere Verbindung und kann die Antwortdaten nicht so schnell verarbeiten, wie sie von Ihrer Anwendung erstellt wurden. Nginx versucht, die gesamte Antwort zu puffern, um Ihre Anwendung so schnell wie möglich freizugeben.

Siehe auch: http://aosabook.org/en/nginx.html

3) Warum aktiviert nginx proxy_buffering standardmäßig und [warnt] Sie dann, wenn es tatsächlich eine Antwort puffert?

Wie ich bereits erwähnte, proxy_bufferinghängt das nicht direkt mit der Warnung zusammen. Es wird im Allgemeinen für optimierte Proxy-Vorgänge benötigt, und das Deaktivieren beeinträchtigt die Leistung und den Durchsatz.

Nginx warnt Sie nur, wenn eine Antwort nicht in konfigurierte Speicherpuffer passt. Sie können die Warnung ignorieren, wenn dies für Sie in Ordnung ist.

4) Wann löst eine Antwort diese Option aus? Wann dauert es> als einige Sekunden (wie viele?), Um die Antwort zu liefern? Ist das konfigurierbar?

Es wird ausgelöst, wenn die Speicherpuffer voll sind. Schauen Sie sich die Dokumentation an, der gesamte Mechanismus wird erklärt: http://nginx.org/r/proxy_max_temp_file_size

Möglicherweise möchten Sie den Speicherpuffer erhöhen.

VBart
quelle
5
Wie verhindert das Entfernen der Größenbeschränkung für temporäre Dateien die Pufferwarnung für # 1? Ich glaube nicht, dass dies korrekt ist, da ich diese Anweisung auf 0 gesetzt habe und trotzdem Warnungen erhalte.
Phil
Diese Antwort ist nicht klar genug. Ist es für die Leistung besser, den Wert auf zu setzen proxy_max_temp_file_size, 0oder ist dies nur eine Möglichkeit, diese Warnung zu entfernen?
Offir Pe'er
12

Die folgende Konfiguration funktioniert auf meinem Server einwandfrei.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;
Haluk
quelle
2
Ist die zweite Direktive redundant, dh die 16kin der ersten Zeile macht genau dasselbe wie die zweite Zeile?
EoghanM
1
@EoghanM laut den docs, nein. Proxy_Buffer_size (Puffer, nicht Plural) gilt für den ersten Teil der Antwort des Proxy-Servers (auch als Header bezeichnet) 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 ist für den Rest der Antwort.
8.
2
Sie haben heute einige meiner Haare gerettet. Ich habe Nginx von unserem Server in einen Docker-Container verschoben und es begann unglaublich langsam zu werden. Das "reparierte" es. Ich bin nicht sicher, ob die Version auf unserem Server dies standardmäßig aktiviert hat oder nicht, aber die Version im Container benötigte diese Einstellungen definitiv.
Krystian