2016-10-12 1 views
0

私はPlayフレームワークアプリケーションを実行しています。このフレームワークアプリケーションでは、1つのjavascriptがサーバー上のwebsocketに接続する必要があります。 サーバーは、以下の設定で、Playアプリケーションの前でSSLを持つnginxのプロキシを実行している:プロキシサーバーをnginx経由でPlayサーバーにセキュアにします

proxy_buffering off; 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-Proto $scheme; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
proxy_set_header Host $host; 
proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=one:10m max_size=500m; 
proxy_cache_methods GET HEAD; 
proxy_cache_key $host$uri$is_args$args; 
proxy_cache_valid 200 10m; 
proxy_http_version 1.1; 

upstream backend { 
    server 127.0.0.1:9001; 
} 

server { 
    listen 443 ssl default_server; 
    listen [::]:443 ssl default_server; 
    ssl on; 
    server_name www.studiecirkel.net; 
    gzip off; 

    ssl_certificate  /home/sfr/certs/ssl-bundle.crt; 
    ssl_certificate_key /home/sfr/certs/server.key; 
    ssl_session_timeout 5m; 
    ssl_ciphers  EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA; 
    ssl_prefer_server_ciphers on; 

    location/{ 
     proxy_pass https://backend; 
     auth_basic "Internt alpha-test"; 
     auth_basic_user_file /home/sfr/studiecirkel/.htpasswd; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     tcp_nodelay on; 
    } 
} 

ジャバスクリプトは次のようになります。

var chatSocket = new WS("@routes.HomeController.connectChat().webSocketURL(request)"); 

そしてconnectChat方法は、次のようになります:

public LegacyWebSocket<JsonNode> connectChat() { 
     return new LegacyWebSocket<JsonNode>() { 
      public void onReady(WebSocket.In<JsonNode> in, WebSocket.Out<JsonNode> out){ 
       // Some internal code here 
      } 
     }; 
    } 

これは、すべてがローカルホスト上にあったときにうまくいきましたが、クラウドにサーバーがあるため、Chroで次のエラーが表示されます。 mium:へ

のWebSocket接続 'WSS://バックエンド/メッセージ/ソケット/' に失敗しました:接続確立でエラーが発生します。net :: ERR_NAME_NOT_RESOLVED

私もからproxy_passディレクティブアドレスを切り替え試してみました

バックエンドを127.0.0.1:9001に変更し、代わりにERR_CONNECTION_REFUSEDを取得します。

"proxy_pass http://backend"を使用して、プロキシの背後で非SSLに切り替えると、ブラウザはwebsocket接続が安全でないため接続できないと表示します。

ここで間違っていますか? WebソケットはプロキシされたURLに直接接続できる必要がありますか? SSL対応のWebソケットはこのように動作しませんか?

答えて

0

問題は、それがサーバーに解決されるため、ERR_NAME_NOT_RESOLVEDエラーが登場している。このコード

var chatSocket = new WS("@routes.HomeController.connectChat().webSocketURL(request)") 

です。あなたのケースでクライアントがバックエンドであるホストの解決に失敗した場合のDNSエラーです。ブラウザはそれを解決できません。

はコードの下でこれを交換し、それが

var chatSocket = new WS("messages/socket/"); 

アップデートを動作するかどうかを確認してください。 上記のコードのように思われません。以下は、ドキュメントオブジェクトからホストを取得する方法です

var webSocketURL = 'wss://' + window.location.host + '/messages/socket/'; 
var chatSocket = new (webSocketURL); 
+0

「wss://mydomain.com/messages/socket/」を追加する必要がありましたが、それはうまくいきました。 – DeveloperInResidence

+0

ホスト/ドメインをハードコードしないでください。 document.windowからホストを派生させる私の更新された答えを見てください –

関連する問題