Eine Upstream-Antwort wird in einer temporären Datei gepuffert

Eine Upstream-Antwort wird in einer temporären Datei gepuffert

Ich habe eine ziemlich große und langsame (komplexe Daten, komplexes Frontend) Webanwendung eingebaut und von einem Reverse-Proxy RoRbedient . Wenn ich mir das Fehlerprotokoll anschaue, sehe ich einige Einträge wie:Pumanginxnginx

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/sinnvoll ist.

Ich weiß, dass proxy_max_temp_file_sizeman es auf 0 setzen kann, aber das erscheint mir ein wenig umständlich (mein Proxy versucht zu puffern, hat aber keine Datei, in die er puffern kann ... wie kann das schneller gehen?).

Meine Fragen sind:

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

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

  3. Warum nginxwird es proxy_bufferingstandardmäßig aktiviert und Sie werden dann [gewarnt], wenn tatsächlich eine Antwort gepuffert wird?

  4. Wann löst eine Antwort diese Option aus? Wenn es > einige Sekunden dauert (wie viele?), bis die Antwort ausgeliefert wird? Ist das konfigurierbar?

Danke, vielen Dank.

Antwort1

  1. Wie kann ich die [Warnung] entfernen und das Puffern von Antworten vermeiden? Ist es besser, die Proxy-Pufferung auszuschalten oder die Proxy-Maximaltemp-Dateigröße auf 0 zu setzen? Warum?

proxy_max_temp_file_sizeUm es zu entfernen, sollten Sie es auf 0 setzen . Die proxy_bufferingDirektive hat nicht direkt mit der Warnung zu tun. Sie können sie ausschalten, um das Puffern ganz zu stoppen, aber das wird im Allgemeinen nicht empfohlen (es sei denn, es wird benötigt fürKomet).

  1. Wenn Nginx eine Antwort puffert, wann, wem und warum wird die gepufferte Antwort bereitgestellt?

Die Antwort wird sofort bereitgestellt, aber ein Client hat normalerweise eine viel langsamere Verbindung und kann die Antwortdaten nicht so schnell verarbeiten, wie sie von Ihrer Anwendung erzeugt werden. Nginx versucht, die gesamte Antwort zu puffern, um Ihre Anwendung so schnell wie möglich freizugeben.

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

  1. Warum aktiviert Nginx standardmäßig die Proxy-Pufferung und [warnt] Sie dann, wenn es tatsächlich eine Antwort puffert?

Wie ich bereits erwähnt habe, proxy_bufferingsteht dies nicht in direktem Zusammenhang mit der Warnung. Es wird im Allgemeinen für optimierte Proxy-Operationen benötigt und das Ausschalten beeinträchtigt Leistung und Durchsatz.

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

  1. Wann löst eine Antwort diese Option aus? Wenn es länger als einige Sekunden dauert (wie viele?), bis die Antwort ausgeliefert wird? Ist das konfigurierbar?

Es wird ausgelöst, wenn die Speicherpuffer voll sind. Bitte 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 die Speicherpuffer vergrößern.

Antwort2

Die folgende Konfiguration funktioniert auf meinem Server einwandfrei.

proxy_buffers 16 16k;  
proxy_buffer_size 16k;

Antwort3

Der nginx sendfile-Befehl kann bei statischen Inhalten hilfreich sein

https://docs.nginx.com/nginx/admin-guide/web-server/serving-static-content/

Sendfile aktivieren:

Standardmäßig übernimmt NGINX die Dateiübertragung selbst und kopiert die Datei vor dem Senden in den Puffer. Durch Aktivieren der Direktive „sendfile“ entfällt der Schritt des Kopierens der Daten in den Puffer und das direkte Kopieren von Daten von einem Dateideskriptor in einen anderen wird ermöglicht. Um zu verhindern, dass eine schnelle Verbindung den Arbeitsprozess vollständig belegt, können Sie die Direktive „sendfile_max_chunk“ verwenden, um die Datenmenge zu begrenzen, die in einem einzelnen Aufruf von „sendfile()“ übertragen wird (in diesem Beispiel auf 1 MB):

location /mp3 {
    sendfile           on;
    sendfile_max_chunk 1m;
    #...
}

Antwort4

Fügen Sie diese zu nginx.conf oder zum Kontext der Konfigurationsdatei des virtuellen Hosts hinzu (http,Server,Standort):

proxy_max_temp_file_size 10240m;
proxy_buffers 240 240k;
proxy_busy_buffers_size 240k;
proxy_buffer_size 240k;

Sie können die Werte entsprechend Ihrer Situation festlegen, sie müssen jedoch im Gleichgewicht zueinander stehen (verwenden Sie keine unterschiedlichen Zahlen für Pufferanweisungen).

Ich habe das gleiche Problem und teste diese Konfigurationen für ein Skript mit umfangreichen und zeitintensiven IO-, SQL- und PHP-Prozessen, und es funktioniert einwandfrei.

verwandte Informationen