Apache2にPhusion Passengerを組み込む手順

## 概要
ApacheにPhusion Passengerを組み込む手順についての記事です。

## はじめに
Railsを動かすためのWebサーバーを構築する場合、WebサーバーにNginxを採用すれば、アプリケーションサーバーにはUnicornが使われることが多いようです。Apacheを採用した場合は、ApacheにPhusion Passengerという拡張モジュールを組み込むことで、アプリケーションサーバーを立てることなく、ApacheだけでRailsを動作させることができるようになります。

RailsとApacheの組み合わせのであれば、Phusion Passengerが用いられることが多いようです。

拡張モジュールの組込みは、Apacheのコンフィグファイルに **LoadModule** という、モジュールを読み込むための**ディレクティブ**を記述することで、Apacheをコンパイルすることなく実現することができます。

## 環境
Apache2.4.41
Ubuntu20.4 + Vagrant

## インストール

Phusion PassengerはRubyのGemとして提供されています。Phusion Passengerをインストールする場合、**gem install passenger**をしてインストールすることができますが、RailsでWebアプリを構築する場合は、Gemfileに次の１行を追加して、bundle installすることになります。
```Gemfile
gem 'passenger'
```

Phusion Passengerをインストールした後、次は、ApacheにPhusion Passengerを組み込みます。

```
$passenger-install-apache2-modules
```

Gemfileにgemを組み込んでインストールした場合、インストールしたgemのパスが切れていないため、上記のコマンドを入力しても「そのようなコマンドは存在しません」といったエラーが表示されます。そのため、パスを指定してコマンドを実行する必要があります。コマンドが存在する場所については、次のコマンドで検索して見つける必要があります。
```
$sudo find / -name "passenger-install-apache*"
/home/vagrant/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.18/bin/passenger-install-apache2-module
/home/vagrant/.rbenv/versions/2.6.0/bin/passenger-install-apache2-module
```

検索したところ、コマンドが存在するパスが２ヶ所見つかりました。恐らく、どちらを指定しても同じはずです。
```
$cd /home/vagrant/.rbenv/versions/2.6.0/bin/
$./passenger-install-apache2-module
```

コマンドを実行すると、次のようなウィザードが表示されるため、Enterで進めます。
```
This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.

Here's what you can expect from the installation process:

 1. The Apache 2 module will be installed for you.
 2. You'll learn how to configure Apache.
 3. You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.
```

Rubyが選択されていることを確認してEnterを押します。
```
Which languages are you interested in?

Use <space> to select.
If the menu doesn't display correctly, press '!'

 ‣ ⬢  Ruby
   ⬡  Python
   ⬢  Node.js
   ⬡  Meteor
```

「SSLを利用するのであれば、別途、追加のライブラリをインストールしてください」というメッセージです。SSLは使わなくてもインストールする必要があります。この時点ではPassengerのモジュールの組込みは完了していません。
```
Installation instructions for required software

 * To install Curl development headers with SSL support:
   Please run apt-get install libcurl4-openssl-dev or libcurl4-gnutls-dev, whichever you prefer.

If the aforementioned instructions didn't solve your problem, then please take
a look at our documentation for troubleshooting tips:

  https://www.phusionpassenger.com/library/install/apache/
  https://www.phusionpassenger.com/library/admin/apache/troubleshooting/
```

SSLのライブラリをAPTでインストールします。
```
$apt-get install libcurl4-openssl-dev
```

再度、仕切り直しをします。インストール作業は、環境にもよりますが５分程度かかりました。
```
$cd /home/vagrant/.rbenv/versions/2.6.0/bin/
$./passenger-install-apache2-module
```

次のメッセージが表示されれば、モジュールの組み込みは完了です。「Apacheのコンフィグファイルに、下記のメッセージを追加してください」といったメッセージです。
```
Almost there!

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/vagrant/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.18/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /home/vagrant/.rbenv/versions/2.6.0/lib/ruby/gems/2.6.0/gems/passenger-6.0.18
     PassengerDefaultRuby /home/vagrant/.rbenv/versions/2.6.0/bin/ruby
   </IfModule>

After you restart Apache, you are ready to deploy any number of web
applications on Apache, with a minimum amount of configuration!

Press ENTER when you are done editing.
```

```
Validating installation...

 * Checking whether this Passenger install is in PATH... ✓
 * Checking whether there are no other Passenger installations... ✓
 * Checking whether Apache is installed... ✓
 * Checking whether the Passenger module is correctly configured in Apache... (!)

   You did not specify 'LoadModule passenger_module' in any of your Apache
   configuration files. Please paste the configuration snippet that this
   installer printed earlier, into one of your Apache configuration files, such
   as /etc/apache2/apache2.conf.


Detected 0 error(s), 1 warning(s).
Press ENTER to continue.
```

```
Deploying a web application

To learn how to deploy a web app on Passenger, please follow the deployment
guide:

  https://www.phusionpassenger.com/library/deploy/apache/deploy/

Enjoy Phusion Passenger, a product of Phusion® (www.phusion.nl) :-)
https://www.phusionpassenger.com

Passenger® is a registered trademark of Phusion Holding B.V.
```

下記のコマンドを実行して、Apache2のコンフィグファイルをエディタで開いて、Passengerのモジュールを読み込む設定をします。apache2.confはルート権限でしか書き込みができないようになっています。
```
$sudo vi /etc/apaceh2/apache2.conf
```

ViでPassengerのモジュールを読み込んむ記述を追加した画面です。

![passenger.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/aeb2b51d-ae3c-72ec-c8e4-55089bcf3931.png)

Apacheは再起動して、コンフィグファイルの変更を反映させます。
```
$systemctl restart apache2
```

### 備考

Passengerがインストールされているかどうかを確認するコマンドです。
```
$gem list passenger
```
Passengerをインストールした後、コンフィグに組込む行を再表示するコマンドです。
```
$passenger-install-apache2-module --snippet
```

Apacheのコンフィグファイルを編集した後、/etc/apache2配下にある各コンフィグファイルに対し、構文チェックを行うツールです。
```
$acpchectl -t
```

## 参考

https://www.petitmonte.com/ruby/passenger.html
https://weblabo.oscasierra.net/install-phusion-passenger-to-redhat/

## DocumentRootの所有者を変更する

RailsからPassengerにアクセスする場合、ApacheのDocumentRootディテクティブで設定したディレクトリの所有者を、Railsの所有者と合わせる必要があります。

ApacheのDocumentRootディテクティブで設定するディレクトリを、mkdirコマンドで作成した場合、ディレクトリの所有者はrootになっているはずです。所有者がrootになっている状態でRailsを動かすと、Passengerはrootではなくnobodyユーザーで動かそうとします。nobodyユーザーとは、OSがデフォルト持っているユーザーで、数あるユーザーの中で一番低い権限が与えられているユーザーのことです。システム的な使われ方しかされません。nobodyユーザーには、/temp、/logへの書き込み権限がありません。そのため、permission errorになってしまい、Passengerが正常に動作しなくなります。

RailsからPassengerを動かすには、所有者をRailsを動かすユーザーに合わせる必要があります。Railsを動かすユーザーとは、Railsプロジェクトを作成したときのユーザーのことで、Railsのファイルから調べることもできます。Railsのプロジェクトがあるルートの直下にあるconfig.ruファイルの所有者が、Railsを動かすユーザーになります。

所有者の変更は次のコマンドで行います。
```
$chown -R user:user /var/www/html/hoge
```