railsをサブディレクトリで稼働させる

Rails アプリケーションをサブディレクトリで動かしたいということがある。
以前、Apache でリバースプロキシを用いてサブディレクトリで Node アプリを稼働させたので、今回は Nginx でやってみる。

目次

参考

作るもの

1 台の nginx を設定した CentOS に Rails アプリケーションを 2 つ同居させる。
2 つのアプリケーションは、app1 app2とする。

rails アプリを作成

2 つのアプリケーションを作ってあるものとする。

環境設定を編集

config/environments以下のファイルを編集する。
とりあえず development.rb だけ編集するが、production.rbでも同様。

config/environments/development.rbを編集して、以下を追記する。

1
Rails.application.config.relative_url_root = "/app1"

app1 のconfig/environments/development.rbならば"/app1"とする。
app2 であれば"/app2"とする。

puma 設定変更

2 つのアプリケーションを同時に立ち上げると、デフォルトポートがぶつかってしまうので、ポートを変更する。
今回は、app1はデフォルトと同じく 3000 番。
app2は、3001 番とする。

書き換えるファイルは、config/puma.rbなので、以下のように編集する。

config/puma.rb
1
2
3
4
5
# 標準は3000番
port ENV.fetch("PORT") { 3000 }

# 2つ目は3001番に書き換える
port ENV.fetch("PORT") { 3001 }

config.ru を編集

config.ruを編集してサブディレクトに対応させる。
以下のように書き換えを行う。

config.ru(編集前)
1
2
3
require_relative 'config/environment'

run Rails.application
config.ru(編集後)
1
2
3
4
5
require_relative 'config/environment'

map ActionController::Base.config.relative_url_root || "/" do
run Rails.application
end

nginx を設定

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

/var/nginx/conf.d/rails_apps.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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;

location /app1 {
proxy_pass http://127.0.0.1:3000;
}
location /app2 {
proxy_pass http://127.0.0.1:3001;
}
}

編集が終わったら、systemctl restart nginxで nginx を再起動しておきます。

確認

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

[サーバーのIP]/app1[サーバーのIP]/app2にアクセスしてみます。
app1app2に対応したアプリケーションへアクセスできました。


今回は、nginx で受けたポート 80 へのアクセスをポート 3000 と 3001 に転送しました。
サブディレクトリで、rails アプリケーションを同時に 2 つ立ち上げました。
unix ドメインソケットを使った rails と nginx の連携ができていないので、次はそこに挑戦します。

ではでは。