为apache httpd服务器上的站点寻找一个好的用户/组configuration

我们有一个设置,让不同的人在他们的本地机器上开发,稍后将更改提交到本地服务器存储库。

为了将更改同步到我们的外部生产服务器,我们运行一个脚本,rsyncs一个本地的subversion导出到它。

我们在执行此同步时遇到问题,因为为了工作,在远程服务器上进行同步的用户需要是远程文件的所有者。

我们的解决scheme是

在远程服务器上创build一个用户(siteowner)为他提供站点的所有权(chown siteowner.siteowner / var / www / site)添加Apache到站点组的所有者(我们在htaccess检查时遇到了一些问题, t chown siteowner.apache,因为当rsync进行同步时,它将权限更改为siteowner.siteowner)

我的问题是…这个设置似乎是合理的? 你知道还有其他更好的吗? 提前致谢!

我们使用以下工作stream程来开发基于PHP的网站。

用户将他们的工作交给Subversion。 我们不允许开发人员将代码手动部署到分段和实时。 为什么不分期? 因为我们希望它能够模拟Live。 部署是通过Webistrano完成的, Webistrano是知名且function强大的Capistrano部署工具的Web前端。 我们已经创build了脚本部署的所谓的食谱。 它大致如下:

  • Webistrano以用户'deploy'的身份通过sshlogin到服务器,
  • 它更新远程工作副本caching
  • 它将生成的工作副本复制到发布/ /文件夹,使用硬链接(以节省磁盘空间和速度)。
  • 将客户数据(即,不存储在颠覆版中的文件)符号链接到正确的位置。
  • 新版本被chmodded为775给组写权限。
  • 如果上述所有步骤成功,则将“当前”符号链接更改为/ releases //文件夹。
  • 它执行“apache2ctl优雅”来刷新仍然caching以前版本的任何caching(例如php的realpath())。
  • 如果存储超过一定数量的版本,则最旧的版本被清除。

Web服务器configuration为使虚拟主机的docroot指向“当前”符号链接,因此在部署过程中可以看到旧站点,并且在成功部署之后,新站点即刻显示。

代码由deploy部署:部署,但客户数据目录由deploy:upload拥有, 在创build时设置其SGID位。

Apache的www-data用户是组“部署”和“上传”的成员。 开发人员在服务器上拥有个人scp帐户,并且是“上传”组的成员。 这个设置非常适合我们,因为除了通过Webistrano之外,开发人员不能与代码交互。 它可以防止除了pipe理员之外的“live quickfixes”,极大地减less了事故的发生。 Webistrano的内置回滚function可以快速恢复错误的部署。

开发人员可以通过写入访问客户数据目录(因为上传组),所以他们可以上传占位符内容或帮助客户预先填写网站。 毕竟,没有客户内容存储在svn。 目录上的SGID位确保只有上传文件的用户所有权被设置给正在上传的用户(提供一些责任)。 组的所有权仍然由SGID“上传”,以便Apache或其他开发者仍然可以读写创build的文件和目录。

清晰的Webistrano界面已经被certificate非常有用,而且由于Capistrano具有内置的大部分上述function,我们的部署配方只有二十几行。 大部分是重写Ruby-on-Rails特定的默认值。

你可以这样重新考虑工作stream程:

  • 每个人都可以提交到SVN服务器,而不是使用Apache权限,在生产服务器上创build一个用户并添加一个SFTP服务器。

  • 每个人都在处理他们的文件,当提交到SVN服务器完成时,他们使用他们的SFTP客户端来投入生产他们的文件(因为他们都使用相同的用户,所以不用担心维护)

实际上,在投入生产之前,你应该有一个额外的服务器来进行预生产。
在每次提交到生产服务器之前,他们都会将文件添加到预生产服务器,该服务器必须是生产服务器的完全复制。
当更改被validation时,他们可以投入生产文件。