django nginx websocket redis uwsgi

django - nginx uwsgi websockets 502 Bad Gateway ascendente prematuramente cerrada la conexión mientras se lee el encabezado de respuesta desde el ascendente



redis (2)

Me he estado golpeando la cabeza por este problema durante días y finalmente he llegado a una pared de ladrillos.

He estado tratando de hacer que mi pila se ejecute:

http://django-websocket-redis.readthedocs.org/en/latest/running.html#django-with-websockets-for-redis-behind-nginx-using-uwsgi

He estado mirando algunos otros artículos de SO como este:

nginx - uWSGI HTTP + configuración websocket

Parece que tienen un problema similar al que me encuentro, pero la solución no funciona para mí.

Básicamente, me encuentro con la pantalla de la puerta de enlace defectuosa del nginx 502 cada vez que intento iniciar mis procesos uWSGI. Tengo dos procesos uwsgi separados en ejecución, según las instrucciones de la documentación.

Cuando ejecuto la instancia de uwsgi websocket, obtengo lo siguiente:

*** running gevent loop engine [addr:0x487690] *** [2015-05-27 00:45:34,119 wsgi_server] DEBUG: Subscribed to channels: subscribe-broadcast, publish-broadcast

lo que me dice que esa instancia de uwsgi se está ejecutando bien. Luego ejecuto mi siguiente proceso uwsgi y no hay registros de errores allí tampoco ...

Cuando navego a la página en el navegador, la página se cuelga durante unos segundos, antes de obtener la pantalla de la puerta de enlace 502 incorrecta.

De acuerdo con los registros de NGINX, NGINX dice:

2015/05/26 22:46:08 [error] 18044#0: *3855 upstream prematurely closed connection while reading response header from upstream, client: 192.168.59.3, server: , request: "GET /chat/ HTTP/1.1", upstream: "uwsgi://unix:/opt/django/django.sock:", host: "192.168.59.103:32768"

Este es el único registro de errores que obtengo al intentar acceder a la página en el navegador web.

¿Alguna idea a alguien ???

A continuación se muestran algunos de mis archivos de configuración:

nginx.conf

user www-data; worker_processes 4; pid /run/nginx.pid; events { worker_connections 768; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/django.conf; }

Tengo el siguiente archivo django.conf, que extiende nginx.conf

upstream django { server unix:/opt/django/django.sock; } server { listen 80 default_server; charset utf-8; client_max_body_size 20M; sendfile on; keepalive_timeout 0; large_client_header_buffers 8 32k; location /media { alias /opt/django/app/media/media; } location /static { alias /opt/django/app/static; } location / { include /opt/django/uwsgi_params; } location /ws/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://unix:/opt/django/app.sock; proxy_buffers 8 32k; proxy_buffer_size 64k; } }

Y dos archivos que son responsables de mis procesos uwsgi de la siguiente manera:

runserver_uwsgi.ini:

[uwsgi] ini = :runserver [default] userhome = /opt/django chdir = %dapp/ master = true module = chatserver.wsgi:application no-orphans = true threads = 1 env = DJANGO_SETTINGS_MODULE=myapp.settings vacuum = true [runserver] ini = :default socket = /opt/django/app.sock module = wsgi_django buffer-size = 32768 processes = 4 chmod-socket=666

y wsserver_uwsgi.ini

[uwsgi] ini = :wsserver [default] userhome = /opt/django chdir = %dapp/ master = true module = chatserver.wsgi:application no-orphans = true threads = 1 env = DJANGO_SETTINGS_MODULE=chatserver.settings vacuum = true [wsserver] ini = :default http-socket = /opt/django/django.sock module = wsgi_websocket http-websockets = true processes = 2 gevent = 1000 chmod-socket=666


Encontré el problema.

Mi socket [runserver] (app.sock) debe apuntarse debajo de upstream django en upstream django y mi socket [wsserver] (django.sock) debe apuntarse en location /ws/ like así:

upstream django { server unix:/opt/django/app.sock; } server { listen 80 default_server; charset utf-8; client_max_body_size 20M; sendfile on; keepalive_timeout 0; large_client_header_buffers 8 32k; location /media { alias /opt/django/app/media/media; } location /static { alias /opt/django/app/static; } location / { include /opt/django/uwsgi_params; } location /ws/ { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://unix:/opt/django/django.sock; proxy_buffers 8 32k; proxy_buffer_size 64k; } }


Tuve el mismo problema, pero no era mi configuración NGINX, eran mis procesos UWSGI que causaban errores de tiempo de espera cuando publiqué JSON desde el lado del cliente al servidor. Tuve procesos como 5, lo cambié a 1 y resolví el problema. Para mi aplicación, solo necesitaba que se ejecutara 1 proceso a la vez, ya que AWS no tenía que estar sobrecargado con varios procesos.

Aquí está el archivo de ini de configuración UWSGI que resolvió el problema del tiempo de espera y, por lo tanto, el problema de la puerta de enlace 502.

autoboot.ini

#!/bin/bash [uwsgi] socket = /tmp/app.sock master = true chmod-socket = 660 module = app.wsgi chdir = home/app close-on-exec = true # Allow linux shell via uWSGI processes = 1 threads = 2 vacuum = true die-on-term = true

Aquí está mi configuración nginx también.

nginx.conf

# the upstream component nginx needs to connect to upstream django { server unix:///app/tmp/app.sock; # for a file socket # server 127.0.0.1:6000; # for a web port socket (we''ll use this first) } # configuration of the server server { # the port your site will be served on listen 80; # the domain name it will serve for server_name XXX.XXX.XX.X #actual IP in here charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include uwsgi_params; } location /static { autoindex on; alias app/static; # your Django project''s static files - amend as required } error_page 502 /502.html; location = /502.html { alias app/templates/502autoreload.html; } client_body_timeout 100s; uwsgi_read_timeout 500s; keepalive_timeout 300; }