railsとnginxをunixドメインソケットで連携させる

前回の記事で、リーバースプロキシを使って Nginx と rails を連携させてみました。
今回は、Unix ドメインソケットで連携を試みてみます。

目次

参考

rails アプリを作成

最低限のアプリケーションを作ってあるものとする。

puma.rb を編集

config/puma.rbを編集する。

1
2
3
4
5
#ポート設定をコメントアウトして
#port ENV.fetch("PORT") { 3000 }

#ソケットファイルの作成を指定する
bind "unix://#{Rails.root}/tmp/sockets/puma.sock"

bundle exec rails sで起動すると、以下のメッセージが出ます。

1
* Listening on unix:///root/testapp/tmp/sockets/puma.sock

どうやらソケットをリッスンできているらしい。

nginx を設定

Nginx の設定追加は,/var/nginx/conf.dにファイルを追加することで行います。
/var/nginx/conf.d/rails_apps_unix.confを以下のように作成します。

/var/nginx/conf.d/rails_apps_unix.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
upstream rails_app_unix {
server unix:///root/testapp/tmp/sockets/puma.sock;
}

server {
server_name xxx.xxx.xxx.xxx;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

root /root/testapp/public;

location / {
try_files $uri @rails_app;
}

location @rails_app {
proxy_pass http://rails_app_unix;
}
}

rails アプリケーションの実行ユーザーと nginx の実行ユーザーが同じでないと、unix:///root/testapp/tmp/sockets/puma.sockにアクセスできない。
Permission deniedとなってしまう。
/var/nginx/nginx.confを編集して nginx の実行ユーザーを rails の実行ユーザーに合わせる。

1
2
3
4
5
# 初期はnginx
user nginx;

# rootに変える。セキュリティ上の問題はあるので、本番では行わないこと!
user root;

設定が終わったら、systemctl restart nginxを実行し、nginx を再起動。
実行ユーザーが変わっていることを確認しておきます。

1
2
3
root      4225  0.0  0.0 120904  2148 ?        Ss   00:44   0:00 nginx: master process /usr/sbin/nginx
root 4226 0.0 0.0 121416 3596 ? S 00:44 0:00 nginx: worker process
root 4233 0.0 0.0 112728 968 pts/2 R+ 00:49 0:00 grep --color=auto nginx

確認

コンソールを開いてアプリケーションのディレクトリで、bundle exec rails sで起動します。

[サーバーのIP]にアクセスしてみます。
すると、いつもの「Yay! You’re on Rails!」が表示される画面になりました。
[サーバーのIP]/toolsなども問題なく動きます。
nginx から、puma に転送ができていることを確認できました。


今回は、nginx で受けたアクセスを unix ドメインソケットを使って puma に転送、
nginx と rails の連携ができました。

ポイントは、次の 2 つでした。

  • nginx と rails の実行ユーザーをそろえる
  • SELinux は必ず止めておく

これに気が付くまでに、数時間かけてしまいました。
もう少し、対応できるまでの時間を押さえたい所です。

ではでは。