如何将php-fpm以root身份运行

24

我知道将php-fpm运行在root用户的风险。 然而有些情况下确实需要这样做,例如用于设备、访问操作系统资源或者测试目的。

我尝试将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]

我该怎么办?有人能帮助我吗?

5个回答

65

请参见:

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

2
我不确定你所说的“link”是什么意思。我提供了一个shell命令作为参考以及相关部分的输出结果。如果命令的输出发生变化,那么结果的相关部分也会不同,这正是你想要看到的(例如,-R可能不再起作用,无法让池以root身份运行)。也许我没有完全清楚地表明它是一个shell命令,但这种格式是表示bash命令的标准符号。 - ex-nerd
3
如果有人想要使用他们的配置来运行此程序,请使用“-y”参数:php-fpm -y /etc/php-fpm.conf -R将会使用您现有的配置,并在后台启动守护进程。 - Brad
我认为你的答案不够完整,无论是php-fpm还是php7.4-fpm --help都没有起作用。这个链接解决了我的问题:https://serverfault.com/questions/788669/start-php-fpm-with-root-option-automatically - Oriol Vilaseca

4
仅仅添加-R(如这个答案建议的那样)可能不起作用。它取决于你运行启动php-fpm命令的方式。
如果你使用的是service php-fpm restart并且它使用的是/etc/init.d而不是systemctl(请参见这里),那么你将不得不将-R添加到位于/etc/php/<phpversion>/fpm/php-fpm.conf脚本中的DAEMON_ARGS变量中。(该变量在do_start()函数中使用。请参见这里)。
如果它使用的是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://dev59.com/T1QK5IYBdhLWcg3wPNlG#52919706
  4. https://serverfault.com/a/867334
  5. https://www.geeksforgeeks.org/what-is-init-d-in-linux-service-management/

1
这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

0

默认情况下,php-fpm随附一个包含默认www-data用户配置的“www.conf”文件。

[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

-24

更新 2018

在容器内运行它是以 root 用户身份运行 php-fpm 的一个可能的有效原因。可以通过向其传递 -R 命令行参数来实现。


原始回答:

然而,有些情况下确实需要这样做,比如家电、访问操作系统资源等。

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


7
这不是对问题的有效回答。有时候,php-fpm需要被赋予root权限。例如,我设置了一个单用户linux虚拟机,在NAT后面(所有端口转发仅从我的环回适配器完成)。这个虚拟机与Win32虚拟机主机共享目录,并且用于共享资源的工具要求在linux客户操作系统上所有文件都由root:root拥有。唯一的解决方案是让php5-fpm也作为root运行,以便能够读写共享位置中的文件/目录。这是将php5-fpm作为root运行的完全合理的使用案例。 - Sam Levin
3
同样的意思:“我执行了 chown -R root:root / 命令,现在只能使用root权限运行vim。” - hek2mgl
4
有时候,“我怎么做X?”的最佳答案很可能是“千万不要做X!”。例如,用BCPL编写会计软件,或用COBOL编写操作系统,或者在Perl中编写几乎任何东西(pax躲避)。以root权限运行庞大复杂的进程是极其糟糕的想法。如果进程需要一些超级权限,请给它执行访问权限,但只运行一个非常受控制的可执行文件就可以了(而且这就是它所能做的全部)。锁定一个小型、严密受控制的可执行文件远比锁定一个巨大的庞然大物容易得多。 - paxdiablo
3
关于“绝不要做X!”这句话,我认为有时候是正确的,但在这个情境下,如果该程序中提供了一个名为“--allow-to-run-as-root”的命令行标记,那么获得最高票数的回答是正确的,应该被接受。请注意,我的翻译保留了原文的意思和语气,同时尽可能地让内容更加易懂。 - trey-jones
4
我的具体使用情况是在一个 Docker 容器中,其中 php-fpm 需要写入挂载目录。可能还有其他情况。如果该实用程序公开了一种轻松的方法来实现此操作,那么为什么不将其作为被接受的答案呢? - trey-jones
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接