nginx uwsgi bottle

Restablecimiento de la conexión NGINX+uWSGI por pares



bottle (4)

Estoy tratando de alojar Bottle Application en NGINX usando uWSGI.

Aquí está mi nginx.conf

location /myapp/ { include uwsgi_params; uwsgi_param X-Real-IP $remote_addr; uwsgi_param Host $http_host; uwsgi_param UWSGI_SCRIPT myapp; uwsgi_pass 127.0.0.1:8080; }

Estoy ejecutando uwsgi como esto

uwsgi --enable-threads --socket :8080 --plugin python -- wsgi-file ./myApp/myapp.py

Estoy usando POST Request. Para eso usando Dev Http Client. Que va infinito cuando envío la solicitud

http://localhost/myapp

El servidor uWSGI recibe la solicitud e imprime

[pid: 4683|app: 0|req: 1/1] 127.0.0.1 () {50 vars in 806 bytes} [Thu Oct 25 12:29:36 2012] POST /myapp => generated 737 bytes in 11 msecs (HTTP/1.1 404) 2 headers in 87 bytes (1 switches on core 0)

pero en el registro de errores nginx

2012/10/25 12:20:16 [error] 4364#0: *11 readv() failed (104: Connection reset by peer) while reading upstream, client: 127.0.0.1, server: localhost, request: "POST /myApp/myapp/ HTTP/1.1", upstream: "uwsgi://127.0.0.1:8080", host: "localhost"

¿Qué hacer?


No puede publicar datos del cliente sin leerlos en su aplicación. aunque esto no es un problema en uWSGI, nginx fallará. Puede ''falsificar'' la cosa usando la opción --post-buffering de uWSGI para leer automáticamente los datos del socket (si está disponible), pero será mejor que "corrija" (incluso si no lo considero un error) su aplicación


¡No usar hilos!

Tengo el mismo problema con Global Interpretator Lock en Python bajo uwsgi. Cuando no uso hilos, no restablecimiento de conexión.

Ejemplo de configuración uwsgi (1Gb Ram en el servidor)

[root@mail uwsgi]# cat myproj_config.yaml uwsgi: print: Myproject Configuration Started socket: /var/tmp/myproject_uwsgi.sock pythonpath: /sites/myproject/myproj env: DJANGO_SETTINGS_MODULE=settings module: wsgi chdir: /sites/myproject/myproj daemonize: /sites/myproject/log/uwsgi.log max-requests: 4000 buffer-size: 32768 harakiri: 30 harakiri-verbose: true reload-mercy: 8 vacuum: true master: 1 post-buffering: 8192 processes: 4 no-orphans: 1 touch-reload: /sites/myproject/log/uwsgi post-buffering: 8192


asegúrese de consumir sus datos de publicación en su aplicación

por ejemplo, si tienes una aplicación de Python

def my_view(request): # ensure to read the post data, even if you don''t need it # without this you get a: failed (104: Connection reset by peer) data = request.DATA return HttpResponse("Hello World")


Este problema ocurre cuando el cuerpo de una solicitud no se consume, ya que uwsgi no puede saber si aún será necesario en algún momento. Así, uwsgi seguirá reteniendo los datos hasta que se consuman o hasta que nginx restablezca la conexión (porque se agotó el tiempo de espera).

El autor de uwsgi lo explica aquí :

08:21 < unbit> plaes: does your DELETE request (not-response) have a body ? 08:40 < unbit> and do you read that body in your app ? 08:41 < unbit> from the nginx logs it looks like it has a body and you are not reading it in the app 08:43 < plaes> so DELETE request shouldn''t have the body? 08:43 < unbit> no i mean if a request has a body you have to read/consume it 08:44 < unbit> otherwise the socket will be clobbered

Por lo tanto, para solucionar esto, debe asegurarse de leer siempre el cuerpo completo de la solicitud o no enviar un cuerpo si no es necesario (para un DELETE, por ejemplo).