У меня nginx настроен как интерфейс для приложения Python, работающего под управлением Gunicorn, но nginx завершает соединения после того, как было отправлено около 65 КБ данных.
Например, у меня есть представление, которое выглядит так:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Но когда я обращаюсь к этому URL через nginx, я получаю только 65283 байта:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Обратите внимание, что при прямом доступе к Gunicorn все работает, как ожидалось:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
Соответствующий конфиг nginx:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
И nginx версии 1.7.0
Еще несколько фактов:
"x" * 110000
возвращает все 110000 байтов), но 120 КБ неtcpdump
предполагает, что nginx отправляет пакет RST в gunicorn: Ладно! После двойной проверки логов nginx выяснилось, что это проблема:
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"
Каким-то образом разрешения для proxy_temp
каталог испортился, что помешало nginx правильно буферизовать его.