关于 Laravel 日志权限
有时候 laravel 会出现无权限写日志的问题,我们可以按以下步骤去检查:
- 运行 laravel 的 php-fpm 是什么用户,一般是 www/nobody,不要使用 root。
- laravel 项目中的 storage/logs 目录 www/nobody 用户是否有读写权限。
- 是否有运行 crontab/supervisor/laravel 脚本,切运行的用户是否是 www/nobody。注意!如果以其他身份(例如root)运行脚本,laravel 可能会创建当天的日志文件,那这个日志文件是属于其他用户的,www/nobody 用户无法写入。
解决办法
- 修改 php-fpm 的配置文件,修改 user 和 group 为 www/nobody。
- chmod a+w storage/logs
- 运行任何 laravel 的脚本需要注意运行的用户,supervisor可以设置用户,crontab 可以加在 www/nobody 用户下。手动运行脚本可以 su www/nobody。
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
高认可度评论:
日志权限的问题基本是出现在有使用 artisan 执行定时任务的情况下。查看日志文件的权限时发现,处理 Web 请求时的日志的用户为 nobody。
后来查了一下,使用 crontab 执行定时任务时,默认用户是 root,root 用户生成的文件,nobody 用户自然没有权限进行处理,出问题也就不奇怪了。又查了一下,使用 crontab 编辑定时任务列表的时候,是可以指定用户的,默认是编辑 root 用户的任务列表。
日志权限的问题基本是出现在有使用 artisan 执行定时任务的情况下。查看日志文件的权限时发现,处理 Web 请求时的日志的用户为 nobody。
后来查了一下,使用 crontab 执行定时任务时,默认用户是 root,root 用户生成的文件,nobody 用户自然没有权限进行处理,出问题也就不奇怪了。又查了一下,使用 crontab 编辑定时任务列表的时候,是可以指定用户的,默认是编辑 root 用户的任务列表。
@LOST 写的非常好啊~可以写篇文章了,我这个记的比较简陋,并没有详细说明原因。
Laravel 的文档中也推荐使用 supervisor 了,这个也有用户权限问题,我就懒得详细写啦
@allencao 我也是使用了 supervisor,添加定时任务指定了用户之后,就再也没有出现日志权限的问题了。另外,supervisor 在管理任务的时候,也是可以指定用户的。
@LOST 嗯嗯,是的
nice 感谢,最近就出现这种问题 , 用了crontab 执行计划任务, 默认root 创建了日志, 导致普通日志写不进去
@GitHacking 不用谢~我也是碰到问题,随手记录的,互相学习~
我是用Linux命令 umask 来改的默认文件权限
@DGZI 这种方法也很好
@LOST 我也是用的 supervisor,cron 配置是这样:
但是这样的 cron 配置不执行,这条任务放在 root 下面确是可以执行的,请问这是什么情况?
@Kevinvinvin
www
用户有 logs 目录下的写权限吗?@LOST 我找到问题了,看了一下日志,当使用
www
身份执行的时候报错了:但是我不知道这该怎么解决:joy:
@Kevinvinvin
我对
crontab
的实现不太了解,比较不解的是,处理任务的过程中,为什么会执行chdir
这个命令呢?你的任务代码中有这种操作吗?错误提示是说,
/home
目录下没有www
的用户目录,这种虚拟用户没有这个目录也正常,所以感觉这只是问题的表象,不是根本。你可以再查查,可能有其他原因。@LOST 这条错误日志是因为在
/etc/crontab
中加了一条任务:指定了一个
www
用户,然后就有了这个错@Kevinvinvin
这些内容,确定是必须的吗?
指定了
SHELL
,可能会产生切换目录的操作吧(我猜的),你尝试一下删掉这些配置,看看有没有效果,chdir
这个操作错误应该就能避免了吧。@LOST 我在
/home
目录下手动加了一个www
目录,现在cron
是可以正常执行了,并且生成的schedule.log
文件是www
的。但是supervisor
的执行结果不符合预期,配置文件是这样的:在
supervisor
重启的时候会生成root
的queue-worker.log
这个文件,队列里面写的日志laravel-2018-12-18.log
也是root
的:cold_sweat:你可以用
htop
命令查看每个进程的执行情况,看一下是哪个用户在执行该命令。这个配置项,是在重启
supervisor
时生成一个空的日志文件,并不是实际处理队列任务时创建的文件,所以文件所属root
并不奇怪。至于这一点,会不会是有其他
root
用户执行的进程也在写日志?在5.6里增加了一个permission权限配置,可以试试
这几天也碰到了这个问题,真的是很折腾.....
larave5.6.10 后支持通道中权限的声明 (permission)
使用这种办法也可以解决