Tengo nginx configurado como front-end para una aplicación Python que se ejecuta bajo gunicorn, pero nginx está finalizando las conexiones después de que se hayan enviado aproximadamente 65k de datos.
Por ejemplo, tengo una vista que se ve así:
def debug_big_file(request):
return HttpResponse("x" * 500000)
Pero cuando accedo a esa URL a través de nginx, solo obtengo 65283 bytes:
$ curl https://example.com/debug/big-file | wc
…
curl: (18) transfer closed with outstanding read data remaining
0 1 65283
Tenga en cuenta que todo funciona como se espera al acceder directamente a gunicorn:
$ curl http://localhost:1234/debug/big-file | wc
…
0 1 500000
La configuración de nginx relevante:
location / {
proxy_pass http://localhost:1234/;
proxy_redirect off;
proxy_headers_hash_bucket_size 96;
}
Y nginx versión 1.7.0
Algunos otros hechos:
- El número de bytes es consistente de solicitud a solicitud, pero varía según el contenido (lo noté por primera vez con un archivo PNG grande, que se cortó después de 65,372 bytes, no 65,283)
- 110k bytes se envían correctamente (es decir,
"x" * 110000
devuelve todos los 110,000 bytes), pero 120k bytes no son tcpdump
sugiere que nginx está enviando un paquete RST a gunicorn:
Connection: close
. También he confirmado que elContent-Length
encabezado es correcto.Respuestas:
¡Bueno! Después de verificar dos veces los registros de nginx, este resultó ser el problema:
De alguna manera, los permisos para el
proxy_temp
directorio se desordenaron, lo que impidió que nginx lo almacenara correctamente.fuente
[crit] 6636#0: *16817 open() "/var/lib/nginx/proxy/7/03/0000000037" failed (13: Permission denied) while reading upstream
, lo hicesudo chown -R www-data:www-data /var/lib/nginx/
y se solucionó.