问题与疑问
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 restart
PHP 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 restart
PHP 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/php
after的内容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