サブディレクトリをApache+Passengerの対象にする
すでにApacheでWebサイトが公開済みになっている実行環境において、Rubyで作成した別のサイトを同じ環境に公開する方法になります。
今回はサブドメインで分けずに、同一ドメイン内の異なるサブディレクトリで処理するサーバを切り替えます。
目次
- Rubyのインストール
- Sinatra、Active Record、MySQL2をインストール
- Passengerのインストール
- ApacheとPassengerの連携
Rubyのインストール
インストール方法はこちら(RubyをCentOS/RedHatにインストールする4つの方法)
今回使うRubyのバージョンは「2.2.5」であるため、yumは選択肢から除外し、Rubyのソースを自分でコンパイルしてインストールする方法を選びました。
その方法はこちら(Ruby2.0をソースからインストールする手順 (CentOS/RedHat))
コンパイル時にライブラリが足りずにエラーが出る場合は、必要なものを別途インストールする必要があります。大抵は以下のライブラリ。こちら(CentOSに ruby と gem と chef をインストールする)を参考。
yum -y install gcc zlib zlib-devel openssl openssl-devel
インストール作業はすんなりいくだろうと思っていたRuby初心者の私ですが、まさか、最初で躓くとも思っていませんでした。Rubyは実行環境を作るのが面倒(複数の方法あり)というのが、今回の作業で実感しました。
Sinatra、Active Record、MySQL2をインストール
使っていない場合は不要。
gem install sinatra
gem install activerecord
gem install mysql2
この辺りはすんなりいくと思っていたら、「mysql2」のインストールで躓きました。
「mysql.h」が見つからないとかのエラーだったので、下記をインストールして再実行。
yum install mysql-devel
詳しくはこちら(mysql.h is missing ... - Qiita)を参考。
Passengerのインストール
Passenger自体のインストールは問題ありませんでした。次のApacheとの連携で躓きましたけど。
gem install passenger
ApacheとPassengerの連携
参考:sinatra + Apache + Passengerでサブディレクトリとしてアプリリリースする方法
まずはApacheとの連携モジュールをインストール。
passenger-install-apache2-module
エラーが出る場合は、こちら(passengerのインストールで毎回つまづくのでいい加減にメモする)を参考。
インストールが正常に終了したら、「/etc/httpd/conf.d/passenger.conf」を作成し、以下の内容で保存。
# passenger-install-apache2-module --snippetで出力された内容をコピペ
LoadModule passenger_module /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.28/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
PassengerRoot /usr/local/lib/ruby/gems/2.2.0/gems/passenger-5.0.28
PassengerDefaultRuby /usr/local/bin/ruby
</IfModule>
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
<VirtualHost *:4061>
ServerName st40.xyz
DocumentRoot "/var/www/html"
PassengerAppRoot /var/www/html/test-app
RackEnv production
RackBaseURI /test-app-pub
</VirtualHost>
今回はサブディレクトリ「test-app」配下のみRubyサイトとして動作させます。その切り分けをポート番号で行うようにするので、Ruby以外のサイトは通常通り「80」番ポート。Rubyサイトを「4061」番ポートとして設定。
「ServerName」にはドメイン名。
「DocumentRoot」にはWeb環境のルート。
「PassengerAppRoot」にはPassengerで動作させたいRubyサイトのルート。
「RackBaseURI」にはシンボリックリンクで作成した「PassengerAppRoot」配下の「public」ディレクトリ。(Rack製アプリケーションを利用する際は、デフォルトではpublicディレクトリにしなければいけないのだとか。)
cd /var/www/html
ln -s /var/www/html/test-app/public test-app-pub
「RackEnv」を「production」から「development」に変更すると、動作しない場合のエラー内容がブラウザに表示されます。
続いて「/etc/httpd/conf/httpd.conf」を編集。
# 80番は存在するので、4061番を追加
Listen 80
Listen 4061
# 80番の設定がコメントアウト状態で存在するので、その近くに追加
#NameVirtualHost *:80
NameVirtualHost *:4061
上記の設定だけでは、ブラウザからRubyサイトにアクセスするにはポート番号を指定しないといけないので、「passenger.conf」同様、「/etc/httpd/conf.d/proxy.conf」を作成し、以下の内容でプロキシの設定。
参考:ポートベースのバーチャルホストを設定する - MogLog
<IfModule mod_proxy.c>
ProxyRequests Off
<Proxy http://localhost:4061/>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /test/ http://localhost:4061/
ProxyPassReverse /test/ http://localhost:4061/
</IfModule>
「ProxyPass」「ProxyPassReverse」についてはこちら(mod_proxy再入門 – ProxyPassとProxyPassReverse)を参照。
すべての設定が済んだら、Apacheを再起動します。
service httpd restart
以上の設定により、ブラウザから「http://st40.xyz/test/」にアクセスするとプロキシを経由して、「http://st40.xyz:4061/test-app-pub/」配下のSinatraで定義したリクエストが実行されます。