2016-07-16 31 views
2

私はOpenshiftクラウドにDjangoプロジェクトを展開しています。このプロジェクトでは、channelsとWebsocketを使用して非同期で動作させています。問題は、サーバーサイドで稼働しているDaphneサーバーにブラウザからWebソケットを正常に接続できないことです。DaphneサーバーがHTTPS上のWebソケットに接続できません

私はdjango(python2.7)とredisカートリッジを使って動作させています。このような

post_deployスクリプト私が使用しているルックス:

... 
python manage.py runworker -v2 && daphne myapp.asgi:channel_layer -p 8443 -b $OPENSHIFT_REDIS_HOST -v2 
... 

は、ここに私のDjangoの設定です。 routing.py

... 
ALLOWED_HOSTS = [ 
    socket.gethostname(), 
    os.environ.get('OPENSHIFT_APP_DNS'), 
] 

CHANNEL_LAYERS = { 
    "default": { 
     "BACKEND": "asgi_redis.RedisChannelLayer", 
     "CONFIG": { 
      "hosts": [("redis://:{}@{}:{}/0").format(
       OPENSHIFT_REDIS_PASSWORD, 
       OPENSHIFT_REDIS_HOST, 
       OPENSHIFT_REDIS_PORT 
       )], 
     }, 
     "ROUTING": "myapp.routing.channel_routing", 
    }, 
} 
... 

settings.pyconsumers.py

... 
ws_routing = [ 
    routing.route("websocket.connect", ws_connect), 
    routing.route("websocket.receive", ws_receive), 
    routing.route("websocket.disconnect", ws_disconnect), 
] 

channel_routing = [ 
    include(ws_routing, path=r"^/sync"), 
] 
... 

。私はダフネの設定と理由thisドキュメントのWebSocketを設定でポート8443を使用してい

var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws"; 
var path = ws_scheme+'://'+window.location.host + ':8443/sync'; 
var ws = new WebSocket(path); 
ws.onmessage = function(message) { 
    console.log(message.data); 
} 
ws.onopen = function() { 
    this.send('WS Connecting to receive updates!'); 
} 

注意:クライアント側で

def ws_connect(message): 
    Group("notifications").add(message.reply_channel) 

def ws_disconnect(message): 
    Group("notifications").discard(message.reply_channel) 

def ws_receive(message): 
    print "Receiving: '%s' from %s" % (message.content['text'], message.content['reply_channel']) 

は、私はこのコードを実行していますよ。また、ダフネはOpenshift(権限の問題)で0.0.0.0にバインドすることはできませんので、アドレスをOPENSHIFT_HOSTにバインドされて

出力は次のようになります。

first

second

third

すべてがクライアント側では問題なく表示されますが、覚えていれば個のconsumer.pyこれは:

私の端末では、サーバは「Receiving from」のようなものを印刷する必要がありますが、そうではありません。ここで私は何が欠けているのですか?

tl; dr:クライアント側Webソケットは正しく接続されているように見えますが、サーバーはメッセージを確認して印刷していません。

答えて

4

私はそれを動作させることができました。この問題はポートフォワーディングと関連しているようで、私はopenshiftクラウド上のApacheサーバーを介してWebソケットをdaphneサーバーに接続することができませんでした。この問題解決するために

1)私はapacheのconfファイルを変更しても、私はそれを変更することを決めたので、WebSocketををサポートするためにmod_proxy_wstunnelをインストールするには、Apacheを更新することができませんでしたDjangoのプロジェクトのデフォルトのカートリッジ付き。 また、mod_proxy_wstunnelはApache 2.4で動作しますが、デフォルトのカートリッジは2.2を使用します。

チャンネルのドキュメントは、nginxを使用することをお勧めします。だから私はcartridgeを見つけたので、それをuwsgiとdjangoと一緒に使うことができます。

私はそのリポジトリの指示に従いましたが、コードをプッシュする前に、アクションフックをちょっと微調整して、それらのパッケージの最新バージョンを取得し、サンプルdjangoプロジェクトを私のものに置き換えました。私はrequirements.txtと同じことをしました。

2)押した後、redisカートリッジを追加しました。

3)その後、私はuwsgi.yaml微調整するために進行し、テンプレートが適切な値を設定するようにカートリッジを提供することnginx.conf:

uwsgi: 
    socket: $OPENSHIFT_DIY_IP:15005 
    pidfile: $OPENSHIFT_TMP_DIR/uwsgi.pid 
    pythonpath: $OPENSHIFT_REPO_DIR/$APP_DIR 
    module: $APP_NAME.wsgi:application 
    virtualenv: $OPENSHIFT_DATA_DIR/virtualenv 

uwsgi.yaml

nginx.conf
... 
http { 
    ... 
    server { 
     listen  $OPENSHIFT_DIY_IP:$OPENSHIFT_DIY_PORT; 
     server_name localhost; 

     set_real_ip_from $OPENSHIFT_DIY_IP; 
     real_ip_header  X-Forwarded-For; 

     location/{ 
      uwsgi_pass $OPENSHIFT_DIY_IP:15005; 
      include  uwsgi_params; 
     } 

     location /sync { 
      proxy_pass http://$OPENSHIFT_DIY_IP:8443; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
     } 
     ... 
    } 
} 
私は、次のしている私のpost_deployスクリプトで

... 
python manage.py runworker -v2 & 
daphne myapp.asgi:channel_layer -p 8443 -b $OPENSHIFT_DIY_IP -v2 & 
... 

だから、ダフネは$ OPENSHIFT_DIY_IPで待機している:8443をし、nginxのは、このようなWebSocketをからの要求を受信する場合:

var path = 'wss://'+window.location.host + ':8443/sync'; 
var ws = new WebSocket(path); 
ws.onmessage = function(message) { 
    alert(message.data); 
} 
ws.onopen = function() { 
    this.send('WS Connecting to receive updates!'); 
} 

を今私は見ることができます:

terminal

、ブラウザで:

alert

は働いている。私はこれが私以外の誰かを助けることができることを願っています。

関連する問題