Debian 9上でApache+PassengerでRoRの公開環境をつくる

Debian 9 "Stretch" を用いたサーバ設定メモ - 発声練習Debian 9上でrbenvをシステムワイドにインストールする - 発声練習の続き。

目的

  • 複数のRuby on Railsアプリの公開できるようにする
  • Apache + Passengerで構築する
  • iptableで不要なポートを閉じる

iptableで不要なポートを閉じる

Debian 9 "Stretch" を用いたサーバ設定メモ - 発声練習にてすでに閉じている。40080, 400081をアプリ用に公開する。/etc/iptables/rule.v4に以下を追加する。

-A INPUT -p tcp -m tcp --dport 40080 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 40081 -j ACCEPT

反映させる。

% sudo iptables-restore < /etc/rules.v4

確認する。

% sudo iptables -L | grep 400

ApacheとPassengerのインストール

Installing Passenger + Apache on Debian 9 (with APT) - Passenger LibraryにしたがってPassengerをインストールする。

Passengerをaptでインストールできるように設定する。GPG鍵の登録。

% sudo apt-get install -y dirmngr gnupg
% sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
% sudo apt-get install -y apt-transport-https ca-certificates

/etc/apt/source.listに追加する。

% sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger stretch main > /etc/apt/sources.list.d/passenger.list'
% sudo apt-get update

PassengerおよびApacheモジュールのインストール。

% sudo apt-get install -y libapache2-mod-passenger
% sudo apt-get install -y apache2-dev  (passengerで使うapxs2のインストール)

Apacheにモジュールを付け加える。

% sudo a2enmod passenger
% sudo apache2ctl restart

正しくインストールできているかどうかを確かめる。Apacheを使う方を選ぶ。

sudo /usr/bin/passenger-config validate-install

PassengerInstanceRegistryDirを設定する。

% sudo mkdir -p /var/run/passenger-instreg

Debian 9では /var/runは tmpfsとして設定されているため、そのままだと再起動の度に削除されてしまう(参考:/var/run の中身が再起動すると消えてしまうので・・・お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ - Qiita)。そこで、 /etc/tmpfiles.d に設定を記載する。

% sudo touch /etc/tmpfiles.d/passenger.conf

/etc/tmpfiles.d/passenger.confの中見は以下のとおりにする。

d /var/run/passenger-instreg 0755 root root

rootのホームディレクトリ(/root)のシェルの設定ファイルに上記の添付ファイルに関する設定を記述する。たとえば、.bash_profileに以下を記述する。以下の例では合わせてRailsの実行モードについても記載する。

export PASSENGER_INSTANCE_REGISTRY_DIR=/var/run/passenger-instreg
export RAILS_ENV=production

railsのソースファイルが/home/hogehoge/rails-serverとし、http://hogehoge.net/rails/でアクセスできるようにするとき、シンボリックリンクをはる。Debian8からはApacheのデフォルトが/var/www/htmlになっているのでその下に置く。

% sudo ln -s  /home/hogehoge/rails-server/public /var/www/html/rails

Apacheの設定

/etc/apache2/ports.conf に新しく開けたポートの記述を追加する。

Listen 40080
Listen 40081

ポート番号40080でアクセスする設定を/etc/apache2/sites-available/001-vhost1.confとして設定する。以下の設定ファイルでSECRET_KEY_BASEの環境変数を定義しているのは、passenger経由だとユーザディレクトリの設定ファイル(.bash_profileなど)で設定した環境変数が反映されないため(参考→tail -f pinzo.log: 本番環境での secret_key_base 設定)。

PassengerInstanceRegistryDir /var/run/passenger-instreg #上述のディレクトリ

<VirtualHost *:40080>
	ServerName サーバのFQDN

	ServerAdmin 連絡先メールアドレス
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/vhost1_error.log
	CustomLog ${APACHE_LOG_DIR}/vhost2_access.log combined

	PassengerRuby /usr/local/rbenv/versions/2.4.2/bin/ruby # rbenvで導入したrubyを指定する
	PassengerFriendlyErrorPages off  #onにするとエラー時にログが表示される。
	
	SetEnv SECRET_KEY_BASE 「秘密鍵につかう文字列 bundle exec rails secret で生成」
	RackEnv production
	RackBaseURI /rails

</VirtualHost>

設定を反映させる。

% sudo a2ensite vhost1
% sudo systemctl reload apache2

Railsアプリを修正したとき

passengerを再起動する(参考:Restarting applications)。

% sudo passenger-config restart-app