開発環境にJelasticを使用しています(まだ本番環境ではありません)。私のアプリケーションはUnicornで実行されていますが、ActionCableでWebSocketを発見し、それをアプリケーションに統合しました。
ローカルではすべて正常に動作していますが、Jelastic環境(デフォルトのNGINX/Unicorn構成)にデプロイすると、JavaScriptコンソールにこのメッセージが表示され、アクセスログに何も表示されません。
WebSocket connection to 'ws://dev.myapp.com:8080/' failed: WebSocket is closed before the connection is established.
以前はローカル環境にありましたが、必要なActionCable.server.config.allowed_request_originsを構成ファイルに追加することで解決しました。だから私はこれについて私の開発設定を再確認しました、そしてそれは大丈夫です。
そのため、ActionCable gitページで説明されているもの以外に、NGINX構成に固有の何かがあるかどうか疑問に思っていました。
bundle exec puma -p 28080 cable/config.ru
私のアプリケーションでは、 ここにリンクの説明を入力してください からすべてに従いましたが、NGINX構成については何も言及されていません
ActionCableを使用したWebSocketは非常に新しいことは知っていますが、誰かが私にそれをリードしてくれることを願っています
どうもありがとう
さて、ようやく問題を解決することができました。これを機能させるためのさまざまな手順は次のとおりです。
1.nginx:これが必要かどうかはわかりませんが、アプリケーションがUnicornで実行されているため、これをnginxconfに追加しました
upstream websocket {
server 127.0.0.1:28080;
}
server {
location /cable/ {
proxy_pass http://websocket/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
そして、私のconfig/environments/development.rb
ファイルで:
config.action_cable.url = "ws://my.app.com/cable/"
2.許可されたリクエストの発信元:ActionCable.server.config.allowed_request_origins
ファイルでconfig/environments/development.rb
を使用していても、接続が拒否されていることに気付きました。これは、ドキュメントに記載されているように、開発のデフォルトが http:// localhost:30 であるためではないかと思います。だから私はこれを追加しました:
ActionCable.server.config.disable_request_forgery_protection = true
私はまだ本番環境を持っていないので、それがどうなるかをまだテストすることができません。
3.Redisパスワード:ドキュメントに記載されているように、私はconfig/redis/cable.yml
を使用していましたが、次のエラーが発生していました:
Error raised inside the event loop: Replies out of sync: #<RuntimeError: ERR operation not permitted>
/var/www/webroot/ROOT/public/shared/bundle/Ruby/2.2.0/gems/em-hiredis-0.3.0/lib/em-hiredis/base_client.rb:130:in `block in connect'
そのため、redisサーバーのパスワードを設定する方法が良くないことがわかりました。
実際、次のようなことをする必要があります。
development:
<<: *local
:url: redis://user:[email protected]:6379
:Host: my.redis.com
:port: 6379
そして今、すべてが正常に機能しており、Actioncableは本当に印象的です。
たぶん私の問題のいくつかは些細なことでしたが、私はそれらを共有し、必要に応じて誰もが何かを選ぶことができるようにそれらをどのように解決したかを共有しています