J'ai configuré nginx en tant que frontal pour une application Python exécutée sous gunicorn, mais nginx met fin aux connexions après l'envoi d'environ 65 000 données.
Par exemple, j'ai une vue qui ressemble à ceci:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Mais lorsque j'accède à cette URL via nginx, je n'obtiens que 65283 octets:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Notez que tout fonctionne comme prévu lorsque vous accédez directement à gunicorn:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
La configuration nginx pertinente:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
Et nginx version 1.7.0
Quelques autres faits:
- Le nombre d'octets est cohérent d'une demande à l'autre, mais il varie en fonction du contenu (je l'ai d'abord remarqué avec un gros fichier PNG, qui a été coupé après 65 372 octets, pas 65 283)
- 110 000 octets sont envoyés correctement (c.-à-d.
"x" * 110000
Renvoie tous les 110 000 octets), mais 120 000 octets ne le sont pas tcpdump
suggère que nginx envoie un paquet RST à gunicorn:
Connection: close
. J'ai également confirmé que l'en-Content-Length
tête est correct.Réponses:
D'accord! Après avoir vérifié les journaux nginx, cela s'est avéré être le problème:
Certains comment les autorisations pour le
proxy_temp
répertoire ont été gâchées, ce qui a empêché nginx de le mettre correctement en mémoire tampon.la source
[crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream
, l'a faitsudo chown -R www-data:www-data /var/lib/nginx/
et ça a été corrigé.