2016-01-27 7 views
6

こんにちは私はror 5.0.0ベータ(プーマ付き) を使って簡単なチャットを提供しようとしています(ローカルホストでは問題ありません) 。RoR 5.0.0 ActionCable wss WebSocketハンドシェイク:予期しない応答コード:301

これは私のnginxの構成です: URL:Redisの:// localhostを:1分の6379

upstream websocket { 
    server 127.0.0.1:28080; 
} 


server { 

    listen 443; 
    server_name mydomain; 
    ssl_certificate ***/server.crt; 
    ssl_certificate_key ***/server.key; 
    ssl on; 
    ssl_session_cache builtin:1000 shared:SSL:10m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_ciphers 
HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4; 
    ssl_prefer_server_ciphers on; 
    access_log /var/log/nginx/jenkins.access.log; 

    location/{ 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Proto $scheme; 
     proxy_pass http://localhost:3000; 
     proxy_read_timeout 90; 

     proxy_redirect http://localhost:3000 https://mydomain; 


    location /cable/{ 
     proxy_pass   http://websocket/; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_set_header Host $http_host; 
     break; 
    } 

    } 

これはのconfig/Redisの/ cable.yml

生産です

開発: url:redis:// localhost:6379/2

テスト: URL:Redisの:// localhostを:3分の6379

設定/環境/ production.rb

# Action Cable endpoint configuration 
    config.action_cable.url = 'wss://mydomain/cable' 
    # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] 

    # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. 
    config.force_ssl = false 

そして、これは私が受けてるのエラーです:

アプリケーション - [...]。js:27 'wss:// mydomain/cable'へのWebSocket接続に失敗しました:WebSocketハンドシェイク中にエラーが発生しました:予期しない応答コード:301

ヒント? :)ありがとう

答えて

2

私ははのPhusion旅客を追加を解決しました。

nginxの設定ファイルは以下のようになります。

server{ 
listen 80; 
passenger_enabled on; 
passenger_app_env production; 
passenger_ruby /../ruby-2.3.0/ruby; 
root /path to application/public; 
client_max_body_size 4G; 
keepalive_timeout 10; 
[...] 

    location /cable{ 
     passenger_app_group_name websocket; 
     passenger_force_max_concurrent_requests_per_process 0; 
    } 
} 

あなたはデフォルトフォルダのconfig/Redisの/ cable.ymlを削除し、のみ/設定にそのファイルを移動しています。 SSLについては

は単にデフォルトのSSLオプションを有効にして、それが作品になります.-)ヘルプ

0

あなたのwebsocket URIはであり、/cableではないので、後者はlocation /ブロックに当ります。試してみてください:

location /cable { 
    rewrite ^/cable$/break; 
    rewrite ^/cable(.*)$ $1 break; 
    proxy_pass   http://websocket; 
    ... 
} 

はまた、わからないあなたはそこにbreak;を必要としています。私は2つのlocationブロックの間にある不足している}が疑問の誤植であると推測します。

EDIT1:正しい上流マッピングを復元するためにrewriteを追加しました。

EDIT2:代替ソリューションは、明示的にこのよう/cable//cableを書き換えることである:

location = /cable { rewrite^/cable/ last; } 
location /cable/ { 
    proxy_pass http://websocket/; 
    ... 
} 
+0

ため、誰もが場所/ケーブル/ {...} /ケーブル私を返すように変更

感謝「のWebSocket接続」にしますwss:// mydomain/cable 'failed:WebSocketハンドシェイク中にエラーが発生しました:予期しない応答コード:502 " –

+0

サービスがポート28080で実行されていることを確認してください。 –

+0

ファイアウォールがポートをブロックしていました。 "upstream websocket" {127.0.0.1:4443} - > WebSocketハンドシェイク中のエラー:予期しない応答コード:404少なくとも私のエラーコードがxdを変更しています –

0

私は、この特定の問題を解決しようと昨日、ほぼ5時間を費やしています。私はws.example.comと呼ばれるwebsocket接続用に別のドメインを使用してしまい、他のすべてが301 redirectという結果に終わった。

ここに私のnginx.confファイルがあります。私はSSLの部分を削除しましたが、自分で挿入することができます。このバージョンより前のものはすべてwebsocketプロキシをサポートしていないので、nginx 1.4+が必要であることに注意してください。

upstream socket { 
    server unix:/mysocket fail_timeout=0; 
} 

upstream websocket { 
    server 127.0.0.1:28080; 
} 

map $http_upgrade $connection_upgrade { 
    default upgrade; 
    '' close; 
} 

server { 
    listen  443 ssl; 
    server_name ws.example.com; 
    access_log off; 

    # SSL configs here 

    location/{ 
     proxy_pass http://websocket/; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header Host $host; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
    } 
} 

server { 
    listen  443 ssl; 
    server_name example.com; 

    # SSL configs here 

    location @app { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    proxy_pass http://socket; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 10; 
} 

私はので、私は(バグが修正されるまで)安全な方法を行って、完全にActionCable.server.config.disable_request_forgery_protection = trueを使用してのチェッカーを回し期待通りallowed_request_originsが機能しなかったことをどこかで読みました。

私のcable.ruアクションケーブルのファイルです。

require ::File.expand_path('../../config/environment', __FILE__) 
Rails.application.eager_load! 

require 'action_cable/process/logging' 

Rails.logger.level = 0 
ActionCable.server.config.disable_request_forgery_protection = true 

run ActionCable.server 

私はGithubの最新のレールバージョンも使用しています。

gem "rails", github: "rails/rails" 
関連する問題