はじめに
Ruby on Rails で作ったアプリにリアルタイムチャットの機能を付けようとして、 ActionCable を使ったときに、
ローカル環境ではうまく動いたのですが、本番環境ではリアルタイムチャットの部分が動きませんでした。
原因を調べたところ、 ActionCable で使うwebsocket 通信をするために、 nginx の設定が必要なようでした。
自分へのメモ用に修正前と修正後のファイルだけ載せます。
nginx.conf (修正後)
websocketの通信を扱えるようにするために
location /cable以下を追加しました。
nginx.conf
# https://github.com/puma/puma/blob/master/docs/nginx.md
upstream app {
server unix:///app/tmp/sockets/puma.sock;
}
server {
listen 80;
server_name ***.***.***.***; # アプリのIPアドレス
keepalive_timeout 5;
# static files
root /app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
# static files
if (-f $request_filename) {
break;
}
if (-f $request_filename.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
#以下を追加
location /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;
proxy_set_header Host $http_host;
proxy_pass http://app/cable;
}
#追加部分ここまで
location ~* \.(ico|css|gif|jpe?g|png|js)(\?[0-9]+)?$ {
expires max;
break;
}
}
## nginx.conf (修正後)
元々のnginxの設定です。
nginx.conf
# https://github.com/puma/puma/blob/master/docs/nginx.md
upstream app {
server unix:///app/tmp/sockets/puma.sock;
}
server {
listen 80;
server_name ***.***.***.***; # アプリのIPアドレス
keepalive_timeout 5;
# static files
root /app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
# static files
if (-f $request_filename) {
break;
}
if (-f $request_filename.html) {
rewrite (.*) $1/index.html break;
}
if (-f $request_filename.html) {
rewrite (.*) $1.html break;
}
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
location ~* \.(ico|css|gif|jpe?g|png|js)(\?[0-9]+)?$ {
expires max;
break;
}
}