我知道以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-reload
和systemctl start php<version>-fpm
(请参阅此处(
我使用了以下问题/答案/资源来帮助我编译此解决方案。
- https://serverfault.com/a/189961
- https://serverfault.com/q/788669
- https://stackoverflow.com/a/52919706/9530790
- https://serverfault.com/a/867334
- https://www.geeksforgeeks.org/what-is-init-d-in-linux-service-management/
这3个步骤将修复错误。
- 找到
php-fpm.service
。对我来说是/usr/lib/systemd/system/php-fpm.service
。如果您不确定它在哪里,请键入find / -name php-fpm.service
- 将-R附加到
ExecStart
变量。例如ExecStart=/usr/sbin/php-fpm --nodaemonize -R
- 重新启动
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 然后,在您的Dockerfile中,将该文件注入到您的容器中,该文件的名称将在默认www.conf:之后加载[www]
user = root
group = root
COPY ./docker.conf /usr/local/etc/php-fpm.d/zzz-docker.conf
更新2018
在容器中运行它可能是以root身份运行php-fpm
的正当理由。可以通过将-R
命令行参数传递给来完成
原始答案:
然而,在某些情况下,人们需要这样做,比如设备,访问操作系统资源
你永远不需要这样做。就是这样。如果你在管理系统资源,请为php-fpm用户授予该资源的权限,而不是以root身份运行整个过程。如果你的问题更具体一点,我可以展示在特定情况下如何做到这一点。