質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1798閲覧

【Ruby on Rails】本番環境でAction Cable を使用した双方向通信を行うと不定期にデータを受け取れない

koki0502

総合スコア19

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/07/30 08:57

編集2020/07/30 09:32

#実現したいこと
本番環境で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 の該当範囲をみてもエラーなどはないように見受けました。

些細なことでも結構ですので、思い当たる点などございましたらご教示頂けますと幸いです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

アプリケーションサーバーをUnicornからPumaに変更すると解決しました。
※コード等の変更は一切なし

投稿2020/08/19 03:24

koki0502

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問