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:
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;
}