【Rails】ActionCable AWS/Nginx/Pumaでデプロイする
前回作ったチャットアプリをAWSでデプロイしました
ちょっと沼った部分もあったので書いていきます
環境
条件として
- ローカルではちゃんと動作する
- 本番環境ではActionCable以外はしっかり表示される
ActionCableの設定を行う
おそらく、そのまま素でデプロイしたままの状態だと、テキストを入力させても通信が行われずリアルタイムにviewに反映されないままだと思います
変更を加えるのは
- config/enviroments/producion.rb
- config/cable.yml
EC2側の
- /etc/nginx/conf.d/app-name.conf
この3つです
まずはテキストエディタでconfigの設定を
# Mount Action Cable outside main process or domain # config.action_cable.mount_path = nil # config.action_cable.url = nil config.action_cable.allowed_request_origins = [ 'http://Elastic IP/' ] ActionCable.server.config.disable_request_forgery_protection = true
コメントアウトを外して書き換えと、新しい記述を加えます
以下、Railsガイドより一部抜粋
Action Cableは、指定されていない送信元からのリクエストを受け付けません。送信元リストは、配列の形でサーバー設定に渡します。
送信元リストには文字列のインスタンスや正規表現を利用でき、これに対して一致するかどうかがチェックされます。
config.action_cable.allowed_request_origins = ['https://rubyonrails.com', %r{http://ruby.*}]
すべての送信元からのリクエストを許可または拒否するには、次を設定します。
config.action_cable.disable_request_forgery_protection = true
配信元のアドレスが同じかどうか確認して、リクエストを許可する?みたいになるのかな?
次にymlファイルを
production: # adapter: redis # url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %> # channel_prefix: chat-app_production adapter: async
アダプタは、サブスクリションする時の設定ぽいです
production以下は、本番環境用なのでadapterにasyncを使うのは本来非推奨と、Railsガイドの方にも書いてあります
今回は運用とかではなく学習用で作っているのでとりあえずasyncでOKとしておきます
なお使用できるのは
- Redis
- PostgreSQL
の2つみたいです
EC2側にssh 接続して、カレントディレクトリからNginxのファイルを編集していきます
$ sudo vi /etc/nginx/conf.d/chat-app.conf
sudoを付けなくて変更できない!と延々言われました...sudoは管理者権限で変更できるようになるコマンドっぽいです
中身を書き換えます
server{ } の中に追記していきます
location /cable { proxy_pass http://puma/cable; proxy_http_version 1.1; proxy_set_header Upgrade websocket; proxy_set_header Connection Upgrade; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
自分の場合はこれでひとまず動くようになりました
途中で時間がかかったところ
- jsが全く効かない
これに関してはassets以下のjsをプリコンパイルしていませんでした
ec2側アプリのディレクトリで
$ bundle exec rails assets:precompile RAILS_ENV=production
これで解決
- 本番環境デベロッパーツールのconsoleで404エラー
- 本番環境デベロッパーツールのconsoleでfailed: WebSocket is closed before the connection is established
こいつらがエラーとして出る時は接続がうまくできていません
config/enviroments/producion.rbでIPアドレスが正しいか、もしくはドメイン名が正しいか
/etc/nginx/conf.d/chat-app.confの値が正しいか
ローカル環境を本番環境にpushしたか
など色々とやってみましょう
自分の場合は色々やってる内に動くようになりました笑
またボチボチと更新していきます