web-dev-qa-db-fra.com

nginx uwsgi websockets 502 Mauvaise passerelle en amont connexion fermée prématurément lors de la lecture de l'en-tête de réponse en amont

Cela fait des jours que je me tape la tête sur cette question et j'ai finalement atteint un mur de briques.

J'ai essayé de faire fonctionner ma pile:

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

J'ai consulté d'autres articles SO comme celui-ci:

nginx - configuration uWSGI HTTP + websocket

Ils semblent avoir un problème similaire que je rencontre, mais la solution ne fonctionne pas pour moi.

Fondamentalement, je continue de rencontrer l'écran de mauvaise passerelle nginx 502 chaque fois que j'essaie de démarrer mes processus uWSGI. J'ai deux processus uwsgi distincts en cours d'exécution, conformément aux instructions de la documentation.

Lorsque j'exécute l'instance usgi websocket, j'obtiens ce qui suit:

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

ce qui me dit que cette instance uwsgi fonctionne bien. Ensuite, je lance mon prochain processus uwsgi et aucun journal d'erreur là-bas non plus ...

Lorsque je navigue vers la page dans le navigateur, la page se bloque pendant quelques secondes, avant d'obtenir l'écran 502 Bad Gateway.

Selon les journaux NGINX, NGINX dit:

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"

Il s'agit du seul journal d'erreurs que j'obtiens lorsque j'essaie d'accéder à la page dans le navigateur Web.

Des idées n'importe qui ???

Voici quelques-uns de mes fichiers de configuration:


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

J'ai le fichier Django.conf suivant, qui étend 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;
    }
}

Et deux fichiers qui sont responsables de mes processus uwsgi comme suit:

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

et 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
19
Dominooch

J'ai trouvé le problème.

Ma socket [runserver] (app.sock) doit être pointée sous upstream Django et mon socket [wsserver] (Django.sock) doivent être pointés sous location /ws/ ainsi:

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;
    }
}
6
Dominooch

J'ai eu le même problème, mais ce n'était pas ma configuration NGINX, c'était mes processus UWSGI provoquant des erreurs de délai d'expiration lorsque j'ai publié des JSON du côté client au serveur. J'avais des processus à 5, je l'ai changé à 1 et cela a résolu le problème. Pour mon application, je n'avais besoin d'exécuter qu'un seul processus à la fois car AWS n'avait pas besoin d'être surchargé de plusieurs processus.

Voici le fichier ini de configuration UWSGI qui a résolu le problème de délai d'attente et donc le problème de la passerelle 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

Voici également ma configuration nginx.

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

2
Elia Ahadi