2016-03-23 13 views
0

mod_wsgiを使用してWebFactionにFlaskアプリケーションをデプロイしました。私のアプリケーションはかなりシンプルですが、問題を引き起こしているFlask-SocketIOを実装しています。私のコードはlocalhost上で正常に動作しますが、クライアントが自分のソケットに接続できない私のWebfactionサーバー上で動作しています。私は私の問題がどこから来ているのかは分かりません - 私は自分のapache設定ファイルを正しく設定していないと仮定していますが、これは当てはまりません。mod_wsgiを使ってWebFactionでFlask-SocketIOを実行する

クライアント側では、GET &のPOST呼び出しで400(Bad Request)エラーが発生します。断続的に、接続が確立される前にソケットが閉じられたことを知らせる警告が表示されます。また、WebSocketハンドシェイク中にエラーが発生したことを時折示すエラーが表示されます。次のように

私のapacheのhttpd.confファイルには、次のとおりです。

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 

私はproxy_module & proxy_http_moduleに関するいくつかの記事を見てきましたが、私は、私はそれが必要な場合はかなりわからないんだけど、それを設定する方法を正確にそうならば。この問題に関するガイダンスは非常に高く評価されます。

答えて

1

proxy_moduleproxy_http_moduleについては、ApacheをバックエンドWebソケットアプリのフロントエンドプロキシとして使用しています。あなたがしようとしているものには適用されません。

mod_wsgiはwebsocketアプリケーションのサービスにはあまり適していません。代わりに、Deployment section of the Flask-SocketIO docsで推奨されている展開オプションのいずれかを使用してください。

たとえば、WebFactionで最初に推奨されるオプション(組み込みサーバー)を使用するには、まずeventletモジュールをインストールします。私はあなたがすでにこの時点でFlaskとFlask-SocketIOをインストールしたと仮定しています。

次に、WebFactionコントロールパネルから「ポート上でリッスンするカスタムWebsocketsアプリケーション」をインストールします。アプリの割り当てられたポートを書き留めてから、コントロールパネルのウェブサイトにアプリを割り当てます。アプリのポートを開く必要はありません。

次に、Flask-SocketIOアプリケーションをWebソケットアプリケーションに割り当てられたポートで実行するように設定します。

python2.7 whatever.py 
:最後に、ちょうどアプリを実行し

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

:あなたのJavaScriptでは

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

を次のように接続します。これを行う最も簡単な方法は、例えば、socketio.runにポートを渡すことです

その時点で、いくつかのステップを設定したウェブサイトに割り当てたドメインにアプリが起動して実行されます。

サイトを読み込むと、JSは接続情報をdocument.domainlocation.portに分類します。ブラウザの開発ツール(Chromeのインスペクタなど)を開くと、ウェブソケットの接続はws://yourdomain.com/になります。

希望に役立ちます!

+0

Flask-SocketIOアプリのコントロールパネルから別のアプリを作成する必要はありますか? – TukangBeling

+0

さて、私はそれを今働いてくれました、ありがとう – TukangBeling

関連する問題