nginx termina a conexão após 65k bytes

11

Eu tenho o nginx configurado como um front-end para um aplicativo Python sendo executado em gunicorn, mas o nginx está encerrando conexões depois que cerca de 65k de dados foram enviados.

Por exemplo, eu tenho uma visão que se parece com isso:

def debug_big_file(request):
    return HttpResponse("x" * 500000)

Mas quando eu acesso essa URL através do nginx, eu só consigo 65283 bytes:

$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
   0       1   65283

Note que tudo funciona como esperado ao acessar o gunicorn diretamente:

$ curl http://localhost:1234/debug/big-file | wc
…
   0       1   500000

A configuração relevante do nginx:

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, que foi cortado após 65.372 bytes, 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 para o gunicorn:
por David Wolever 26.05.2014 / 20:17

1 resposta

10

Tudo bem! Depois de verificar novamente os logs nginx, isso acabou sendo o problema:

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"

Alguns como as permissões para o diretório proxy_temp ficaram confusas, o que impediu que o nginx armazenasse o buffer adequadamente.

    
por 26.05.2014 / 22:56