はしばみあきら blog

プログラミングアウトプットするブログ。202010スタート

【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としておきます

なお使用できるのは

の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したか

など色々とやってみましょう

自分の場合は色々やってる内に動くようになりました笑

またボチボチと更新していきます