Action Cable 本番使用時のNginxとCable.ymlの設定


はじめに

Action CableはWebSocket通信技術を用い、リアルタイムなチャットなどの機能を実装できる機能です。
AWS本番環境でのNginxとCable.ymlの設定に関して詰まった箇所を共有します。

前提

  • Rails 5.2.3
  • Puma
  • Nginx
  • AWSでデプロイ
  • Https通信

ローカルではWebsocket通信が正常に動いていることが前提です。

Nginxの設定追加

最後の一行ですが、Httpsの場合はこれがないとコンソール内に403エラーになるので注意してください。

proxy_set_header X-Forwarded-Proto https;

/etc/nginx/conf.d/app_name.conf
location /cable {
        proxy_pass http://puma;
        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;
        proxy_set_header X-Forwarded-Proto https;
        }

Cable.ymlの設定

ドキュメントにも記載されている通り、Production環境ではアダプターに"async"を使用するのは非推奨です。
同時に多数のアクセスがあると捌き切れなくなるようです。

8.1.1.1 Async Adapter
The async adapter is intended for development/testing and should not be used in production.

Heroku にも丁寧な解説があります。
本番環境にはRedisまたはPostgreSQL(DBとして使用しているなら)が必要です。
Real-Time Rails: Implementing WebSockets in Rails 5 with Action Cable

Lastly, Action Cable uses Redis as a data store for transient data, syncing content across instances of your application.

私は一度AWSでRedisを契約し、そのエンドポイントURLを下記productionのアダプターに設定していましたが、たまたまPostgreSQLを使用していたのでこれでいけました。
Redisお金かかるのでpostgresでよかった、、、

/config/cable.yml
development:
  adapter: async

test:
  adapter: async

production:
  adapter: postgresql

Production.rb

自分ドメインからのリクエストを許可します。

/config/environments/production.rb

  config.action_cable.url = 'wss://app_name.com/cable'
  config.action_cable.allowed_request_origins = [ 'https://app_name.com', /https:\/\/app_name.*/ ]
  ActionCable.server.config.disable_request_forgery_protection = true

終わりに

特にNginxの設定と、Redisなどアダプターの設定に大変ハマりました、、
ActionCableはRails5から追加された比較的新しい機能のためか、日本語記事ではHttpsやRedisについての言及が少なく、英語記事を参考にしました。
ご参考になれば幸いです。