Ruby on Rails Tutorialのsample_appをさくらVPSにインストールした手順

Ruby on Rails Tutorialで作る「sample_app」をさくらVPSにインストールしました。これは、その備忘録です。

構築した環境は、CentOS 6.4+Apache Httpd 2.2.15-28+MySQL 5.1.69をベースに、rvm 1.20.13+Ruby 1.9.3+Passenger 4.0.5+Rails 3.2.13です。

複数のRailsアプリが、同一バージョンのRubyで稼働するものとして、Passengerは「global」にインストールし、アプリ毎にgemsetを用意するという方針にしました。

謝辞

インストールにあたって、以下のサイトを参考にさせていただき、誠にありがとうございました。

前提

Apache HttpdMySQLは、yum installでインストールし、設定済みです。

この順番で実行したかと思います。申し訳ありませんが、試行錯誤した結果なので、記載漏れなどがあるかもしれません。

rvmとRubyのインストール

$ sudo bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
$ sudo usermod -a -G rvm root
$ sudo gpasswd -a [USER_NAME] rvm
$ sudo gpasswd -a apache rvm
$ source /etc/profile.d/rvm.sh
$ su
# rvm get head
# exit
(この後、一旦、再起動させたと思います。)
$ sudo reboot
$ rvm install 1.9.3
$ gem install bundler --no-ri --no-rdoc

Passengerのインストール

$ vi .gemrc
gem: --no-rdoc --no-ri
$ rvm gemset use global
$ gem install passenger
$ passenger-install-apache2-module
$ sudo vi /etc/httpd/conf.d/passenger.conf
LoadModule passenger_module /usr/local/rvm/gems/ruby-1.9.3-p429@global/gems/passenger-4.0.5/libout/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.3-p429@global/gems/passenger-4.0.5
PassengerDefaultRuby /usr/local/rvm/wrappers/ruby-1.9.3-p429@global/ruby

sample_appのインストール

sample_appで必要なgemは、「sample」というgemsetにインストールしています。

$ git clone git@github.com:[USER_NAME]/sample_app.git
$ cd sample_app
$ vi Gemfile
gem 'execjs'
gem 'therubyracer'

group :production do
  gem 'mysql2'
end
$ rvm gemset create sample
$ rvm gemset use sample --default
$ bundle install
$ vi config/setup_load_paths.rb
if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
  begin
    gems_path = ENV['MY_RUBY_HOME'].split(/@/)[0].sub(/rubies/, 'gems')
    ENV['GEM_PATH'] = "#{gems_path}:#{gems_path}@global"
    require 'rvm'
    RVM.use_from_path! File.dirname(File.dirname(__FILE__))
  rescue LoadError
    # RVM is unavailable at this point.
    raise "RVM ruby lib is currently unavailable."
  end
end
ENV['BUNDLE_GEMFILE'] = File.expand_path('../Gemfile', File.dirname(__FILE__))
require 'bundler/setup'
$ vi .ruby-version
1.9.3-p429
$ vi .ruby-gemset
sample
$ mkdir tmp
$ sudo chown apache:apache tmp
$ touch log/production.log
$ sudo chmod 0666 log/production.log
$ rake db:create RAILS_ENV=production
$ rake db:migrate RAILS_ENV=production
$ sudo rake assets:precompile RAILS_ENV=production

httpd.confの設定

VirtualHostの設定を既存のhttpd.confに追加しました。

一般公開するわけではありませんので、Digest認証をかけています。

また「/home/[USER_NAME]」ディレクトリは、予め「sudo chmod o+r /home/[USER_NAME]」して、apacheユーザが読めるようにしています。

$ cd /var/www
$ sudo ln -s /home/[USER_NAME]/sample_app sample_app
$ sudo vi /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
    ServerName [FQDN]
    RackEnv production
    DocumentRoot /var/www/sample_app/public
    ErrorLog /var/log/httpd/sample_app.error_log
    CustomLog /var/log/httpd/sample_app.access_log combined
    <Directory /var/www/sample_app/public>
        AuthType Digest
        AuthName "Auth Zone"
        AuthUserFile /etc/httpd/conf/.htdigest
        Require valid-user
        Options -Indexes -MultiViews
        AllowOverride all
    </Directory>
</VirtualHost>

[追記:7/1 19:08]
Apachehttpd.confで「KeepAlive On」に変更。

[追記: 7/2 0:19]
さらに、「Header always unset X-Powered-By」を追加。

httpdの再起動

$ service httpd configtest
Syntax OK
$ sudo service httpd restart

余談

インストール中につまずいた箇所。

  1. gemsetを「global」から「sample」に変更する方法がよくわからず丸2日悩む。→「config/setup_load_paths.rb」を作成して対処。
  2. assetsのprecompleに「execjs」などがGemfileに必要だったこと。

GitHubにpushしたら、自動的にテストして、問題なければ本番環境にデプロイする仕組みを入れたい。Jenkins CIにチャレンジしてみようかな...

[追記: 8/20 13:42]
その後、Jenkins CIを入れてみたり、nginx+unicornに変えてみるなど、さくらVPSの1Gプラン(月980円)でかなり遊ばせてもらってます。