2017-02-16 14 views
22

私はをwebsocket機能に使用するRails 5アプリケーションを持っています。ActionCableが本番環境では動作しなくなった

私の開発環境では、すべて正常に動作し、ブラウザクライアントはAction Cableチャネルに正常に接続します。

私の生産環境では、Action Cableはある時点で動作していましたが、突然明白な原因がなく突然機能しなくなりました。

開発マシンAction Cableでアプリを実行しているときにRAILS_ENVproductionに変更した場合、正常に動作します。基本的な環境は同じですが、実際のプロダクションマシンでアプリを実行すると、何か違うようです。

私はクロームコンソールに表示特定のエラー:

mydomain.com/:1 WebSocket connection to 'wss://mydomain.com/cable' failed: WebSocket is closed before the connection is established。他のブラウザでも同様のエラーが表示されるため、ブラウザに関連しているようには見えません。妨害していないことを確かめるために、テスト中にadblockersを無効にしました。

Development.rb ENV関連のセットアップ:

config.action_cable.url = "ws://localhost:#{port}/cable" 

Production.rb ENV関連のセットアップ:

hostname = ENV.fetch('HOSTNAME') 
    port = ENV.fetch('PORT') 
    base_url = "#{hostname}:#{port}" 

    config.action_cable.url = "wss://#{hostname}/cable" 
    config.action_cable.allowed_request_origins = ["https://#{base_url}", "https://#{hostname}"] 

私はウェブサーバとしてPuma使用。 Webサーバーは、有効な証明書がインストールされているSSL接続を提供します。プロダクションマシンでは、Pumaはポート3000でアプリケーションを提供しますが、これはルータのポート443に転送されます。

私の開発マシンとプロダクションでのアプリケーションの実行との唯一の顕著な違いは、本番環境ではSSLが使用されていることです。

+0

AWSを使用していますか? – Shannon

+0

@Shannon Nope、Synology NAS上のドッカーコンテナを使用してホストされています – edwardmp

+0

repの不足でこの問題についてコメントすることはできません。あなたはこれを提供するために何を使用していますか? Nginx? Apache?ローカルに設定された 'production'を使って動作するという事実は、Webサーバーの設定に問題があることを示します。どのDockerコンテナを実行していますか? NAS上でどのようなOSが動作していますか?これらのすべての情報が必要です。 – FanaHOVA

答えて

7

代わりに安全なトラフィックにデフォルトのポート443で待機するようにしようと、私は今、安全に、おそらくレール/ ActionCable自体で、これはバグであると結論することができます。これは他のレポートによって裏付けられています。ある時点でうまくいきましたが、これはRailsを使用したときです。私が5.0.1に更新したとき、それは壊れて、それは5.0.2に壊れたままです。私はRailsプロジェクトのGitHub issue trackerに関する問題を開いています。

編集:2017年7月:RailsはRackソケットの読み書き方法を変更しましたが、使用する実際のWebサーバーソフトウェアはこれらの非ブロック型の読み書き方法をサポートする必要があります。私の場合、Pumaはその時点ではWebSocketが機能しませんでした。 Pumaには、この問題の回避策を含む新しいリリースが追加されました。

+0

私の場合、ARモデルの間違ったメモです対応するモデルが異なるチャットルーム用に読み込まれていませんでした。 – artificis

2

あなたが安全でないWebトラフィックを処理するためにそれを設定しているが、本番環境でセキュアなトラフィックを処理するように設定されているので、あなたの問題文のあたり

  • 開発環境は、著作物として。

Development.rb ENV関連のセットアップ:

config.action_cable.url = "ws://localhost:#{port}/cable" 

Production.rb ENV関連のセットアップ:

config.action_cable.url = "wss://#{hostname}/cable" 

あなたが設定したネットワーク設定によると、ポート3000へのSSLポートのリダイレクトPUMA rbサーバーからのWeb要求を処理します。

今私が終わっここを参照してください問題はwss://#{hostname}であることはあなたのリダイレクトポート3000

+0

あなたは正しいですが、私の開発マシンで私はSSLを使用していません。ポート443は3000に転送されるため、実際には違いはありません。 – edwardmp

+0

URLにポートを追加する必要があります。ホスティングサーバーのpumaがトラフィックの操作を処理します。 – Mozfox

+0

大丈夫私は2つのポート間の転送のために違いがないはずですが、それを試してみましょう – edwardmp

関連する問題