django - processes - Restablecimiento de conexión Nginx, respuesta de uWsgi perdida
uwsgi example (4)
Tengo una aplicación django alojada a través de Nginx y uWsgi. En una solicitud muy simple, obtengo un comportamiento diferente para GET y POST, que no debería ser el caso.
El registro del daemon uWsgi:
[pid: 32454|app: 0|req: 5/17] 127.0.0.1 () {36 vars in 636 bytes} [Tue Oct 19 11:18:36 2010] POST /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ => generated 80 bytes in 3 msecs (HTTP/1.0 440) 1 headers in 76 bytes (0 async switches on async core 0)
[pid: 32455|app: 0|req: 5/18] 127.0.0.1 () {32 vars in 521 bytes} [Tue Oct 19 11:18:50 2010] GET /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ => generated 80 bytes in 3 msecs (HTTP/1.0 440) 1 headers in 76 bytes (0 async switches on async core 0)
El registro de acceso de Nginx:
127.0.0.1 - - [19/Oct/2010:18:18:36 +0200] "POST /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ HTTP/1.0" 440 0 "-" "curl/7.19.5 (i486-pc-linux-gnu) libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.15"
127.0.0.1 - - [19/Oct/2010:18:18:50 +0200] "GET /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ HTTP/1.0" 440 80 "-" "curl/7.19.5 (i486-pc-linux-gnu) libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.15"
El registro de errores de Nginx:
2010/10/19 18:18:36 [error] 4615#0: *5 readv() failed (104: Connection reset by peer) while reading upstream, client: 127.0.0.1, server: localhost, request: "POST /buy/76d4f520ae82e1dfd35564aed64a885b/a_2/10/ HTTP/1.0", upstream: "uwsgi://unix:sock/uwsgi.sock:", host: "localhost:9201"
En esencia, Nginx en algún lugar pierde la respuesta si uso POST, no así si uso GET.
¿Alguien sabe algo sobre eso?
Después de un hallazgo afortunado en posteriores investigaciones (http://answerpot.com/showthread.php?577619-Several%20Bugs/Page2) encontré algo que me ayudó ...
Suministrando uwsgi_pass_request_body off;
parámetro en el Nginx conf resuelve este problema ...
Estoy enfrentando los mismos problemas. Intenté todas las soluciones anteriores, pero no estaban funcionando. Ignorar el cuerpo de respuesta en mi caso simplemente no es una opción.
Aparentemente es un error con nginx y uwsgi cuando se trata de solicitudes POST cuya respuesta es menor que 4052 bytes
Lo que me solucionó fue agregar "--pep3333-input" a la lista de parámetros de uwsgi. Después de eso, todos los POST se devuelven correctamente.
Versiones de nginx / uwsgi que estoy usando:
$ nginx -V
nginx: nginx version: nginx/0.9.6
$ uwsgi --version
uWSGI 0.9.7
Me tocó el mismo problema, pero en mi caso no puedo desactivar "uwsgi_pass_request_body" ya que la mayoría de las veces (pero no siempre) mi aplicación necesita los datos POST.
Esta es la solución alternativa que encontré, aunque este problema no se corrige en uwsgi: http://permalink.gmane.org/gmane.comp.python.wsgi.uwsgi.general/813
import django.core.handlers.wsgi
class ForcePostHandler(django.core.handlers.wsgi.WSGIHandler):
"""Workaround for: http://lists.unbit.it/pipermail/uwsgi/2011-February/001395.html
"""
def get_response(self, request):
request.POST # force reading of POST data
return super(ForcePostHandler, self).get_response(request)
application = ForcePostHandler()
Pase --post-buffering 1
a uwsgi
Esto amortiguará automáticamente todo el cuerpo http> 1 byte
El problema se plantea por la forma en que nginx gestiona las desconexiones aguas arriba