Mam nginx skonfigurowany jako interfejs aplikacji Python działającej pod gunicorn, ale nginx przerywa połączenia po wysłaniu około 65 000 danych.
Na przykład mam widok, który wygląda następująco:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Ale kiedy uzyskuję dostęp do tego adresu URL przez nginx, otrzymuję tylko 65283 bajtów:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Pamiętaj, że wszystko działa zgodnie z oczekiwaniami przy bezpośrednim dostępie do gunicorn:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
Odpowiednia konfiguracja nginx:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
I wersja 1.7.0 Nginx
Kilka innych faktów:
- Liczba bajtów jest spójna od żądania do żądania, ale różni się w zależności od zawartości (po raz pierwszy zauważyłem duży plik PNG, który został odcięty po 65 372 bajtach, a nie 65 283)
"x" * 110000
110 000 bajtów jest wysyłanych poprawnie (tzn. Zwraca wszystkie 110 000 bajtów), ale 120 000 bajtów nietcpdump
sugeruje, że nginx wysyła pakiet RST do gunicorn:
Connection: close
. Potwierdziłem również, że Content-Length
nagłówek jest poprawny.