Я настроил 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
Некоторые другие факты:
- Количество байтов является постоянным от запроса к запросу, но оно варьируется в зависимости от содержимого (я впервые заметил это с большим файлом PNG, который был обрезан после 65 372 байтов, а не 65 283)
"x" * 110000
110 Кбайт отправлено правильно (т.е. возвращает все 110 000 байт), но 120 Кбайт неtcpdump
предполагает, что nginx отправляет пакет RST на gunicorn:
Connection: close
. Я также подтвердил, чтоContent-Length
заголовок правильный.Ответы:
Ладно! После двойной проверки журналов nginx, это оказалось проблемой:
В некотором
proxy_temp
роде запутались права доступа к каталогу, что не позволило nginx правильно буферизовать его.источник
[crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream
, сделал,sudo chown -R www-data:www-data /var/lib/nginx/
и она была исправлена.