環境
- Ubuntu20.4 + Vagrant
- Ruby2.6.0
- Apache2.4.41
- Passenger6.0.18
はじめに
Apache2 + Passengerの環境で、異なるRubyのバージョンで作られた複数のWebアプリを、共存させて動作させる方法について書きました。もう少し詳しく言えば、Ruby2.7で作られたWebアプリと、Ruby2.6で作られたWebアプリとを、Passengerで共存させる環境の作り方についてということです。
内容
Passengerのバージョンを確認する
Passengerが複数のRubyバージョンに対応できるようになったのは、Passenger4.0.0以降です。まずは、既存のPassengerのバージョンを確認します。
$passenger-config --version
Passengerがインストールされているはずなのに、「コマンドがありません」というエラーがメッセージが表示される場合は、パスが切れていない可能性があります。その場合は、自力でコマンドがある場所を探して、絶対パス付きでコマンドを流すことになります。
$sudo find / -name "passenger-config*"
Redmineがインストールされている環境の場合、Redmineをインストールしたときに、一緒に、Passengerもインクルードされてインストールされている模様です。この辺は要注意です。
$/var/www/redmine-4.2.10/vendor/bin/passenger-config --version
Phusion Passenger(R) 6.0.18
PassengerDefaultRubyディテクティブの設定
Passengerをインストールしたとき、Apache2.confあたりで、つぎのようにPassengerのモジュールを取り込む設定をしているはずです。
PassengerDefaultRubyディテクティブで、利用されるRubyのバージョンを指定しています。ここで設定するRubyのバージョンはグローバルに反映されます。
グローバル値にRuby2.7を設定すれば、Ruby2.7のバージョンでしか使えないのかといえば、それができるようになります。
<IfModule mod_passenger.c>
PassengerDefaultRuby /usr/bin/ruby2.7
</IfModule>
PassengerRubyディテクティブの設定
グローバル値を設定した後、仮想端末(VirtualHost)単位に、PassengerRubyディテクティブでRuby2.7以外のバージョンを設定することができます。設定したバージョンは、仮想端末(VirtualHost)単位で反映されるようになります。つまり、グローバル値でRubyのバージョンを一旦指定するが、その後に読み込まれた、ローカル値がグローバル値を上書きするといったイメージです。
Apache2.confの中のLoadModule passenger_module ディテクティブで、mod_passenger.so
を取り込む設定をしています。mod_passenger.soはグローバルに設定したRubyのバージョン専用のモジュールなのかと思いがちだが、そのようなことはなく、仮想端末単位で設定したRubyのバージョンにも対応しています。
PassengerRubyディテクティブで、仮想端末(VirtualHost)単位に使いたいRubyのバージョンを指定します。ここでは、Ruby2.6.0を指定しています。つまり、mod_passenger.soは、Rubyのバージョンが何であろうが、共通で使えるモジュールだということです。
Listen 8000
<VirtualHost *:8000>
PassengerRuby /usr/local/rbenv/versions/2.6.0/bin/ruby
</VirtualHost>
仮想端末(VirtualHost)ごとに異なるポート番号を指定して、接続先を切り分ける必要があるため、ポート番号に8000番を指定しています。デフォルトの80番は他のWebアプリで使っているため、80番と重複しなければ何でもいいことになります。また、Listenディテクティブの設定は、本当は、/etc/apache2/port.confの中にまとめて記述した方がいいでしょう。
PassengerRubyディテクティブで設定するRubyのパスを調べるコマンドです。どちらのコマンドを使ってもOKです。
$passenger-config about ruby-command
$passenger-config --ruby-command
Rubyのバージョンを切り替える
仮想端末(VirtualHost)でWebアプリが入っているディレクトリに移動して、動作させたいRubyのバージョンを切り変えます。
$rbenv local 2.6.0
動作確認
ブラウザのURLでポート番号8000を指定すれば、Ruby2.6.0版のWebアプリが動作します。
http://IPアドレス:8000
備考
PassengerDefaultRubyの詳細
https://www.phusionpassenger.com/library/config/apache/reference/#passengerdefaultruby
PassengerRubyの詳細
https://www.phusionpassenger.com/library/config/apache/reference/#passengerruby