###実現したいこと
本番環境でAction Cableを使ってチャット機能を実装したいです。
ローカル環境では、動いてるのですが、本番環境では動きません。
前提
・Rails 5.1.7
・ruby 2.5.0
・AWS EC2
・Nginx
・Capistrano
・MySQL
発生している問題・エラーメッセージ
ブラウザのコンソールに下記のようなエラーが出ています。
connection to 'ws://ドメイン名/cable' failed: Error during WebSocket handshake: Unexpected response code: 404
試したこと・ 該当のソースコード
#####①Nginxの設定
/etc/nginx/conf.d/example_cable.conf
upstream app_server { server unix:/var/www/techpit-match/shared/tmp/sockets/unicorn.sock; } server { listen 80; server_name ドメイン名; client_max_body_size 2g; root /var/www/techpit-match/current/public; location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; root /var/www/techpit-match/current/public; } try_files $uri/index.html $uri @unicorn; location @unicorn { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } location /cable { proxy_pass http://app_server/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; } }
#####②自分ドメインからのリクエストを許可。
/config/environments/production.rb
config.action_cable.url = 'wss://ドメイン名/cable' config.action_cable.allowed_request_origins = [ 'https://ドメイン名', /https://ドメイン名.*/ ] ActionCable.server.config.disable_request_forgery_protection = true
#####③Cable.ymlの設定
adapterにasyncは推奨されていないが、とりあえず動けばいいので、asyncと設定しました。
/config/cable.yml
production: adapter: async
補足
Cable.ymlの設定をredisにして、Amazon ElastiCacheを使ってみたりしたのですが、それでも動きませんでした。
Nginxとproduction.rbの記述に自信がありません。どなたか助けてください!
あなたの回答
tips
プレビュー