我试图让 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 身份运行池。