PHP-FPM 在服务重启时不创建套接字

PHP-FPM 在服务重启时不创建套接字

问题与疑问

Ubuntu Server 18.04 LTS。

在 PHP-FPM 上使用systemctl restart不会创建所需的套接字/var/run/php/,但重新启动会。

我如何调整设置以允许服务重新启动而无需重新启动?

概述

我正在单台服务器(无容器)上从源代码编译多个 PHP-FPM 实例,以用于不同年代的 Web 应用。我已成功同时设置了 PHP 7.1、PHP 7.2 和 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)时,服务跑步:

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。如果我以相同的方式查询其他服务(注意:我没有重新启动它们),时间戳是从启动时的初始启动开始的:

systemctl restartPHP 7.1之后的 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).

systemctl restartPHP 7.1之后的 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).

…但所有的插座都不见了:

PHP 7.1 上/var/run/phpafter的内容systemctl restart

$ ls -l
total 0

我的直觉是,我.service在不知情的情况下弄乱了文件中的某些内容。在进行故障排除时,我注意到我对 PID 和套接字使用了不同的目录。PID 是不是在启动时创建的/run/php-fpm/不存在。我依稀记得有人建议不要将套接字和 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

提前感谢您的任何指点或进一步阅读。

答案1

经过进一步调查,我发现RuntimeDirectoryPreserve我的单元文件中缺少一条指令。当服务停止时,该指令RuntimeDirectory被删除……连同套接字一起被删除。

摘录自systemd.exec

运行时目录保留=接受布尔参数或重新启动。如果设置为 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

相关内容