RailsアプリをApache + Passengerで公開する : CentOS・RedHat編

Apacheが導入されているサーバーにPassengerをインストールするだけでRailsアプリを公開することができる。無論バーチャルホストで複数ドメインRailsアプリを動かしたり、別ドメインではPHPを動作させるといったことも可能である。
また、Apache + PassengerだけでなくNginx+Unicornの構成でRailsアプリを公開することも可能であり、RailsアプリをNginx + Unicornで公開する : CentOS・RedHat編で紹介しているので、好みによって好きな方で構築したい。

前提条件としてRubyをインストールしておく
最新バージョンのRuby環境構築 : CentOS・RedHat編

Passengerのインストール

gemでpassengerをインストールする。公開サーバーではドキュメントなどは不要なため--no-rdoc --no-riを付与している。

gem install passenger --no-rdoc --no-ri

下記でPassengerをインストールできる。この時足りないソフトウェアが自動的に表示される。

passenger-install-apache2-module

全くセットアップを行っていないサーバーで実行すると下記をインストールすることになると思われるが、環境によって異なる。表示された指示に従うこと。

yum install httpd http-devel curl-devel

インストール完了には10分程度の時間がかかる。インストール完了後、httpd.confに追加するLoadModuleなどの設定が表示されるため追加する。

設定を追加した後Apacheのバーチャルホストを普通に設定する。この時ドキュメントルートはRailsのpublicディレクトリを指定すれば良い。

<VirtualHost *:80>
ServerName www.yourhost.com
DocumentRoot /somewhere/public
</VirtualHost>

また、Passngerの設定は下記を追加して行う。なくてもデフォルト値で稼働するかと思うが、不要な情報の除去やチューニングを行うべき環境では設定する。
さくらVPS/entOS 6.4 Passengerのインストール手順 - 酒と泪とRubyとRailsと

Header always unset "X-Powered-By"
Header always unset "X-Rack-Cache"
Header always unset "X-Content-Digest"
Header always unset "X-Runtime"
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerHighPerformance on
PassengerStatThrottleRate 10
RailsSpawnMethod smart
RailsAppSpawnerIdleTime 86400
PassengerMaxPreloaderIdleTime 0

Passengerはデフォルトでエラーページに細かなデバッグ情報を全て表示する設定となっている。本番サーバーで利用する場合はエラーページをoffにすることで非表示にできる。

PassengerFriendlyErrorPages off

Passengerはデフォルトでproductionモードで稼働しているが、開発用サーバーで稼働させる場合は下記のように設定する。

RailsEnv production

参考資料

thinかUnicornかPassengerの3択になるかと思いますがめんどかったらPassengerでいいんじゃないでしょうか。
Rubyのhttpサーバまとめ 2012年4月版(thin, Unicorn, Passenger, etc)

Railsの開発でよく使うコマンド集

Railsの新規プロジェクト作成

rails new hoge -d mysql

本番モードで起動する

rails s -e production

アセットファイルのプリコンパイル

rake assets:precompile RAILS_ENV=production

データベースを作成する

rake db:create
rake db:create RAILS_ENV=production

未実行のマイグレーションファイルを実行する

rake db:migrate
rake db:migrate RAILS_ENV=production

マイグレーションファイルを作成する

rails g migration hoge_updates

タスク一覧の表示

rake -vT

既存データベースをRailsのschemaにdump

rake db:schema:dump

RailsのGemfileに設定されたgemのインストール

bundle install
# installは省略可
bundle

unicorn

unicornの起動

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

unicornの再起動

kill -HUP `cat tmp/pids/unicorn.pid`

Unicorn | Rails3

Railsのタスクでバッチ処理を行う

下記でタスクファイルを作成する

rails g task hoge

下記は登録されている画像ファイル名を全て小文字に変更するサンプル。このようにタスクの中ではモデルに自由にアクセスできる。

namespace :hoge do
desc "処理の説明"
task :update_record => :environment do
Image.all.each do |value|
if value.update_attributes(image_name: value.image_name.downcase)
puts value.image_name + " => " + value.image_name.downcase
else
p value.errors
end
end
end
end

作成したタスクは下記で実行できる

rake hoge:update_record

作成したタスクはrake -vTから一覧で確認することもできる。タスクが増えてきた時は活用したい。

rake -vT

Railsの処理をコンソールから実行する

Railsではコンソールからrails runnerでコードを実行できる。例えば下記は現在の実行モードを確認できる

rails runner 'puts Rails.env’

複数行のコードも実行できる

rails runner '
puts Model.find(1).inspect
puts Model.find(2).inspect
'

定期的に実行するバッチ処理などは、rails runner実行する事もできるが、タスクを利用する方法が適切である。

Rubyの開発環境構築 : Mac編

Macの場合、最初からRubyがインストールされているが、古いバージョンがインストールされている場合がある。最新版のRubyやgemで開発を行いたい、プロジェクトによってRubyやgemのバージョンを切り替えたい場合、rbenvを利用するのが簡単である。

Homebrewのインストール

HomebrewとはMacのパッケージを管理するソフトウェアであり、既にMacにインストールされているパッケージとは別で、簡単にパッケージのインストールとアンインストールを行う。
Homebrew — OS X用パッケージマネージャー

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"

インストール後.bash_profile/usr/local/bin/にパスを通す。brewはここにパッケージをインストールする。

export PATH=/usr/local/bin:$PATH

Terminalを再起動するか.bash_profileをリロードする。

source ~/.bash_profile

rbenvのインストール

rbenv、ruby_build、rbenv-gemset、rbenv-gem-rehashをインストールする。

brew update
brew install rbenv
brew install ruby-build
brew install rbenv-gemset
brew install rbenv-gem-rehash

rubyのインストール

ruby 2.1.2がインストール可能か調査する

rbenv install -l | grep 2.1.2

可能であればインストールする

rbenv install 2.1.2

下記のように出れば成功だが、筆者の環境では何らかの問題によってこの処理が完了するまでに1時間以上の時間がかかった。

rbenv install 2.1.2
Downloading ruby-2.1.2.tar.gz… -> ダウンロード先URL
Installing ruby-2.1.2...
Installed ruby-2.1.2 to ~/.rbenv/versions/2.1.2

インストール完了後使用するrubyのバージョンを指定し有効化を行う。この処理の実体はメインディレクトリにruby 2.1.2をコピーするようである。

rbenv global 2.1.2
rbenv rehash 

そのメインディレクトリに.bash_profileでパスを通す。既存のパスを後方に持ってくる事で、Macにデフォルトでインストールされた古いrubyより優先してrbenvのrubyを読み込めるようにする。

PATH=~/.rbenv/shims:"$PATH”

Rails入門などで古い既存のrubyやgemなどを利用してRailsなどをインストールしている場合、環境によっては古いrubyやgemが利用されてしまうため注意すること。

例えばwhichを使って現在どのコマンドを利用しているか確認できる。

which gem
which ruby
which bundle
which rake
which rails

自作CMSの開発を終了してはてなブログやHerokuに身を委ねる事にした

Ruby on Railsを利用して自作CMSを開発しブログを運営していたが、開発に疲れ果てたので開発を終了してはてなブログへ移転することにした。やっぱこっちが使いやすいや。

さくらのVPSRailsCMSのせてnginx+unicornで環境構築つっても、脆弱性があれば修正したり、サーバーの面倒もみなきゃならん。VPSだからブログ以外のアプリ乗せられるって言っても、バーチャルホストは結局神経使ったりするしめんどい。

日常業務でインフラからアプリケーションまで面倒見ててめんどくせーって感じだから、家帰っての趣味開発くらいはインフラ放り投げてアプリケーション開発に専念したいところ。金かかるけどさ、HerokuとかSqaleみたいにアプリごとに環境用意してくれるってのがいかに便利かってのが最近わかってきたね。

ブログもとりあえず書いて、ストレスなく情報共有できればいいっつう。CMS開発とかやってたらブログ書いてても、あーここ修正しなきゃなーめんどいし明日やるかーとか考えてるうちにモチベーションなくなって資料書かなくなるっつう負の連鎖。

私の開発していたCMSオープンソース化してコミュニティの力を借りるって手もあるんだろうけど、そういう試みってWordPressでもうなされてるじゃん。技術者向けのCMSとして世に出すってのも既になされている試みだったりするはず。

WordPressPHPだからやっぱRubyのもって考え方もあるけど、ブログを書くというユーザー目線からしたらどんな言語で書かれてるかとかどうでもいいし、むしろPHPのほうが取っ付き易くて良かったり。やっぱPHPだから良いのかもしらんね。

やっぱWordPressはすげえや。

はてなブログからWordPressなどの外部ブログへ記事を移転しリダイレクトする

はてなブログが閉鎖した時とかもっと便利なブログサービスが出現した時が不安だからはてなブログを利用できないっつーユーザーに向けて私のアイディアを紹介しとく。

独自ドメイン運用時の裏ワザ

はてなブログ独自ドメインで運用しておくことで外部へ移転できる。
はてなブログには外部へのリダイレクト機能を私の知る限りでは備えていないようだが、独自ドメインで運用しているなら、ドメインを別サーバーへ切り替えて、はてなブログで運営していた時の各記事URLを新記事URLへリダイレクトするようにすればいい。

しかしはてなの規約的にはどうだろね?