nginx beendet die Verbindung nach 65 KB

11

Ich habe Nginx als Front-End für eine Python-Anwendung konfiguriert, die unter Gunicorn ausgeführt wird, aber Nginx beendet Verbindungen, nachdem ungefähr 65.000 Daten gesendet wurden.

Zum Beispiel habe ich eine Ansicht, die so aussieht:

def debug_big_file(request):
    return HttpResponse("x" * 500000)

Wenn ich jedoch über nginx auf diese URL zugreife, erhalte ich nur 65283 Bytes:

$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
   0       1   65283

Beachten Sie, dass beim direkten Zugriff auf Gunicorn alles wie erwartet funktioniert:

$ curl http://localhost:1234/debug/big-file | wc
…
   0       1   500000

Die relevante Nginx-Konfiguration:

location / {
    proxy_pass http://localhost:1234/;
    proxy_redirect off;
    proxy_headers_hash_bucket_size 96;
}

Und Nginx Version 1.7.0

Einige andere Fakten:

  • Die Anzahl der Bytes ist von Anfrage zu Anfrage konsistent, variiert jedoch je nach Inhalt (ich habe es zuerst bei einer großen PNG-Datei bemerkt, die nach 65.372 Bytes abgeschnitten wurde, nicht nach 65.283).
  • 110 KB werden korrekt gesendet (dh "x" * 110000alle 110.000 Byte werden zurückgegeben), 120 KB jedoch nicht
  • tcpdump schlägt vor, dass nginx ein RST-Paket an gunicorn sendet: Nginx sendet RST
David Wolever
quelle
Es wäre hilfreich zu sehen, (a) wie Gunicorn Antworten mit einer Größe von 110 KB bis 120 KB Byte einrahmt und (b) wie Nginx dann seinen Rahmen für denselben Bereich von Beispielnutzlastgrößen zwischen 110 KB und 120 KByte auswählt. Die drei Möglichkeiten, wie HTTP Daten rahmen kann: Bereitstellung der Inhaltslänge; Chunked-Codierung durchführen; oder geben Sie überhaupt keinen Rahmen, außer zu versprechen, die Steckdose zu schließen, wenn der Körper fertig ist.
Brandon Rhodes
Ein Header mit Inhaltslänge wird bereitgestellt. Lassen Sie mich Paket Dump, um zu sehen, was sonst zwischen den beiden los ist ...
David Wolever
Hm, sehr komisch. tcpdump schlägt vor, dass nginx die Verbindung aktiv RST-stellt (siehe Bearbeiten). nginx verwendet auch HTTP / 1.0 und Connection: close. Ich habe auch bestätigt, dass der Content-LengthHeader korrekt ist.
David Wolever

Antworten:

10

Okay! Nach doppelter Überprüfung der Nginx-Protokolle stellte sich heraus, dass dies das Problem war:

2014/05/26 16:50:56 [crit] 31396#0: *11 open() "…/proxy_temp/2/00/0000000002" failed (13: Permission denied) while reading upstream, client: 1.2.3.4, server: _, request: "GET /debug/big-file HTTP/1.1", upstream: "http://127.0.0.1:1234/debug/big-file", host: "example.com"

Einige, wie die Berechtigungen für das proxy_tempVerzeichnis durcheinander gebracht wurden, was verhinderte, dass Nginx ordnungsgemäß darauf pufferte.

David Wolever
quelle
1
Ja, ich habe gerade ein Problem wie dieses gelöst, in Nginx-Protokollen gesucht, hatte eine Zeile mit [crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream, tat sudo chown -R www-data:www-data /var/lib/nginx/und es wurde behoben.
Epigene