修复 AH02454 权限被拒绝错误后,php-fpm 重新启动时 /run/php-fpm/www.sock 的权限被重置为 root

修复 AH02454 权限被拒绝错误后,php-fpm 重新启动时 /run/php-fpm/www.sock 的权限被重置为 root

我正在迁移到一个新的服务器来升级我的内部组件,在启动我的 Apache 和 PHP 时遇到了这个错误

[Fri Apr 09 16:51:26.243820 2021] [proxy:error] [pid 31179:tid 140021109556992] (13)Permission denied: AH02454: FCGI: attempt to connect to Unix domain socket /run/php-fpm/www.sock (*) failed
[Fri Apr 09 16:51:26.243868 2021] [proxy_fcgi:error] [pid 31179:tid 140021109556992] [client 47.213.222.69:56165] AH01079: failed to make connection to backend: httpd-UDS

/run/php-fpm/www.sock文件确实存在,但它具有 root:root 权限。我的 Web 服务器在非默认用户下运行apache(该用户是sites

经过大量搜索我找到了这篇文章PHP-FPM - 错误 503 - 尝试连接 Unix 域套接字失败并发现该/run/php-fpm/www.sock文件需要分配给运行 httpd 的同一用户。所以我照做了$chown sites: /run/php-fpm/www.sock,一切开始正常工作。

但是,如果重新启动 php-fpm 服务,权限将恢复为 root:root,并且 PHP 页面将返回 503

因此我检查/etc/php-fpm.d/www.conf并更新了这些行:

user = sites
group = apache
 .
 .
 .
listen.owner = sites
listen.group = apache

www.sock再次更改了文件的所有权,但当 php-fpm 服务重新启动时,它仍然会将该文件的权限恢复www.sockroot:root

所以我被难住了,而且在我的搜索中似乎找不到关于这个错误的信息。我知道使用 chown 命令可以解决这个问题,但是如果我的服务器将来需要重新启动,我怀疑我会记得这样做,除非我添加 @reboot cron 或类似的东西,但我不应该这样做。我一定是在某个地方缺少一些配置,我就是找不到它。

我的系统信息:Centos 8 Stream,PHP 7.2.24,Apache 2.4.37

答案1

我遇到了同样的问题,我的配置文件/etc/php-fpm.d/www.conf和你的一样正确。

当我看到我的php-fpm.service以 root 身份启动。

我编辑文件/usr/lib/systemd/system/php-fpm.service并添加:

[service]
User=youruser
Group=YourGroup

还请检查文件中看到的所有路径的权限:/etc/php-fpm.conf,例如日志文件。

答案2

www.conf 中有以下条目:

listen.owner
listen.group
listen.mode

我猜想它们默认为不允许任何人访问,因此 Web 服务器无法访问 sock 文件。我更改了这三个设置(实际上是启用了),并将我的 httpd 用户和组添加为所有者和组,将模式设置为 755(因为 644 不起作用),现在 Web 服务器可以正常工作并与 php 通信。我不知道这是否是正确的解决方案,或者 acl_users 是否更“正确”……但看起来这两种方法都有效。

答案3

[2023 年更新]

总结

listen.acl_groups必須無效。

解释

唯一的问题listen.acl_groups/etc/php-fpm.d/www.conf

如果已设置,则listen.owner 和 listen.group 被忽略,正如其自己的评论所解释的那样:

; When POSIX Access Control Lists are supported you can set them using
; these options, value is a comma separated list of user/group names.
; When set, listen.owner and listen.group are ignored

解决方案

因此,解决方案是将其更改为 void 值,如下所示:

listen.acl_groups =

我在 Almalinux、Rocky Linux、CentOS、RedHat 8 和 9 上验证了此行为

答案4

如果您在 Ubuntu 中使用 Apache2,请在池文件中进行以下更改:

listen.owner = www-data
listen.group = www-data

相关内容