Eu tenho o nginx configurado como um front-end para um aplicativo Python em execução no gunicorn, mas o nginx está encerrando as conexões após o envio de cerca de 65k de dados.
Por exemplo, eu tenho uma visão parecida com esta:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Mas quando eu acesso esse URL através do nginx, recebo apenas 65283 bytes:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Observe que tudo funciona como esperado ao acessar o gunicorn diretamente:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
A configuração nginx relevante:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
E nginx versão 1.7.0
Alguns outros fatos:
- O número de bytes é consistente de solicitação para solicitação, mas varia de acordo com o conteúdo (notei pela primeira vez com um arquivo PNG grande, cortado após 65.372 bytes, e não 65.283)
- 110k bytes são enviados corretamente (ou seja,
"x" * 110000
retorna todos os 110.000 bytes), mas 120k bytes não são tcpdump
sugere que o nginx está enviando um pacote RST ao gunicorn:
Connection: close
. Também confirmei que oContent-Length
cabeçalho está correto.Respostas:
OK! Após verificar novamente os logs do nginx, este foi o problema:
De alguma forma, como as permissões para o
proxy_temp
diretório foram alteradas, impedindo o nginx de armazenar em buffer corretamente.fonte
[crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream
, fezsudo chown -R www-data:www-data /var/lib/nginx/
e foi corrigida.