Laravel Forge/Envoyer权限异常:PHP7.1升级后文件删除与部署故障
解决Forge+Envoyer部署Laravel(PHP7.1)的权限问题
我之前在类似的环境下升级PHP后也碰到过一模一样的权限坑,给你一套彻底解决的方案,不用再每次手动敲chmod救急了:
首先看你的进程信息:php-fpm是以www-data用户运行的,nginx worker是forge用户,部署也是用forge用户——这就是问题根源:两个用户的权限不互通,PHP生成的文件forge操作不了,forge部署的文件PHP可能也没权限,而且新文件不会自动继承正确权限。
1. 让两个用户共享权限组
把www-data加入forge用户组,这样双方都能访问对方生成的文件:
sudo usermod -aG forge www-data
2. 修复现有目录权限+设置自动继承的ACL规则
这一步是核心,既要搞定现有文件,还要确保新生成的文件自动拥有正确权限:
先修复现有文件的所有者和基础权限
# 把项目目录的所有者设为forge用户和组 sudo chown -R forge:forge /home/forge/你的项目路径 # 目录设为775(组内用户有读写执行权限) sudo find /home/forge/你的项目路径 -type d -exec chmod 775 {} \; # 文件设为664(组内用户有读写权限) sudo find /home/forge/你的项目路径 -type f -exec chmod 664 {} \;
设置ACL规则,让新文件自动继承权限
ACL能让目录下新创建的文件/目录自动继承指定的权限,完美解决新上传文件删不了的问题:
# 给bootstrap/cache设置ACL sudo setfacl -R -d -m u:www-data:rwX -m u:forge:rwX /home/forge/你的项目路径/bootstrap/cache sudo setfacl -R -m u:www-data:rwX -m u:forge:rwX /home/forge/你的项目路径/bootstrap/cache # 给storage目录设置ACL sudo setfacl -R -d -m u:www-data:rwX -m u:forge:rwX /home/forge/你的项目路径/storage sudo setfacl -R -m u:www-data:rwX -m u:forge:rwX /home/forge/你的项目路径/storage
解释下参数:-d是默认规则(新文件/目录自动继承),rwX是读、写,以及目录的执行权限(大写X只会给目录加执行,文件不会乱加)。
3. 修改Envoyer部署钩子,避免部署后权限重置
Envoyer每次部署都会拉取新代码,可能会重置权限,所以要在部署流程里加个钩子自动修复:
在Envoyer的「Deployment Hooks」里,添加一个钩子(建议放在「Activate New Release」之后),执行以下命令:
chown -R forge:forge {{ release }} find {{ release }} -type d -exec chmod 775 {} \; find {{ release }} -type f -exec chmod 664 {} \; setfacl -R -d -m u:www-data:rwX -m u:forge:rwX {{ release }}/bootstrap/cache {{ release }}/storage setfacl -R -m u:www-data:rwX -m u:forge:rwX {{ release }}/bootstrap/cache {{ release }}/storage
这样每次部署后,新的release目录都会自动设置好正确的权限和ACL,再也不会出现部署后网站崩溃的情况。
4. 验证效果
现在上传一个新文件到storage目录,尝试删除它——应该不用再手动敲chmod 777了。再部署一次代码,看看bootstrap/cache的权限是否正常,网站也不会崩溃。
为什么之前的临时方案没用?
777是给所有用户全开权限,非常不安全,而且PHP生成的文件默认是www-data所有,下次生成新文件时权限还是默认的644,forge用户没写权限,所以又删不了。775只解决了现有文件的组权限,但新文件不会自动继承这个组权限,所以治标不治本。
内容的提问来源于stack exchange,提问作者Juan Rangel
相关产品推荐
相关产品推荐

