togatttiのエンジニアメモ

過度な期待はしないでください。旧麹町で働くエンジニアのメモ帳です。

Passengerを使いRailsアプリを公開する

RailsアプリをApacheで公開する必要があったので、Passengerを使うことにした。 その備忘録を残しておく。

同じ内容をGistでも残した。

setup_passenger.md

環境

  • CentOS6.5
  • Apache/2.2.15
  • Phusion Passenger version 4.0.41
  • ruby 2.0.0p451

準備

Railsアプリのひな形を用意する。

$ rails -v
Rails 4.1.0
$ mkdir  ~/sample_app
$ cd ~/sample_app
$ rails new app --pre --skip-bundle
$ vi Gemfile

Gemfile内のgem 'therubyracer', platforms: :rubyコメントアウトを外す。

$ bundle install
$ bundle exec rake db:migrate
$ rails s

http://...:3000 でサイトが表示されれば、アプリの用意完了。

次にPassengerに必要なモジュールをインストールする

無ければ、適宜入れる。

$ sudo yum install -y gcc-c++ httpd httpd-devel apr-devel apr-util-devel

Passengerをインストールする

gemを使う。

$ gem install --no-rdoc --no-ri passenger
$ passenger --version
Phusion Passenger version 4.0.41

"Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui

PassengerでApache用モジュールをビルドする

$ cd ~
$ sudo find . -name passenger-install-apache2-module
./.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41/bin/passenger-install-apache2-module
./.rbenv/versions/2.0.0-p451/bin/passenger-install-apache2-module
$ ./.rbenv/versions/2.0.0-p451/bin/passenger-install-apache2-module

また、このときにPassengerモジュールをApache内で読みこむための設定が出力されるので、httpd.confに追記する。

LoadModule passenger_module /home/togashik/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/togashik/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41
     PassengerDefaultRuby /home/togashik/.rbenv/versions/2.0.0-p451/bin/ruby
   </IfModule>

バーチャルホストの設定例も出力されるので、参考にするといい。 設定は自分の環境に合わせて、変更する。

   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public    
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

最終的には、次のように変更した。

<VirtualHost *:80>
    ServerName *:80
    RailsEnv development
    PassengerEnabled on
    DocumentRoot /home/togashik/sample_app/app/public
    <Directory /home/togashik/sample_app/app/public>
        AllowOverride all
        Options -MultiViews
    </Directory>
</VirtualHost>

Apacheを再起動してみる。

$ sudo service httpd configtest
Syntax OK
$ sudo service httpd restart

次のようなエラーがでた。。

Starting httpd: httpd: Syntax error on line 221 of /etc/httpd/conf/httpd.conf: Syntax error on line 1 of 
/etc/httpd/conf.d/passenger.conf: Cannot load /home/togashik/.rbenv/versions/2.0.0-
p451/lib/ruby/gems/2.0.0/gems/passenger-4.0.41/buildout/apache2/mod_passenger.so into server: 
/home/togashik/.rbenv/versions/2.0.0-p451/lib/ruby/gems/2.0.0/gems/passenger-
4.0.41/buildout/apache2/mod_passenger.so: cannot open shared object file: Permission denied

パスが問題なければ、SELinuxが影響しているかもしれないので、無効にする。

$ sudo setenforce 0

もう一度再起動するとエラーが出ず、ページが表示されていれば成功だ。

参考

Amazon Linuxにrbenv+Ruby+Apache+Passengerの環境を作る - okochangのインフラ日誌

さくらVPS/entOS 6.4 Passengerのインストール手順 [Apache][Railsサーバへの道] - 酒と泪とRubyとRailsと