#実現したいこと
本番環境でAction Cable を使用した双方向通信を行いたい。
##現状
下記のツールを使用して、本番環境で機能を実装しています。
・AWS EC2 Amazon Linux 2
・nginx 1.12.2
・unicorn 5.4.1
・Ruby on Rails 5.2.4.2
挙動の詳細
デバイスA〜Dがあり全て機能を実装している同じページを開いている状態
1回目:デバイスAで情報を送信 → デバイスC、デバイスDが情報を受け取り画面に情報を反映する
2回目:デバイスAで情報を送信 → デバイスBが情報を受け取り画面に情報を反映する
3回目:デバイスAで情報を送信 → デバイスBが情報を受け取り画面に情報を反映する
4回目:デバイスAで情報を送信 → デバイスBが情報を受け取り画面に情報を反映する
5回目:デバイスAで情報を送信 → デバイスC、デバイスDが情報を受け取り画面に情報を反映する
6回目:デバイスCで情報を送信 → デバイスDが情報を受け取り画面に情報を反映する
7回目:デバイスCで情報を送信 → デバイスA、デバイスBが情報を受け取り画面に情報を反映する
8回目:デバイスAで情報を送信 → デバイスBが情報を受け取り画面に情報を反映する
といったように、情報送信のつど不規則な挙動をします。
なお、ローカル環境では問題なく動作します。
###コード
※ページ下部のボタンを押すと「hoge」がアラートで表示される機能
機能実装ページ
rb
1<div class="talk_room"> 2 3 <div class="talk_room_content"> 4 5 <h5 class="title">Action Cable</h5> 6 7 <form class="talk_room_form"> 8 <button id="button" class="btn btn-info">送信</button> 9 </form> 10 11 </div> 12 13</div> 14<script> 15 var button = document.getElementById('button'); 16 console.log(button); 17 18 button.addEventListener('click', function () { 19 App.function.post("hoge"); 20 }); 21 console.log("準備完了"); 22</script>
ActionCable実装に使用するrbファイル
class FunctionChannel < ApplicationCable::Channel def subscribed stream_from 'function_channel' end def unsubscribed # Any cleanup needed when channel is unsubscribed end def post(data) ActionCable.server.broadcast('function_channel', data) end end
ActionCable実装に使用するjsファイル
App.function = App.cable.subscriptions.create("functionChannel", { connected: function() { // Called when the subscription is ready for use on the server }, disconnected: function() { // Called when the subscription has been terminated by the server }, //メッセージを受け取った際の処理 received: function(data) { return alert(data['message']); }, //フォームの入力を受け取る post: function(content) { return this.perform('post', { message: content }); } });
nginx設定ファイル
*.conf
conf
1error_log /var/www/rails/*/log/nginx.error.log; 2access_log /var/www/rails/*/log/nginx.access.log; 3 4upstream unicorn_server { 5 server unix:/var/www/rails/*/tmp/sockets/.unicorn.sock fail_timeout=0; 6} 7 8server { 9 listen 80; 10 client_max_body_size 4G; 11 server_name www.*.co.jp *.co.jp; 12 13 # webサーバとクライアントの通信時にHTTP通信をタイムアウトせずに待つ秒数 14 keepalive_timeout 5; 15 16 # Location of our static files 17 root /var/www/rails/*/public; #自分のアプリケーション名に変更 18 19 location ~ ^/assets/ { 20 root /var/www/rails/*/public; #自分のアプリケーション名に変更 21 } 22 23 location / { 24 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 25 proxy_set_header Host $http_host; 26 proxy_redirect off; 27 28 if (!-f $request_filename) { 29 proxy_pass http://unicorn_server; 30 break; 31 } 32 } 33 34 35 location /cable { 36 proxy_pass http://unicorn_server/cable; 37 proxy_http_version 1.1; 38 proxy_set_header Upgrade websocket; 39 proxy_set_header Connection Upgrade; 40 proxy_set_header X-Real-IP $remote_addr; 41 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 42 proxy_set_header X-Forwarded-Proto https; 43 } 44 45 46 error_page 500 502 503 504 /500.html; 47 location = /500.html { 48 root /var/www/rails/*/public; #自分のアプリケーション名に変更 49 } 50}
log/production.log の該当範囲をみてもエラーなどはないように見受けました。
些細なことでも結構ですので、思い当たる点などございましたらご教示頂けますと幸いです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。