2015-05-26 12 views
16

Ho battuto la testa su questo problema da giorni e finalmente ho raggiunto un muro di mattoni.nginx uwsgi websockets 502 Bad Gateway upstream connessione prematuramente chiusa durante la lettura dell'intestazione di risposta da upstream

Ho cercato di ottenere il mio stack per eseguire:

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

Sono stato a guardare alcuni articoli altri SO come questo:

nginx - uWSGI HTTP + websocket config

Sembrano per avere un problema simile sto incontrando ma la soluzione non funziona per me.

Fondamentalmente, continuo a incontrare la schermata del gateway di nginx 502 ogni volta che provo ad avviare i miei processi uWSGI. Ho due processi uwsgi separati in esecuzione, come da istruzioni nella documentazione.

Quando eseguo il websocket uwsgi esempio, ricevo il seguente:

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

che mi dice che tale istanza uwsgi è in esecuzione bene. Quindi eseguo il mio prossimo processo uwsgi e nessun registro degli errori ...

Quando si naviga nella pagina del browser, la pagina si blocca per alcuni secondi, prima di ottenere la schermata 502 Bad Gateway.

Secondo i registri 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" 

questo è l'unico log degli errori ottengo quando si tenta di accedere alla pagina nel browser web.

Qualche idea qualcuno ???

Qui di seguito sono alcuni dei miei file di configurazione:


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

Ho il seguente file django.conf, che si estende 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; 
    } 
} 

E due file che sono responsabili per i miei processi uwsgi come segue:

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 

e 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 

risposta

6

ho trovato il problema.

Il mio socket [runserver] (app.sock) deve essere puntato sotto upstream django e il mio socket [wsserver] (django.calzino) occorre rilevare sotto location /ws/ modo:

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

Ah, quindi ci deve essere un'ulteriore configurazione su apache2/nginx? Come sulla macchina di sviluppo locale funziona perfettamente senza problemi, ma sulla produzione ottengo lo stesso errore a monte di te. Sto usando Apache, quindi non sono sicuro se c'è un modo simile per risolverlo. – kiradotee

+0

L'ho solo configurato tramite NGINX. Questa configurazione presuppone che il server web e django siano in esecuzione sullo stesso host, se questo è utile. – Dominooch

Problemi correlati