1
3

More than 1 year has passed since last update.

Passengerで複数のRubyのバージョンに対応する

Posted at

環境

  • 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のバージョンでしか使えないのかといえば、それができるようになります。

/etc/apache2/apache2.conf
<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のバージョンが何であろうが、共通で使えるモジュールだということです。

/etc/apache/sites-available/hoge.conf
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

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3