使用 root 选项自动启动 PHP-FPM

使用 root 选项自动启动 PHP-FPM

我试图让 PHP-FPM 以 root 身份运行池,但似乎无法调整 init.d 启动参数。

从 CLI 启动 PHP-FPM 时它可以工作(使用sudo php-fpm7.0 -DRy /etc/php/7.0/fpm/php-fpm.conf,但我无法使用命令service()来让它工作sudo service php7.0-fpm (re)start。因此,每次服务器重新启动时,PHP-FPM 都会失败,我必须运行此命令。

我曾尝试放置一个带有/etc/default该行的文件“php-fpm7.0” DAEMON_ARGS="--daemonize --fpm-config $CONFFILE -R",甚至尝试直接将-R参数添加到do_start函数中/etc/init.d/php7.0-fpm,但我仍然收到错误please specify user and group other than root

有什么方法可以让它在启动时并使用命令运行吗service


题外话:我知道所有的风险,也知道为什么不应该这么做,但我还是想这么做。我需要运行一些脚本来创建目录、执行 chown 命令等,并且该池将专用于 nginx 服务器块使用的后端,该服务器块只能通过一个特定的 URL 路径从私有 192.168.1.X 网络内访问。

另外,我可以设置一个 cron 脚本,以 root 身份执行 PHP 脚本,但这种方法会花费我更多的时间。

答案1

在 systemd 系统上,你可能必须通过 systemd 而不是 system V init 脚本进行配置

以下步骤已在 Ubuntu 16.04 LTS 上测试并可行。这是导致重定向初始化脚本的罪魁祸首:

/lib/lsb/init-functions.d/40-systemd

1. 编辑您的 php-fpm 池配置,例如/etc/php/7.0/fpm/pool.d/www.conf将 root 配置为用户/组为 root

;Unix 用户/进程组
; 注意:用户必填,若未设置组,则默认用户组
; 将会被使用。
用户 = root
组 = 根

2. 编辑 /lib/systemd/system/php7.0-fpm.service并将 -R 附加到ExecStart变量以允许服务以 root 身份运行

ExecStart=/usr/sbin/php-fpm7.0 --nodaemonize --fpm-config /etc/php/7.0/fpm/php-fpm.conf -R

3.重新加载配置

$ systemctl 守护进程重新加载

4.启动服务

$ systemctl 启动 php7.0-fpm

5. 检查一下

$ ps auwx | grep php
root 32061 0.0 0.0 221680 26084 ?Ss 16:59 0:00 php-fpm:主进程(/etc/php/7.0/fpm/php-fpm.conf)
root 32063 0.0 0.0 221680 4992 ? S 16:59 0:00 php-fpm:池 www
root 32064 0.0 0.0 221680 4992 ? S 16:59 0:00 php-fpm:池 www

答案2

我终于找到了解决办法。原来 Ubuntu 用来systemd启动和重启 PHP-FPM,因此忽略了这些init.d文件。

如果您遇到文件调整init.d被忽略的问题并且您使用的是 Ubuntu 15.04 或更高版本,那么该服务很可能systemd也有一个服务文件。


因此,我的问题的解决方法是:我的系统有一个名为的文件/lib/systemd/system/php7.0-fpm.service,该文件由使用systemd。使用命令,cat /lib/systemd/system/php7.0-fpm.service您可以查看服务文件的内容。您将 替换php7.0-fpm.service为您的服务文件的名称。PHP7.0-FPM 的服务文件如下所示:

[Unit]
Description=The PHP 7.0 FastCGI Process Manager
Documentation=man:php-fpm7.0(8)
After=network.target

[Service]
Type=notify
PIDFile=/run/php/php7.0-fpm.pid
ExecStart=/usr/sbin/php-fpm7.0 --nodaemonize --fpm-config /etc/php/7.0/fpm/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

在我的例子中,我需要调整ExecStart规则。我们不必编辑此文件,因为 systemd 提供了一种覆盖特定规则的方法。该命令sudo systemctl edit php7.0-fpm.service将打开一个编辑器,您可以在其中输入这些规则。只需输入要调整的规则部分并保存文件即可。在我的例子中,它看起来像这样:

[Service]
ExecStart=
ExecStart=/usr/sbin/php-fpm7.0 --allow-to-run-as-root --nodaemonize --fpm-config /etc/php/7.0/fpm/php-fpm.conf

确保先重置要编辑的规则,否则将执行两个规则。还请确保sudo systemctl daemon-reload在保存此文件后运行。就我而言,现在允许在 Ubuntu 16.04 上以 root 身份运行池。

相关内容