CentOS7でpassenger-configやpassenger-statusがエラーになる。
- CentOS Linux release 7.2.1511 (Core)
- Apache/2.4.6 (CentOS)
- Phusion Passenger 5.0.23 (passenger-install-apache2-moduleでインストール)
$ passenger-config restart-app *** ERROR: Phusion Passenger doesn't seem to be running. If you are sure that it is running, then the causes of this problem could be one of: 1. You customized the instance registry directory using Apache's PassengerInstanceRegistryDir option, Nginx's passenger_instance_registry_dir option, or Phusion Passenger Standalone's --instance-registry-dir command line argument. If so, please set the environment variable PASSENGER_INSTANCE_REGISTRY_DIR to that directory and run this command again. 2. The instance directory has been removed by an operating system background service. Please set a different instance registry directory using Apache's PassengerInstanceRegistryDir option, Nginx's passenger_instance_registry_dir option, or Phusion Passenger Standalone's --instance-registry-dir command line argument.
原因
Passengerのinstance registry directory(Apacheの場合はPassengerInstanceRegistryDir、Nginxの場合はpassenger_instance_registry_dir)が見つからないのが原因。
instance registry directoryを明示的に指定していない場合のデフォルトは/tmpなので、instance registry directoryは/tmp下に作成されるが、SystemdのPrivateTmpオプションがhttpdで有効になっている(デフォルト)ため、httpd専用の/tmp(実際には/tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-httpd.service-XXXXXX/tmp)に作成される。このディレクトリが、別プロセスであるpassenger-configやpassenger-statusには見つけられないのだ。
SystemdのPrivateTmpによって発生する問題なので、RHEL7やAmazon Linux 2でも同様だろう。
解決方法1: PassengerInstanceRegistryDirを明示的に指定する
SystemdのPrivateTmpは有効にしたままで対処する方法。
Passengerのinstance registry directoryがhttpd専用の/tmpに作成されないように、明示的に指定する。
[/etc/tmpfiles.d/passenger.conf:1] Line references path below legacy directory /var/run/, updating /var/run/passenger-instreg → /run/passenger-instreg; please update the tmpfiles.d/ drop-in file accordingly.
Systemd logs warnings about the legacy tmpfile location /var/run - Red Hat Customer Portal
(Apacheの場合)
/etc/httpd/conf/httpd.conf
PassengerInstanceRegistryDir /run/passenger-instreg
/run に置くファイル、ディレクトリは、再起動すると削除されてしまうので、tmpfiles.dに設定が必要。
詳細は、man 5 tmpfiles.d を参照。
/etc/tmpfiles.d/passenger.conf
D /run/passenger-instreg 0755 root root
passenger-status、passenger-configを実行するユーザにPASSENGER_INSTANCE_REGISTRY_DIRの設定が必要。
~/.bash_profile
export PASSENGER_INSTANCE_REGISTRY_DIR=/run/passenger-instreg
capistrano-passengerを使用している場合は、デプロイ後のpassenger-config restart-appでPASSENGER_INSTANCE_REGISTRY_DIRの指定が必要なので、該当するステージのデプロイレシピに以下を追加する。
set :default_env, { ...(略).., "PASSENGER_INSTANCE_REGISTRY_DIR" => "/run/passenger-instreg" }
以上を設定したら、システムを再起動する。
解決方法2: httpd.serviceのPrivateTmpを無効にする
SystemdのPrivateTmpをhttpdで無効にしてしまう方法。
$ sudo systemctl edit httpd.service
[Service] PrivateTmp=false
保存後、httpdを再起動する。
$ sudo systemctl restart httpd.service
/usr/lib/systemd/system/httpd.service を /etc/systemd/system にコピーすると、/etc/systemd/system に置いたファイルが優先される。コピーしたhttpd.serviceのPrivateTmpをfalseに変更する。
/etc/systemd/system/httpd.service
...(略)PrivateTmp=false...(略)
変更後、
$ sudo systemctl daemon-reload$ sudo systemctl restart httpd.service
情報源: CentOS 7 で Phusion Passenger の passenger-status を実行するとエラーとなる - Qiita
お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ - Qiita
Handle systemd PrivateTmp #1475
Systemd入門(5) - PrivateTmpの実装を見る - めもめも