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" * 110000
alle 110.000 Byte werden zurückgegeben), 120 KB jedoch nicht tcpdump
schlägt vor, dass nginx ein RST-Paket an gunicorn sendet:
Connection: close
. Ich habe auch bestätigt, dass derContent-Length
Header korrekt ist.Antworten:
Okay! Nach doppelter Überprüfung der Nginx-Protokolle stellte sich heraus, dass dies das Problem war:
Einige, wie die Berechtigungen für das
proxy_temp
Verzeichnis durcheinander gebracht wurden, was verhinderte, dass Nginx ordnungsgemäß darauf pufferte.quelle
[crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream
, tatsudo chown -R www-data:www-data /var/lib/nginx/
und es wurde behoben.