前置き


前回、ラズパイでRuby on Railsを動かすための環境構築をしました。
しかし、実際にWebサーバーを運営するためには、常時稼働するWebサーバーアプリが必要となります。
また、Railsは、Webサーバーから呼び出すために、連携用モジュールが必要となります。

今回は、WebサーバーにはApache、連携モジュールはPassengerを使って設定します。
ちなみに、Apacheのインストールする方法について一切触れていませんが、aptなりyunなりで入れるだけなのですっぱりキッパリ割愛します。

それでは。行ってみましょう!

Passengerのインストール


まずはApacheの連携モジュールである、Passengerからインストールしていきます。
Passengerは、RubyのGemパッケージとして提供されているので、gemコマンドでインストールします。(※ユーザー権限で実行)
gem install passenger

これだけでは終わらず、Apacheとの連携モジュールのインストールです。
インストールはコマンドが提供されているので、以下のコマンドを実行すればOKです。
passenger-install-apache2-module

しかし、たいていの場合はモジュールが不足と言われるでしょう。
今回のラズパイOSLiteの場合は、以下のようなメッセージが表示されました。 
 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.
 
 * To install Apache 2 development headers:
    Please install it with apt-get install apache2-threaded-dev
 
 * To install Apache Portable Runtime (APR) development headers:
    Please install it with apt-get install libapr1-dev
 
 * To install Apache Portable Runtime Utility (APU) development headers:
    Please install it with apt-get install libaprutil1-dev
 
 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/

いくつかのソフトが不足しているとのこと。
基本的に指示どおり、apt-getでインストールすればよいのですが、環境によってパッケージ名が違う場合があるため、適宜変更して実行する必要があります。

今回の環境では、このようにしました。
apt-get install libcurl4-openssl-dev
apt-get install apache2-threaded-dev → apt-get install apache2-devに変更してインストール
apt-get install libapr1-dev → 不要。上記でインストールされる。
apt-get install libaprutil1-dev → 不要。上記でインストールされる。

apache2-threaded-devというパッケージは存在しませんでしたが、apache2-devに含まれるようです。
libapr1-dev、libaprutil1-devは、apache2-devに含まれるようなので、インストール不要です。

で、先程のコマンドを再実行。
passenger-install-apache2-module

以上でPassengerのインストールは終了です。
実行結果に、Apacheの設定ファイルに追記する内容が表示されます。
設定手順は次で説明します。

Apacheの設定


passengerの設定

Passengerモジュールのインストール結果に出力された設定内容を、Apacheに設定していきます。
apache2.confに設定しろなどと言われますが、今回は設定ファイルは分けておきます。

設定ファイルは、/etc/apache2/conf-available配下に、passenger.conf として新規ファイルを作成しました。
ファイル名はお好みで構いません。
passenger-install-apache2-moduleの結果で表示されていた設定内容を入力して保存します。
LoadModule passenger_module /home/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/passenger-6.0.7/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /home/ユーザー名/.rbenv/versions/2.7.2/lib/ruby/gems/2.7.0/gems/passenger-6.0.7
  PassengerDefaultRuby /home/ユーザー名/.rbenv/versions/2.7.2/bin/ruby
</IfModule>

また、passengerのデフォルトユーザーがrootなので、以下の設定も追加します。
# passengerユーザーの設定
PassengerUserSwitching off
PassengerDefaultUser ユーザー名

さらに、一定時間ごとにアップデートのチェック処理が走り、エラーが出てしまっていたので、無効化しておきました。
# セキュリティアップデートのチェック無効
PassengerDisableSecurityUpdateCheck on

conf-available配下の設定は、そのままでは有効になりません。
apacheのコマンド a2enconf にて、作成した設定ファイルを有効化することができます。
a2enconf passenger
passengerの部分は、設定ファイルの.confを除いた部分です。

このコマンドによって、/etc/apache2/conf-enabledに、passenger.confへのシンボリックリンクが作成されます。
conf-enabledにシンボリックリンクがある状態だと、該当の設定ファイルが有効になります。

apacheの設定変更

apacheの実行ユーザーを変更しておきます。
デフォルトはrootなので、セキュリティ上よろしくありません。

/etc/apache2/envvars のAPACHE_RUN_USER、APACHE_RUN_GROUPを、実行するユーザーに変更します。
export APACHE_RUN_USER=ユーザー名
export APACHE_RUN_GROUP=ユーザー名

サイトの設定


Railsアプリを、Apacheと紐付けるための設定を行います。
今回は、バーチャルホストの設定を行い、その中でRailsのアプリを指定する方法を取ります。

/etc/apache2/sites-availableに、以下のようなファイルを作成します。
<VirtualHost *:80>
    ServerName サーバーURL

    # Tell Apache and Passenger where your app's 'public' directory is
    DocumentRoot railsアプリのパス/public

    PassengerRuby /home/ユーザー名/.rbenv/shims/ruby

    RailsEnv production

    <Directory railsアプリのパス/public>
      Allow from all
      Options -MultiViews
      # Uncomment this if you're on Apache > 2.4:
      Require all granted
    </Directory>

</VirtualHost>

この設定も、conf-availableと同様で、このままでは有効になりません。
Apacheのコマンドで有効化します。
a2ensite site


Railsアプリの設定


Railsアプリ側にて、許可するアクセス方法(URL指定)を設定します。
バーチャルホスト設定で、URL指定でのアクセスになるため、そのURLでのアクセスをRailsでも許可しておく必要があります。

railsアプリの config/environments/development.rb に以下を追加。
config.hosts << "サーバーURL"


これで、Apache経由でRailsアプリが実行できるようになります。
Passengerの設定がなにげにややこしいのですが、やはりやり方がわかってしまえばどうってことは無いです。
ApacheとRailsの連携といいながら、Apache自体の設定や、バーチャルホストの設定なども混ざってしまいましたが、Railsで動かそうと思ったらだいたいこんな設定になるでしょう。