CentOS 8.4下Laravel 8 storage缓存ee文件夹权限错误致jwt-auth报错
问题核心原因
你遇到的权限异常本质是两个常见的部署配置疏漏:
- 你大概率用root用户执行Deployer部署命令/运行Laravel CLI命令,新生成的缓存子目录默认继承执行用户的所有者权限,导致子目录归属root
- Deployer的默认权限配置没有递归覆盖shared存储目录下的动态生成子目录,Laravel默认的文件权限掩码也没有强制设置归属规则
你看到的file_put_contents报错提示No such file or directory属于系统误导性提示,本质是apache用户没有权限在归属root的ee目录下创建子目录和文件。
永久解决方案
1. 修正Deployer部署配置
这是最优先的修复项,从部署流程层面强制权限规则:
- 在你的
deploy.php配置文件中添加如下全局配置,指定web服务运行用户和可写目录的权限处理模式:
// 指定web服务运行用户 set('http_user', 'apache'); set('http_group', 'apache'); // 可写目录使用chown修改所有者,而非仅修改权限位 set('writable_mode', 'chown'); // 额外指定storage目录为可写目录 set('writable_dirs', [ ...get('writable_dirs'), 'storage', ]);
- 添加部署后置钩子,在每次部署完成后递归修正存储目录的权限,避免动态生成的子目录权限异常:
task('deploy:fix_storage_perm', function () { run('chown -R apache:apache {{deploy_path}}/shared/storage'); run('chmod -R 775 {{deploy_path}}/shared/storage'); }); // 在软链接切换完成后执行权限修正 after('deploy:symlink', 'deploy:fix_storage_perm');
- 先手动执行一次命令修正现有shared存储目录的所有权限:
chown -R apache:apache /var/www/project-beacon-api/shared/storage && chmod -R 775 /var/www/project-beacon-api/shared/storage
2. 修正Laravel框架的文件权限配置
从应用层面强制生成的文件/目录权限符合要求:
- 打开
config/filesystems.php,修改本地存储磁盘的配置,添加权限规则:
'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), // 新增权限配置 'permissions' => [ 'file' => 0664, 'dir' => 0775, ], ], // 如果你单独配置了缓存磁盘,也要给对应磁盘添加相同的permissions配置 ],
- 所有Laravel CLI命令(包括任务调度、队列消费、缓存清理等)都必须用apache用户执行,禁止用root运行:
- 任务调度写到apache用户的crontab中:执行
crontab -u apache -e添加调度规则 - 队列服务的systemd配置文件中指定
User=apache、Group=apache
- 任务调度写到apache用户的crontab中:执行
3. 验证修复效果
用apache用户执行缓存清理命令,避免root生成缓存文件:sudo -u apache php artisan cache:clear
之后访问API触发JWT鉴权逻辑,查看新生成的storage/framework/cache/data下的子目录所有者是否为apache:apache,确认无权限报错即可。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

