passenger-config and passenger-status result in an error on CentOS7.
- CentOS Linux release 7.2.1511 (Core)
- Apache/2.4.6 (CentOS)
- Phusion Passenger 5.0.23 (Installed by `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.
Reason
Passenger could not find instance registry directory (PassengerInstanceRegistryDir on Apache, passenger_instance_registry_dir on Nginx).
If instance registry directory is not explicitly specified, default value /tmp is used.
So instance registry dir is made in /tmp. But because Systemd PrivateTmp option is enabled on httpd (default), instance registry dir is created in httpd's private /tmp directory (/tmp/systemd-private-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-httpd.service-XXXXXX/tmp). This directory can't be found by other processes such as passenger-config or passenger-status.
This problem owes to Systemd's PrivateTmp, so it may also occurs on RHEL7 or Amazon Linux 2.
Workaround 1: Explicitly specify PassengerInstanceRegistryDir
This workaround remains Systemd's PrivateTmp enabled.
Explicitly specify Passenger's instance registry directory so that instance registry dir is not made in httpd's private /tmp directory.
[/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
(on Apache)
/etc/httpd/conf/httpd.conf
PassengerInstanceRegistryDir /run/passenger-instreg
Because files and directories in /run is deleted on reboot, you must add config file in tmpfiles.d.
See man 5 tmpfiles.d for details.
/etc/tmpfiles.d/passenger.conf
D /run/passenger-instreg 0755 root root
You must add PASSENGER_INSTANCE_REGISTRY_DIR for the users who executes passenger-status and passenger-config.
~/.bash_profile
export PASSENGER_INSTANCE_REGISTRY_DIR=/run/passenger-instreg
If you use capistrano-passenger, you must set PASSENGER_INSTANCE_REGISTRY_DIR in the stage's deploy recipe because capistrano-passenger executes `passenger-config restart-app`.
set :default_env, { ...(omit).., "PASSENGER_INSTANCE_REGISTRY_DIR" => "/run/passenger-instreg" }
Finally restart system.
Workaround 2: Disable PrivateTmp on httpd.service
This workaround disables Systemd's PrivateTmp on httpd.service.
$ sudo systemctl edit httpd.service
[Service] PrivateTmp=false
Then execute below.
$ sudo systemctl restart httpd.service
Copy /usr/lib/systemd/system/httpd.service to /etc/systemd/system and edit it.
/etc/systemd/system/httpd.service
...(omit)
PrivateTmp=false
...(omit)
Then execute below.
$ sudo systemctl daemon-reload$ sudo systemctl restart httpd.service
Source: CentOS 7 で Phusion Passenger の passenger-status を実行するとエラーとなる - Qiita
お前らもさっさとハマって泣くべきCentOS7の落とし穴4つ - Qiita
Handle systemd PrivateTmp #1475
Systemd入門(5) - PrivateTmpの実装を見る - めもめも
Thanks for this, it was exactly what I needed to read today.
Thank you for a very helpful post! Same problem in Ubuntu 18.04. Option 2 can be implemented by editing: /etc/systemd/system/multi-user.target.wants/apache2.service
Thanks, you save the day!
For workaround #2, you should not edit or copy files from /usr/lib/systemd/system. Systemd provides a way to easily override managed or third-party configuration. All you need to do is the following:
> sudo systemctl edit apache2
and insert into the file and save:
[Service]
PrivateTmp=false
For more information: https://askubuntu.com/a/659268
Thank you for letting me know!
I fixed it to use `systemctl edit`.
None of this makes any difference for me on Ubuntu 18.04 LTS.
I still see the same error after applying these steps and even a server restart (it’s the only app on the server and it isn’t live yet).
Thank you, you saved my day
Excellent article, thank you.