簡易的な 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 を入れればできそうだ。
コメント