2016-03-23 11 views
0

Ich habe eine Flask-Anwendung auf Webfaction mit mod_wsgi bereitgestellt. Meine Anwendung ist ziemlich einfach, implementiert aber Flask-SocketIO, was mir Probleme bereitet. Mein Code funktioniert auf meinem lokalen Host gut, aber jetzt, da er auf meinem Webfaction-Server läuft, kann der Client keine Verbindung zu meinem Socket herstellen. Ich bin mir nicht ganz sicher, woher meine Probleme kommen - ich gehe davon aus, dass ich meine Apache-Konfigurationsdatei nicht richtig eingerichtet habe, aber das stimmt möglicherweise nicht.Flask-SocketIO auf WebFaction über mod_wsgi ausführen

Auf der Client-Seite erhalte ich einen Fehler 400 (Bad Request) auf beide GET & POST Anrufe an den Websocket. Zwischenzeitlich sehe ich eine Warnung, die mir mitteilt, dass die Steckdose geschlossen wurde, bevor eine Verbindung hergestellt wurde. Ich bekomme auch gelegentlich einen Fehler, der besagt, dass während des WebSocket-Handshakes ein Fehler aufgetreten ist.

Meine Apache httpd.conf Datei ist wie folgt:

ServerRoot "/home/<user>/webapps/<my_app>/apache2" 

LoadModule authz_core_module modules/mod_authz_core.so 
LoadModule dir_module  modules/mod_dir.so 
LoadModule env_module  modules/mod_env.so 
LoadModule log_config_module modules/mod_log_config.so 
LoadModule mime_module  modules/mod_mime.so 
LoadModule rewrite_module modules/mod_rewrite.so 
LoadModule setenvif_module modules/mod_setenvif.so 
LoadModule wsgi_module  modules/mod_wsgi.so 
LoadModule unixd_module  modules/mod_unixd.so 

Listen 18161 
KeepAlive On 
SetEnvIf X-Forwarded-SSL on HTTPS=1 
ServerLimit 1 
StartServers 1 
MaxRequestWorkers 5 
MinSpareThreads 1 
MaxSpareThreads 3 
ThreadsPerChild 5 

WSGIDaemonProcess <my_app> processes=2 threads=12 python-path=/home/<user>/webapps/<my_app>:/home/<user>/webapps/<my_app>/lib/python2.7 
WSGIProcessGroup <my_app> 
WSGIRestrictEmbedded On 
WSGILazyInitialization On 

WSGIScriptAlias//home/<user>/webapps/<my_app>/wsgi.py 

Ich habe einige Beiträge über proxy_module & proxy_http_module gesehen, aber ich bin mir nicht ganz sicher, ob ich brauche das und wenn ja, wie genau es zu konfigurieren . Jede Anleitung zu diesem Thema wäre sehr willkommen!

Antwort

1

Das Zeug über proxy_module und proxy_http_module ist für die Verwendung von Apache als Front-End-Proxy für eine Back-End-WebSockets-App. Es ist nicht anwendbar auf das, was Sie versuchen zu tun.

mod_wsgi ist nicht wirklich geeignet, um Websocket-Anwendungen zu bedienen. Verwenden Sie es nicht. Verwenden Sie stattdessen eine der empfohlenen Bereitstellungsoptionen unter Deployment section of the Flask-SocketIO docs.

Um beispielsweise die erste empfohlene Option (dh den eingebetteten Server) für WebFaction zu verwenden, installieren Sie zuerst das Modul eventlet. Ich gehe davon aus, dass Sie Flask und Flask-SocketIO bereits installiert haben.

Als nächstes installieren Sie eine 'benutzerdefinierte WebSockets-App, die auf Port hört' -Anwendung über das WebFaction-Kontrollfeld. Notieren Sie sich den zugewiesenen Port der App und weisen Sie dann die App einer Website im Steuerungsfeld zu. Sie müssen den Port der App nicht öffnen.

Konfigurieren Sie als Nächstes Ihre Flask-SocketIO-App so, dass sie auf dem Port ausgeführt wird, der Ihrer websockets-App zugewiesen ist. Der einfachste Weg, dies zu tun ist, um den Port zu socketio.run, zum Beispiel passieren:

if __name__ == '__main__': 
    socketio.run(app, port=12345) 

In Ihrem Javascript, wie diese verbinden:

var socket = io.connect('http://' + document.domain + ':' + location.port + namespace); 

Schließlich starten Sie einfach die App:

python2.7 whatever.py 

An diesem Punkt wird Ihre App auf der Domäne ausgeführt, die Sie der Website zugewiesen haben, die Sie ein paar Schritte zurück eingerichtet haben. Wenn Sie die Site laden, sortiert JS die Verbindungsinformationen von document.domain und location.port aus. Wenn Sie die Entwicklungstools Ihres Browsers öffnen (Chrome-Inspektor oder was auch immer), werden die Websocket-Verbindungen angezeigt, die an ws://yourdomain.com/ vorgenommen werden.

Hoffe, dass hilft!

+0

muss ich für meine Flask-SocketIO-App eine andere App über das Bedienfeld erstellen? – TukangBeling

+0

Ok ich habe es jetzt funktioniert, danke – TukangBeling