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ż, żeContent-Length
nagłówek jest poprawny.Odpowiedzi:
W porządku! Po podwójnym sprawdzeniu dzienników nginx okazało się, że jest to problem:
Trochę pomylono uprawnienia do
proxy_temp
katalogu, co uniemożliwiło nginx prawidłowe buforowanie do niego.źródło
[crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream
, zrobiłemsudo chown -R www-data:www-data /var/lib/nginx/
i naprawiłem.