Rails6 Action CableをNginx & PostgreSQLの本番環境で使用する設定方法

Rails6 Action CableをNginx & PostgreSQLの本番環境で使用する設定方法

September 19, 2020

Action Cable を Production 環境で使用するときには、開発環境+ α の設定が必要であり、若干手間取ったため、今後のために記録に残しておく。

…といっても手を加える内容はそれほど多くなく、全3点。

なおタイトルにある通り、想定環境は、Rails6 で Nginx と PostgreSQL を使っている本番環境。

(設定不要)config/routes.rb #

先に不要な記載を整理しておくと、開発環境・本番環境いずれでも、掲題の通り routes.rb への設定は不要。

Rails5 までは以下の記載が必要だったようだが、Rails6 では不要となった(明記しても問題はないが、特に何も変わらない)。

# config/routes.rb

mount ActionCable.server => '/cable' # この記載は不要

これ以降は必要な記載のため、順次設定していくこと。

1.config/cable.yml #

production の部分に以下を通り記載する。

# config/cable.yml

production:
  adapter: postgresql
# url: <%= ENV.fetch("REDIS_URL") { "redis://localhost:6379/1" } %>
# channel_prefix: xxxx_production

production のエリアに、adapter: postgresql と記載する。

postgresql を指定した場合、url と channel_prefix は記載不要。

なお、development のエリアに書いてある adapter: async を本番で使用することはできるものの推奨されてはいないので、広く公開するようなアプリであればやめておこう。

8.1.1.1 Async アダプタ

async アダプタは development 環境や test 環境での利用を意図したものであり、production 環境で使うべきではありません。

Rails ガイド v6.0

2.config/environments/production.rb #

config.action_cable.allowed_request_origins の部分を以下のように記載する。

# config/environments/production.rb

# Mount Action Cable outside main process or domain.
# config.action_cable.mount_path = nil
# config.action_cable.url = 'wss://example.com/cable'
# config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]
config.action_cable.allowed_request_origins = [ 'http://example.com',
                                                /http:\/\/example.*/,
                                                'https://example.com',
                                                /https:\/\/example.*/ ]

3.Nginx の conf ファイル #

Action Cable を使うのに必要なのは、以下のファイル内容例の最下段にある、location /cable ブロックの部分。これを conf ファイルに記載する。

# xxxx.conf

upstream unicorn_アプリケーション名 {
  server unix:/var/www/アプリケーション名/current/tmp/sockets/unicorn.sock;
}
server {
  listen 443;
  ssl on;
  server_name example.com;
  root /var/www/アプリケーション名/current/public;
  access_log /var/log/nginx/アプリケーション名_access.log;
  error_log /var/log/nginx/アプリケーション名_error.log;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
  location / {
    try_files $uri @unicorn;
  }
  location @unicorn {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://unicorn_アプリケーション名;
  }
  location /cable {
    proxy_http_version 1.1;
    proxy_set_header Upgrade websocket;
    proxy_set_header Connection Upgrade;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://unicorn_アプリケーション名;
  }
}

以上 #

意外と簡単だが、必要な設定はこれだけ。

Rails ファイル更新後にデプロイするのと、Nginx ファイル更新後に反映させるのを忘れずに。