作为部署过程的一部分,我将在 /var/www/projectx 的所有内容中运行 chown -R www-data:www-data。这花费的时间太长了,所以我想避免破坏权限,而不是定期修复权限。
我认为它们出现故障的原因之一是我们在服务器上运行了与 Rails 相关的命令,例如:
rvm 1.9.3@projectx && RAILS_ENV=production rake regenerate_thumbnails
rvm 1.9.3@projectx && RAILS_ENV=production bundle exec rails console
并且这些命令期间生成的所有文件最终都归运行它的用户所有,而不是 www-data。
这个问题的正确解决方案是什么?我曾想过以 www-data 的身份使用 sudo 来运行命令,但 rvm 需要 bash,而 www-data 目前使用的是没有配置文件的普通 sh,因此要使其正常工作,我需要改进 www-data 的 shell 环境。这是可行的方法吗?我应该注意什么副作用吗?
答案1
这取决于您用来运行 Rails 的用户。根据最佳安全做法,此用户应与 www-data(基于 Debian 的系统用于 apache/nginx 拥有的文件的用户)不同。www-data 应仅拥有您在静态目录中导出的内容。
也就是说,如果您生成的文件是静态的(例如缩略图)并且您从 /etc/profile.d/rvm.sh 获取 rvm,则可以尝试运行以下命令:
sudo -u www-data bash -l -c 'rvm 1.9.3@projectx && RAILS_ENV=production rake regenerate_thumbnails'
这将以 www-data 的形式运行命令,立即启动登录 bash shell(这意味着 /etc/profile.d/rvm.sh 被加载),然后使用您指定的 gemset 和命令运行 rvm。
请记住将您的代码托管在 Web 服务器的文档根目录之外!