Ho nginx configurato come front-end per un'applicazione Python in esecuzione su gunicorn, ma nginx sta terminando le connessioni dopo che sono stati inviati circa 65k di dati.
Ad esempio, ho una vista che assomiglia a questa:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Ma quando accedo a quell'URL tramite nginx, ottengo solo 65283 byte:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Si noti che tutto funziona come previsto quando si accede direttamente al gunicorn:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
La configurazione nginx pertinente:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
E nginx versione 1.7.0
Alcuni altri fatti:
- Il numero di byte è coerente da una richiesta all'altra, ma varia in base al contenuto (l'ho notato per la prima volta con un file PNG di grandi dimensioni, che è stato tagliato dopo 65.372 byte, non 65.283)
- 110k byte vengono inviati correttamente (ovvero
"x" * 110000
restituisce tutti i 110.000 byte), ma 120k byte no tcpdump
suggerisce che nginx sta inviando un pacchetto RST a gunicorn:
Connection: close
. Ho anche confermato che l' Content-Length
intestazione è corretta.