web-dev-qa-db-ja.com

PHP-FPMはサービスの再起動時にソケットを作成しません

問題と質問

Ubuntu Server 18.04 LTS。

PHP-FPMでsystemctl restartを使用しても、/var/run/php/に必要なソケットは作成されませんが、再起動では作成されます。

再起動せずにサービスを再起動できるようにセットアップを調整するにはどうすればよいですか?

概観

さまざまな年齢のWebアプリで使用するために、単一のサーバー(コンテナーなし)のソースから複数のPHP-FPMインスタンスをコンパイルしています。 PHP 7.1、PHP 7.2 and PHP 7.3互いに並べて設定しました。これらはすべて起動時に正しく起動します、それらはすべて/var/run/php/にソケットを持ち、ブラウザから期待どおりに応答します。

ブート後の/var/run/phpの内容

/var/run/php$ ls -l
total 0
srw-rw---- 1 www-data www-data 0 Apr  2 12:57 php7.1-fpm.sock
srw-rw---- 1 www-data www-data 0 Apr  2 12:57 php7.2-fpm.sock
srw-rw---- 1 www-data www-data 0 Apr  2 12:57 php7.3-fpm.sock

各サービスは問題なく実行されているようです。次に、それぞれのsystemctl status出力を示します。

起動後のPHP 7.1

~$ Sudo systemctl status php7.1-fpm
● php7.1-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/etc/systemd/system/php7.1-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-04-02 12:57:51 UTC; 21min ago
 Main PID: 875 (php-fpm)
    Tasks: 3 (limit: 1152)
   CGroup: /system.slice/php7.1-fpm.service
           ├─875 php-fpm: master process (/etc/php/7.1/etc/php-fpm.conf)
           ├─970 php-fpm: pool www
           └─971 php-fpm: pool www

Apr 02 12:57:51 darwin systemd[1]: Started The PHP FastCGI Process Manager.

起動後のPHP 7.2

~$ Sudo systemctl status php7.2-fpm
● php7.2-fpm.service - The PHP FastCGI Process Manager (7.2)
   Loaded: loaded (/etc/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-04-02 12:57:51 UTC; 22min ago
 Main PID: 837 (php-fpm)
    Tasks: 3 (limit: 1152)
   CGroup: /system.slice/php7.2-fpm.service
           ├─837 php-fpm: master process (/etc/php/7.2/etc/php-fpm.conf)
           ├─963 php-fpm: pool www
           └─964 php-fpm: pool www

Apr 02 12:57:51 darwin systemd[1]: Started The PHP FastCGI Process Manager (7.2).

起動後のPHP 7.3

~$ Sudo systemctl status php7.3-fpm
● php7.3-fpm.service - The PHP FastCGI Process Manager (7.3)
   Loaded: loaded (/etc/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-04-02 12:57:51 UTC; 23min ago
 Main PID: 836 (php-fpm)
    Tasks: 3 (limit: 1152)
   CGroup: /system.slice/php7.3-fpm.service
           ├─836 php-fpm: master process (/etc/php/7.3/etc/php-fpm.conf)
           ├─965 php-fpm: pool www
           └─966 php-fpm: pool www

Apr 02 12:57:51 darwin systemd[1]: Started The PHP FastCGI Process Manager (7.3).

対応するphp.iniファイルを変更した場合、変更を処理するためにサービスを再起動する必要があります。私の場合、systemctl restart(例:Sudo systemctl restart php7.1-fpm)を使用してサービスを再起動すると、サービスは正常に再起動しているように見えますが、すべてのPHPソケットは削除されます-再起動したバージョン。

systemctl restartの後にコンソール出力がありません。再起動したサービスでsystemctl statusを確認すると(たとえば、PHP 7.1))、サービスis実行中:

PHP 7.1以降systemctl restart

~$ Sudo systemctl status php7.1-fpm
● php7.1-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/etc/systemd/system/php7.1-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-04-02 13:28:06 UTC; 28s ago
 Main PID: 1704 (php-fpm)
    Tasks: 3 (limit: 1152)
   CGroup: /system.slice/php7.1-fpm.service
           ├─1704 php-fpm: master process (/etc/php/7.1/etc/php-fpm.conf)
           ├─1718 php-fpm: pool www
           └─1722 php-fpm: pool www

Apr 02 13:28:06 darwin systemd[1]: Stopped The PHP FastCGI Process Manager.
Apr 02 13:28:06 darwin systemd[1]: Started The PHP FastCGI Process Manager.

Activeのタイムスタンプの違いに注意してください。同じ方法で他のサービスにクエリを実行した場合(注:それらは私によって再起動されていない)、タイムスタンプは起動時の最初の開始からのものです。

PHP 7.1のsystemctl restartの後のPHP 7.2

~$ Sudo systemctl status php7.2-fpm
● php7.2-fpm.service - The PHP FastCGI Process Manager (7.2)
   Loaded: loaded (/etc/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-04-02 12:57:51 UTC; 33min ago
 Main PID: 837 (php-fpm)
    Tasks: 3 (limit: 1152)
   CGroup: /system.slice/php7.2-fpm.service
           ├─837 php-fpm: master process (/etc/php/7.2/etc/php-fpm.conf)
           ├─963 php-fpm: pool www
           └─964 php-fpm: pool www

Apr 02 12:57:51 darwin systemd[1]: Started The PHP FastCGI Process Manager (7.2).

PHP 7.1のsystemctl restartの後のPHP 7.3

~$ Sudo systemctl status php7.3-fpm
● php7.3-fpm.service - The PHP FastCGI Process Manager (7.3)
   Loaded: loaded (/etc/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-04-02 12:57:51 UTC; 34min ago
 Main PID: 836 (php-fpm)
    Tasks: 3 (limit: 1152)
   CGroup: /system.slice/php7.3-fpm.service
           ├─836 php-fpm: master process (/etc/php/7.3/etc/php-fpm.conf)
           ├─965 php-fpm: pool www
           └─966 php-fpm: pool www

Apr 02 12:57:51 darwin systemd[1]: Started The PHP FastCGI Process Manager (7.3).

…そして、まだすべてのソケットがありません:

/var/run/phpの後のsystemctl restartの内容PHP 7.1

$ ls -l
total 0

私の直感は、私が.serviceファイルで何かに気づかずにマングルしたことです。トラブルシューティングを行っているときに、PIDとソケットに別のディレクトリを使用していることに気付きました。 /run/php-fpm/が存在しないため、PIDはnotがブート時に作成されます。ソケットとPIDを同じディレクトリに保持しないようにアドバイスされるという漠然とした記憶がありますが、正確な詳細を思い出せません。

PHP 7.1 .serviceファイル

[Unit]
Description=The PHP FastCGI Process Manager
After=network.target

[Service]
Type=simple
RuntimeDirectory=php
RuntimePermissions=755
PIDFile=/run/php-fpm/php7.1-fpm.pid
ExecStart=/etc/php/7.1/sbin/php-fpm --nodaemonize --fpm-config /etc/php/7.1/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

ポインタや詳細については、事前にありがとうございます。

5
Pete Cooper

さらに調査したところ、ユニットファイルにRuntimeDirectoryPreserveディレクティブがないことがわかりました。サービスが停止すると、RuntimeDirectoryがソケットとともに削除されました。

systemd.exec からの抜粋

RuntimeDirectoryPreserve =ブール引数を取るか、再起動します。 no(デフォルト)に設定すると、RuntimeDirectory =で指定されたディレクトリは、サービスの停止時に常に削除されます。サービスを自動および手動で再開したときにディレクトリを再開するように設定されている場合、ディレクトリは保持されます。ここで、自動再起動はRestart =で指定された操作を意味し、手動再起動はsystemctl restart foo.serviceによってトリガーされる操作を意味します。 yesに設定すると、サービスが停止してもディレクトリは削除されません。ランタイムディレクトリ/ runは「tmpfs」のマウントポイントであるため、システムサービスの場合、システムを再起動すると、RuntimeDirectory =で指定されたディレクトリが削除されます。

改訂された(動作中の)ユニットファイル:

[Unit]
Description=The PHP FastCGI Process Manager (7.1)
After=network.target nginx.service

[Service]
Type=simple
RuntimeDirectory=php
RuntimeDirectoryMode=755
RuntimeDirectoryPreserve=yes
PIDFile=/run/php7.1-fpm.pid
ExecStart=/etc/php/7.1/sbin/php-fpm --nodaemonize --fpm-config /etc/php/7.1/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
2
Pete Cooper