はじめに
さくら VPS で独自ドメインなしで趣味 rails アプリを運用しているので、1つの FQDN で複数の Rails アプリを動作させたいけど、色々ハマったのでメモ
環境
OS: Centos 6.5
gem | version |
---|---|
Nginx | 1.0.15 |
Rails | 4.2.1 |
Unicorn | 4.9.0 |
前提
- ドメインは hoge.sakura.ne.jp
- Rails アプリ名 Banana, Melon
- アプリの URL hoge.sakura.ne.jp/banana/ , _hoge.sakura.ne.jp/melon
となるように諸々設定する - Banana は /home/rails/banana に配置してある
- Melon は /home/rails/melon に配置してある
- Banana は、ポート 3100 で動作
- Melon は、ポート 3101 で動作
- Nginx はリバースプロキシとして動作させる
概念図
/bananaへのリクエストがNginxで解決できなかったら、localhost:3100にリクエストを行う。
作業
Nginx側の設定
conf ファイル準備
/etc/nginx/conf.d/local.conf を作成して、内容を以下のようにしておく
upstream banana{
server localhost:3100;
}
upstream melon{
server localhost:3101;
}
server{
listen 80;
server_name hoge.sakura.co.jp;
location /banana{
alias /home/rails/banana/public;
try_files $uri $uri.html $uri/index.html @banana;
}
location @banana{
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://banana;
}
location /melon{
alias /home/rails/melon/public;
try_files $uri $uri.html $uri/index.html @melon;
}
location @melon{
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://melon;
}
}
location /melon{}
により、/melon/$uri に対するリクエストを受けたら
- /home/rails/melon/public/$uri
- /home/rails/melon/public/$uri.html
- /home/rails/melon/public/$uri/index.html
- localhost:3100
の順番に探していく。
localhost:3100については、探すのではなくて、リクエストを行うので、問い合わせ元がnginxのIPにならないように、問い合わせ元のIPとなるようにしてやる。
service nginx restart
で再起動しておく。
後は、Unicorn側の設定を正しく行うことで設定が完了する
Unicorn側の設定
Nginxからは、localhost:3100, localhost:3101にそれぞれアクセスされるが、それぞれ/banana, /melon以下にアプリがあるという前提のリクエストなので、起動時パラメータを
unicorn.rb -p 3100 --path /banana
unicorn.rb -p 3101 --path /melon
としておく。これによって、localhost:3100/banana/がアプリのルートになる。
また、アプリ内で展開されるパスについても同様のパスになっている必要があるため、
config.ruを以下のようにしておく必要がある
require ::File.expand_path('../config/environment', __FILE__)
if ENV['RAILS_RELATIVE_URL_ROOT']
map ENV['RAILS_RELATIVE_URL_ROOT'] do
run Rails.application
end
else
run Rails.application
end
わかっていれば手順は非常に少なくて簡単。ググって出てくる情報だと、だいたいホスト名をアプリごとに変える運用になってるけど、サブディレクトリで運用したい人はあまり居ないのかな。