laravel项目使用sudo命令重启队列导致缓存目录所有者意外变root?
1、收到异常报错
在运行的laravel站点报缓存文件不存在,这个问题遇到很多次了, 照例打开目录 一看,ee目录包括下面文件夹所有者为root,权限755,fpm运行用户为www,肯定没权限, 修改为www,cache目录所有者一直都是www,这个root很扎眼
file_put_contents(/www/wwwroot/****.com/releases/5/storage/framework/cache/data/ee/25/ee2526425ad0ed8336ff7c3e201a525014a3b2d6): failed to open stream: No such file or directory
2 问题分析
- 没有用root执行定时任务,一直都是
crontab -u www -e
- 没有通过ssh执行php artisan命令,(虽然我一直都用root,但这次不是)
- 通过搜索得知这个缓存是队列在用的,问题出在队列上,队列使用supervisor守护,supervisor是root用户运行, 但是 artisan命令是www在跑的
- 同问题出现在多个通过deployer部署的站点上,而且发生在每次更新之后,因为每次更新都会执行
cache:clear
和queue:restart
, 我的代码if(get('need_restart_queue')) { run('sudo {{bin/php}} {{release_path}}/artisan cache:clear'); run('sudo {{bin/php}} {{release_path}}/artisan config:clear'); run('sudo {{bin/php}} {{release_path}}/artisan queue:restart'); } else { writeln('<info>不需要重启队列</info>'); }
3 发现问题
问题就是出现在run('sudo {{bin/php}} {{release_path}}/artisan queue:restart');
这个行上面,使用sudo
,缓存目录生成的文件所有者就是root
,不使用所有者为deployer
, 诡异的事是,deployer脚本使用deployer用户专用的sshkey登录执行各种命令,不应该导致这个问题,通过测试, 使用deployer用户在命令行执行,sudo php artisan queue:restart
也会导致缓存 ee目录所有者变为root
,ee目录需要删除让框架重新生成。4 问题简化
普通用户使用 sudo 执行 artisan 命令导致生成的缓存文件所有者变为 root ,请问有碰到这个问题的朋友么,怎么避免这个,现在临时解决方案是不使用sudo,但是问题出在哪,还不清楚,迫切需要找到根?5 附录
- 服务器环境 ubuntu 16.04
- 代码框架 laravel5.8
sudo -u www 还会有这种问题码?