如何以root身份运行php-fpm


How to run php-fpm as root

我知道以root身份运行php-fpm的风险。然而,在某些情况下,需要来完成,比如电器,访问操作系统资源,甚至用于测试目的。

我已经尝试将php-fpm.d/www.conf的用户和组更改为root当我重新启动php-fpm进程时,它会引发一个错误:

Starting php-fpm: [26-Jun-2014 00:39:07] ERROR: [pool www] please specify user and group other than root
[26-Jun-2014 00:39:07] ERROR: FPM initialization failed
[FAILED]

我该怎么办。有人帮忙吗?

参见:

# php-fpm --help
...
 -R, --allow-to-run-as-root
               Allow pool to run as root (disabled by default)

仅将-R(如ans.建议的那样(添加到命令中可能不起作用。这取决于您如何运行启动php-fpm的命令。

如果您使用的是service php-fpm restart,而它使用的是/etc/init.d而不是systemctl(请参阅此处(,那么您必须将-R添加到位于/etc/php/<phpversion>/fpm/php-fpm.conf脚本中的DAEMON_ARGS变量中。(此变量用于do_start()函数。请参阅此处(。

如果使用systemctl,则必须编辑systemctl使用的脚本,该脚本应位于/lib/systemd/system/<phpversion>-fpm.service中。将-R附加到ExcecStart变量中。然后运行systemctl daemon-reloadsystemctl start php<version>-fpm(请参阅此处(

我使用了以下问题/答案/资源来帮助我编译此解决方案。

  1. https://serverfault.com/a/189961
  2. https://serverfault.com/q/788669
  3. https://stackoverflow.com/a/52919706/9530790
  4. https://serverfault.com/a/867334
  5. https://www.geeksforgeeks.org/what-is-init-d-in-linux-service-management/

这3个步骤将修复错误。

  1. 找到php-fpm.service。对我来说是/usr/lib/systemd/system/php-fpm.service。如果您不确定它在哪里,请键入find / -name php-fpm.service
  2. 将-R附加到ExecStart变量。例如ExecStart=/usr/sbin/php-fpm --nodaemonize -R
  3. 重新启动php-fpm。如果systemctl restart php-fpm抛出错误,请运行systemctl daemon-reload

对于其他想知道如何让php以root身份运行的人,您还需要修改/etc/php-fpm.d/www.conf或修改它的副本。用户和组都需要更改为root。如果您已经复制了www.conf,那么还需要修改这一行listen = /run/php-fpm/www.sock

默认情况下,php-fpm附带一个"www.conf";其中包含默认的www数据用户配置:

[www]
user = www-data
group = www-data

因此,您需要创建另一个文件,在www.conf之后加载,该文件将覆盖默认配置。例如,在与php-fpm的Dockerfile相同的路径中创建一个文件docker.conf

[www]
user = root
group = root

然后,在您的Dockerfile中,将该文件注入到您的容器中,该文件的名称将在默认www.conf:之后加载

COPY ./docker.conf /usr/local/etc/php-fpm.d/zzz-docker.conf

更新2018

在容器中运行它可能是以root身份运行php-fpm的正当理由。可以通过将-R命令行参数传递给来完成


原始答案:

然而,在某些情况下,人们需要这样做,比如设备,访问操作系统资源

你永远不需要这样做。就是这样。如果你在管理系统资源,请为php-fpm用户授予该资源的权限,而不是以root身份运行整个过程。如果你的问题更具体一点,我可以展示在特定情况下如何做到这一点。