Unicorn + nginx で複数の Rails アプリを動かす

スポンサーリンク

簡易的な Rails アプリをいくつか作ったが、都度専用のデプロイ環境を用意するのは効率が悪い。そこでネームバーチャルで複数の Rails アプリを動かしてみる。Web サーバには Unicorn を使い、nginx をリバースプロキシとして動作させる。


前提

以下の環境を前提とする。

  • OS はクリーンインストールした直後の Ubuntu Server (>= 12.04)
  • Ruby や Rails のバージョンはすべてのアプリで共通

パッケージのインストール

apt-get で必要なパッケージをインストールする。

$ sudo apt-get install git ruby rubygems ruby-dev libmysql-ruby libmysqlclient-dev unicorn nginx mysql-server

gem で rails をインストールする。

$ sudo gem install rails

アプリケーションのセットアップ

各アプリのセットアップを行なう。

まずアプリ毎にデータベースをセットアップする。今回は MySQL を使う。

$ DB_NAME='hoge'
$ DB_USER='hoge'
$ DB_PASS='hoge'
$ mysql -u root -p -e "CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
$ mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` DEFAULT CHARACTER SET \`utf8\` COLLATE \`utf8_unicode_ci\`;"
$ mysql -u root -p -e "GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost';"

アプリを配置するためのディレクトリを作る。

$ sudo mkdir -p /var/www
$ sudo chown $USER /var/www

各アプリを配置する。今回は GitHub から clone してくる。

$ cd /var/www
$ git clone https://github.com/akagisho/hoge.git
$ cd hoge

Unicorn を使用するための設定を Rails アプリに付け加える。hoge のところは適宜書き換えること。

$ vi Gemfile
# 以下を追記
group :production do
  gem 'unicorn'
end
$ vi config/unicorn.rb
listen "/tmp/hoge.sock"
pid "/tmp/hoge.pid"

bundle インストールで必要な Gem パッケージをインストールする。このとき –path オプションでアプリのディレクトリ内に入れるように指定する。

$ bundle install --path vendor/bundle --without test development

あとは必要に応じて、各アプリのセッティングを行なう。

$ bundle exec rake db:migrate RAILS_ENV=production
$ bundle exec rake assets:precompile RAILS_ENV=production

Unicorn をデーモンとして起動 (-D) する。

$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

ちなみに停止コマンドはないので、止めたいときは kill する。

$ kill -QUIT `cat /tmp/hoge.pid`

nginx のセットアップ

各アプリごとに nginx の設定ファイルを作る。hoge のところは適宜書き換えること。

$ sudo vim /etc/nginx/conf.d/hoge.conf
upstream hoge {
    server unix:/tmp/hoge.sock;
}

server {
    listen      80;
    server_name hoge.example.com;
    access_log  /var/www/hoge/log/access.log;
    error_log   /var/www/hoge/log/error.log;

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Client-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass http://hoge;
    }

    location ~ ^/assets/ {
        root    /var/www/hoge/public;
    }

    location = /robots.txt  { log_not_found off; }
    location = /favicon.ico { log_not_found off; }
}

nginx を再起動する。

$ sudo service nginx restart

完成

以上で設定が完了した。各アプリの FQDN を DNS で設定するなり hosts に書くなりしてブラウザでアクセスすれば、それぞれのアプリが実行される。

なお、アプリ毎に Ruby や Rails のバージョンを変えたい場合は、それぞれに Unix ユーザを用意して rbenv で Ruby を入れればできそうだ。

コメント

タイトルとURLをコピーしました