因Socket权限问题无法以shell_user身份运行PHP(Apache+PHP-FPM环境)
问题背景
在Debian 11 (Bullseye)环境下运行Apache + PHP-FPM,且无法修改Apache与PHP www池的核心配置(两者均配置为user = shell_user、group = shell_user)。重启PHP-FPM服务后,/run/php/php7.4-fpm.sock文件的所有者被设为www-data:www-data,导致Apache访问PHP文件时出现503错误,Apache错误日志提示权限拒绝:
[Mon Jun 05 11:03:25.599836 2023] [proxy:error] [pid 19819:tid 139705513932544] (13)Permission denied: AH02454: FCGI: attempt to connect to Unix domain socket /run/php/php7.4-fpm.sock (*:80) failed
手动将sock文件所有者改为www-data:shell_user后服务恢复正常,但需要实现重启或开机后的持久化生效。
可行解决方案
方案1:修改PHP-FPM池的Socket权限配置
编辑PHP-FPM的www池配置文件(路径通常为/etc/php/7.4/fpm/pool.d/www.conf),添加或调整以下参数:
listen.owner = www-data listen.group = shell_user listen.mode = 0660
保存配置后重启PHP-FPM服务:
systemctl restart php7.4-fpm.service
此配置会让PHP-FPM启动时自动将socket文件的所有者和权限设置为符合Apache访问要求的状态,无需后续手动修改。
方案2:通过systemd服务的启动后钩子修改权限
若无法修改PHP-FPM池配置,可编辑PHP-FPM的systemd服务文件(/lib/systemd/system/php7.4-fpm.service),在[Service]段添加启动后执行的指令:
ExecStartPost=/bin/chown www-data:shell_user /run/php/php7.4-fpm.sock
重新加载systemd配置并重启服务:
systemctl daemon-reload systemctl restart php7.4-fpm.service
该指令会在PHP-FPM启动完成后自动修正socket文件的所有者,确保每次重启或开机后权限正确。
方案3:利用文件访问控制列表(ACL)实现持久化权限
- 首先安装ACL工具(若未安装):
apt install acl
- 为socket文件设置ACL,让
shell_user组拥有读写权限:
setfacl -m g:shell_user:rw /run/php/php7.4-fpm.sock
由于/run是临时文件系统,重启后ACL会失效,需创建一个systemd服务来在开机时自动执行该命令:
创建服务文件/etc/systemd/system/fix-php-sock-acl.service:
[Unit] Description=Fix PHP-FPM socket file ACL permissions After=php7.4-fpm.service [Service] Type=oneshot ExecStart=/bin/setfacl -m g:shell_user:rw /run/php/php7.4-fpm.sock [Install] WantedBy=multi-user.target
启用并启动该服务:
systemctl enable fix-php-sock-acl.service systemctl start fix-php-sock-acl.service
验证
执行上述任一方案后,重启PHP-FPM服务,通过ls -la /run/php/php7.4-fpm.sock检查文件权限或所有者,随后访问PHP页面确认503错误已解决。
内容的提问来源于stack exchange,提问作者realtebo

