CentOS7环境下Laravel因supervisor以root运行引发缓存权限错误求助
解决方案
根因说明
当前问题是由Supervisor管理的Horizon进程以root用户运行,生成的缓存目录/文件属主为root,而Web端运行的Laravel进程使用apache用户,无权限操作root属主的缓存资源,触发权限报错。
最优修复步骤(推荐)
- 修改Supervisor的Horizon配置文件,将运行用户改为和Web进程一致的
apache
修改对应配置段的user参数:
- 修改Supervisor的Horizon配置文件,将运行用户改为和Web进程一致的
[program:api-horizon] process_name=%(program_name)s command=php /var/www/html/example.com/artisan horizon autostart=true autorestart=true user=apache # 原root配置改为apache redirect_stderr=true stopwaitsecs=86400
- 修复已有缓存目录的权限归属,递归修改storage目录属主:
chown -R apache:apache /var/www/html/example.com/storage
- 重载Supervisor配置并重启对应进程:
supervisorctl reread supervisorctl update supervisorctl restart api-horizon
特殊场景方案(不推荐,仅当必须用root运行Horizon时使用)
如果业务要求Horizon必须以root权限运行,可通过调整权限规则修复:
- 将apache用户加入root用户组
usermod -aG root apache
- 修改Laravel文件权限配置,编辑
config/filesystems.php,调整缓存生成的默认权限,确保同组用户有读写权限:
- 修改Laravel文件权限配置,编辑
'disks' => [ // ...其他原有配置 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), 'permissions' => [ 'file' => 0664, 'dir' => 0775, ], ], // 同理调整cache相关磁盘配置的权限参数 ],
- 重启Web服务和Supervisor进程生效
注意:该方案会提升apache用户权限,存在安全风险,非必要不使用。
验证
修复完成后可查看新生成的缓存目录属主是否为apache:apache,触发业务逻辑验证权限报错是否消失。
内容的提问来源于stack exchange,提问作者Maksat
相关产品推荐
相关产品推荐

