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

Pet*_*per 5 server command-line 18.04

问题和问题

Ubuntu 服务器 18.04 LTS。

使用systemctl restart的PHP-FPM不创建所需的插座/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
Run Code Online (Sandbox Code Playgroud)

每个服务似乎都没有问题地运行。这是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.
Run Code Online (Sandbox Code Playgroud)

启动后的 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).
Run Code Online (Sandbox Code Playgroud)

启动后的 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).
Run Code Online (Sandbox Code Playgroud)

如果我对相应的php.ini文件进行了更改,这将保证重新启动服务以处理更改。就我而言,当我使用systemctl restart(eg 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.
Run Code Online (Sandbox Code Playgroud)

请注意 上的时间戳差异Active。如果我以相同的方式查询其他服务(注意:我没有重新启动它们),时间戳来自启动时的初始启动:

PHP 7.2 之后systemctl restart的 PHP 7.1

~$ 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).
Run Code Online (Sandbox Code Playgroud)

PHP 7.3 之后systemctl restart的 PHP 7.1

~$ 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).
Run Code Online (Sandbox Code Playgroud)

……然而所有的套接字都不见了:

PHP 7.1/var/run/php之后的内容systemctl restart

$ ls -l
total 0
Run Code Online (Sandbox Code Playgroud)

我的直觉是我在.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
Run Code Online (Sandbox Code Playgroud)

预先感谢您提供任何指示或进一步阅读。

Pet*_*per 6

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

\n\n

摘自systemd.exec

\n\n
\n

RuntimeDirectoryPreserve=采用布尔参数或重新启动。如果设置为 no(默认值),则在服务停止时始终删除 RuntimeDirectory= 中指定的目录。如果设置为重新启动,则自动和手动重新启动服务时都会保留目录。这里,自动重启是指Restart=中指定的操作,手动重启是指systemctl restart foo.service触发的操作。如果设置为 yes,则服务停止时不会删除目录。请注意,由于运行时目录 /run 是“tmpfs”的挂载点,因此对于系统服务,当系统重新启动时,RuntimeDirectory= 中指定的目录将被删除。

\n
\n\n

修订(工作)单位文件:

\n\n
[Unit]\nDescription=The PHP FastCGI Process Manager (7.1)\nAfter=network.target nginx.service\n\n[Service]\nType=simple\nRuntimeDirectory=php\nRuntimeDirectoryMode=755\nRuntimeDirectoryPreserve=yes\nPIDFile=/run/php7.1-fpm.pid\nExecStart=/etc/php/7.1/sbin/php-fpm --nodaemonize --fpm-config /etc/php/7.1/etc/php-fpm.conf\nExecReload=/bin/kill -USR2 $MAINPID\n\n[Install]\nWantedBy=multi-user.target\n
Run Code Online (Sandbox Code Playgroud)\n