LoginSignup
14
11

More than 5 years have passed since last update.

単一ドメインで unicorn + nginx で Rails アプリを動作させる

Posted at

はじめに

さくら 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 はリバースプロキシとして動作させる

概念図
nginx_unicorn.png
/bananaへのリクエストがNginxで解決できなかったら、localhost:3100にリクエストを行う。


作業

Nginx側の設定

conf ファイル準備

/etc/nginx/conf.d/local.conf を作成して、内容を以下のようにしておく

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を以下のようにしておく必要がある

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

わかっていれば手順は非常に少なくて簡単。ググって出てくる情報だと、だいたいホスト名をアプリごとに変える運用になってるけど、サブディレクトリで運用したい人はあまり居ないのかな。

14
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11