2013-05-23 44 views
7

Ich bin ein Django-Projekt, das gevent-socketio verwendet.gevent-socketio nginx uwsgi funktioniert nicht zusammen auf dem Entwicklungsserver

Aus irgendeinem Grund auf meinem Entwicklungsserver, alle meine websockets Anfragen geben eine 101 pending Nachricht, bei der socketio wird durch alle anderen Protokolle Zyklus, die in einen pending Status führen.

Der Fehler in meinen uwsgi Protokollen ist:

2013/05/23 16:09:08 [error] 14485#0: *85 upstream timed out (110: Connection timed out) while reading upstream, client: x.x.x.x, server: dev.proj.co, request: "GET /socket.io/1/xhr-polling/116404981619?t=1369325348489 HTTP/1.1", upstream: "http://127.0.0.1:4042/socket.io/1/xhr-polling/116404981619?t=1369325348489", host: "dev.proj.co", referrer: "http://dev.proj.co/map/bycon/" 

Lokal, ich dieses Problem nicht. Ich starte den Server python run.py

run.py auf meinem lokalen Umgebung

#!/usr/bin/env python 
import os 
import sys 

from gevent import monkey 
monkey.patch_all() 

import django.core.handlers.wsgi 
from socketio.server import SocketIOServer 

import os 

PORT = 8000 

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "proj.settings") 
application = django.core.handlers.wsgi.WSGIHandler() 
PROJECT_DIR   = os.path.realpath(os.path.dirname(__file__)) 
sys.path.insert(0, PROJECT_DIR) 
sys.path.insert(0, os.path.join(PROJECT_DIR, "chat")) 

if __name__ == '__main__': 
    SocketIOServer(('', PORT), application, resource="socket.io").serve_forever() 

Auf meinem Entwicklungsserver mit, wo der Fehler auftritt, habe ich die folgenden Einstellungen:

nginx.conf

worker_processes auto; 

events { 
    worker_connections 1024; 
} 

http { 
    include  mime.types; 
    default_type application/octet-stream; 
    sendfile  on; 
    keepalive_timeout 65; 

    gzip on; 
    upstream django { 
     server 127.0.0.1:4042; 
    } 


    server { 
     listen  80; 
     server_name dev.proj.co; 
     charset utf-8; 

     access_log /var/log/nginx/myproj_dev.access.log; 
     error_log /var/log/nginx/myproj_dev.error.log; 

     location /media/ { 
      alias /var/www/dev/myproj/releases/myproj_public/media/; 
      error_page 404 = /404; 
      expires 30d; 
     } 

     location /static/ { 
      alias /var/www/dev/myproj/releases/myproj_public/static/; 
      error_page 404 = /404; 
      expires 30d; 
     } 
     location/{ 
      proxy_pass http://127.0.0.1:4042; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
     } 
    } 
} 

uwsgi_dev.ini

[uwsgi] 

if-env = PROJECT_HOME 
print = Your path is %(_)/current 
chdir = %(_)/current 
touch-reload = %(_)/current/myproj/uwsgi_dev.ini 
daemonize = %(_)/myproj_uwsgi/myproj.log 
endif = 

if-env = VIRTUAL_ENV 
print = Your virtualenv is %(_) 
virtualenv = %(_) 
endif = 

gevent = 100 
processes = 4 
module = myproj.wsgi_dev 
env = DJANGO_SETTINGS_MODULE=myproj.settings.dev 
master = True 
vacuum = True 
max-requests = 5000 
logdate = True 

# newrelic requirements 
enable-threads = True 
single-interpreter = True 

wsgi_dev.py

import os 

from gevent import monkey 
monkey.patch_all() 

from socketio.server import SocketIOServer 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproj.settings") 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

PORT = 4042 
SocketIOServer(("127.0.0.1", PORT), application, \ 
     resource="socket.io").serve_forever() 

Weitere Informationen:

I'm using uwsgi 1.9.6, gevent-websocket 0.3.6, greenlet 0.4.0 and the dev version of gevent(-e git://github.com/surfly/[email protected]#egg=gevent-dev) and gevent-socketetio (-e git://github.com/abourget/[email protected]#egg=gevent_socketio-dev) 

[[email protected] ~]# nginx -v 
nginx version: nginx/1.4.1 
+0

Können Sie vielleicht versuchen Sie es mit einem Prozess ausgeführt wird und sehen, ob das Problem weiterhin besteht? Ich habe auch Probleme mit gevent-socketio mit mehreren Mitarbeitern mit Gunicorn, nicht sicher, ob es verwandt ist https://github.com/abourget/gevent-socketio/issues/132?source=cc. Außerdem scheint uwsgi mit gevent sehr buggy zu sein ... https://github.com/abourget/gevent-socketio/issues/81?source=cc –

+0

@BernhardVallant Danke für den Kommentar. Die Gunicorn-Verbindung war sehr hilfreich.Ich habe jetzt nicht viel Zeit, dies zu debuggen, aber wenn ich das tue, werde ich versuchen, daran zu denken, diesen Beitrag zu aktualisieren. – super9

+1

@ super9 Ich weiß, das ist eine alte Frage, aber ich frage mich, ob Sie jemals gelöst haben, was Ihnen den Fehler gab? Ich habe derzeit ein ähnliches Problem. – jbll

Antwort

1

Für WebSockets unterstützen Sie neueste Version von nginx (1.4.x) benötigen . Wenn Sie ältere Versionen verwenden, werden Sie nicht in der Lage sein, den websocket Kanal zu starten

+0

aktualisiert. mit 1.4.1 – super9

0

Die SocketIOServer wird nie laufen, wie Sie die WSGI django Datei als Modul ausgeführt werden, so __name__ nicht __main__ ist

Zusätzlich dazu die Logik ist falsch, da SocketIOServer die uWSGI-Blockierung der yorur django-App übernimmt.

Ich schlage vor, Sie SocketIOServer aus einem separaten Skript --attach-Daemon von uwsgi

(und natürlich setzen uwsgi auf einem anderen Port)

+0

Danke für die Antwort @roberto. Ich denke, die Formulierung meiner Frage hat Sie verwirrt. Ich habe es geändert, um es klarer zu machen. Ich benutze nur die 'run.py' Datei (im Gegensatz zu ./manage.py runserver) lokal und es funktioniert ok. Das Problem sind die Einstellungen auf meinem Entwicklungsserver. – super9

0

Disable Fäden in uwsgi laufen.

Sie haben Problem "Globale interpretator Lock"

enable-Threads = True < - ich denke Problem hier, versuchen Falsch

Verwandte Themen