问题
Capistrano 使用用户通过 SSH 部署 Web 应用程序deploy
。Apache/PHP 在典型www-data
用户下运行。
Web 服务器在运行时在应用路径内创建缓存文件和文件夹。示例:
-rw-r--r-- 1 www-data www-data 71758 Apr 29 14:33 /var/www/site.com/releases/20140429183204/cache/twig/9e/dd/fd353a4ff2520b59144be49f4a6e.php
Capistranodeploy:cleanup
尝试删除包含这些缓存文件的旧版本,但由于用户deploy
对缓存文件没有写权限而失败。
报告错误:
cannot remove `/var/www/site.com/releases/20140429183204/cache/twig/9e/dd/fd353a4ff2520b59144be49f4a6e.php' : Permission denied
常用解决方案,ACL
我通常的解决方案是在组deploy
中设置,并在组中设置 ACL,以便新文件/文件夹始终获得组写权限。www-data
www-data
deploy
我当前的服务器文件系统不支持 acl...
尝试解决方案,粘滞位
我尝试对整个应用程序文件夹设置粘性位。这是在两个用户都在对方组中时尝试的。
chmod -R g+rwsx /var/www/site.com
这对于新文件很有效,但粘性位不会传播到新文件夹(这是我的问题)
总结
如何设置权限,以便 Capistrano(通过用户的 SSH deploy
)删除由 Apache 使用用户创建的文件和文件夹www-data
。
答案1
到目前为止最好的解决方案是使用 PHPumask每个脚本开头的函数。
# Make sure all files written are writable by group.
# Also execute bit so directory's content is listable
umask(0002);
这确保创建的所有文件和文件夹在正常情况下具有组写权限和执行位,因此内容是可列出的。
然而,这可能会导致图书馆忽略umask并手动应用权限。