CentOS服务器重启后Laravel报storage/logs/laravel.log权限拒绝求助
我之前在CentOS上部署Laravel时也碰到过一模一样的问题——明明给了777权限,重启服务器后还是报日志文件无法打开的权限错误。大概率是SELinux限制或者文件/目录所有者不匹配导致的,咱们一步步排查解决:
1. 先确认文件/目录的所有者是否正确
Laravel的storage目录(包括子目录logs)需要归Web服务器的运行用户所有,而不是root或者其他用户。CentOS上常见的Web服务用户是apache(Apache服务)或nginx(Nginx服务),少数环境会用www-data。
先查看当前日志文件的所有者:
ls -l storage/logs/laravel.log
如果所有者不是Web服务用户,就修改整个storage目录的归属:
# 若使用Apache服务 chown -R apache:apache storage/ # 若使用Nginx服务 chown -R nginx:nginx storage/ # 部分环境用www-data用户 chown -R www-data:www-data storage/
2. 检查SELinux的限制(CentOS最常见的坑)
CentOS默认开启SELinux,它会在文件权限之外额外限制Web服务器的写入行为,哪怕你给了777权限也没用。
先查看SELinux状态:
sestatus
如果输出显示SELinux status: enabled,那就是它在搞鬼。
临时关闭测试(重启后会恢复)
如果只是想快速验证,可以临时关闭SELinux:
setenforce 0
刷新页面看看错误是否消失,要是消失了,就可以确定是SELinux的问题,接下来设置永久规则。
永久添加SELinux上下文(推荐,不关闭SELinux)
直接关闭SELinux会降低服务器安全性,更稳妥的方法是给Laravel的storage目录添加允许Web服务器写入的SELinux上下文:
# 给storage目录设置httpd可写的上下文 chcon -R -t httpd_sys_rw_content_t storage/ # 顺便给bootstrap/cache目录也设置(Laravel缓存也需要写入权限) chcon -R -t httpd_sys_rw_content_t bootstrap/cache/
这个设置重启服务器后不会失效,能在保持SELinux开启的同时让Laravel正常写入日志和缓存。
3. 调整到更安全的权限(别再用777了)
最后把目录权限调整到更安全的范围,777权限太开放,容易带来安全风险:
chmod -R 755 storage/ chmod -R 775 storage/logs/
或者直接用Laravel官方推荐的权限设置:
chmod -R 775 storage bootstrap/cache
做完这些后,重启一下Web服务器(systemctl restart apache2或systemctl restart nginx),再访问你的Laravel应用,应该就能解决权限拒绝的问题了。
内容的提问来源于stack exchange,提问作者Dian.Y

