2016.5.5
2017.5.25

サブディレクトリを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で定義したリクエストが実行されます。

Ruby】関連記事