如何组织一个web应用部署到多个服务器上


How to organize a web app deployment onto multiple servers at once?

假设我开发了一个PHP应用程序,我在一个与生产环境相同的游标箱中开发。所以-作为最终结果,我将有一个*.tar.zip文件的代码…

如何将部署组织到有许多应用程序服务器的生产环境中?我的意思是-我很困惑如何将代码同步地推送到生产环境中?

更多信息:

在服务器上的存储方式如下:

project
  +current_revision ->link to revisions/v[n]
  +revisions
    +v1
    +v2
    +v3
    ...
  +data

所以当我必须部署更改时,我通常运行一个部署脚本,通过ssh将更新的tar上传到服务器,untar到特定的目录下的修订,符号链接到current_revision并重新启动php-fpm....这样我就可以通过符号链接到旧版本随时回滚。

与多个服务器,什么困扰我是,不是所有的盒子将被更新一次,即。技术上可能会出现一些故障。

如果您正在寻找一个"ready-to-go"的答案,您需要提供一些关于您的设置的更多信息。例如,如果您计划在VCS中使用git,您可以编写一个简单的shell脚本,将最新的提交和rsync与服务器一起提取。或者,如果你是在Symfony之上构建,capifony是一个很好的工具。如果你使用AWS,有一个由Vagrant的作者编写的provider插件,它非常容易使用,你可以指定一个正则表达式,为哪些机器带来upprovision

如果你正在寻找更多的"路线图",那么你需要考虑的是:

  1. 尽可能容易地在远程和本地环境中构建相同的盒子,并尝试确保您的配置强调幂等性。
  2. 考虑你的版本/发布结构;哪些资源很少或永远不会改变?将它们包含在setup函数中而不是deploy函数中,并且不要将它们包含在同步运行中。
  3. 将您的开发和系统管理关注点分开;也就是说,不要只是用*.tar.gz包一个流浪汉盒子,然后通过config.vm.box_url捆绑它。这样做的原因是,每次部署时都必须用一个新机器重新打包每个生产服务器,而不仅仅是更改服务器上的文件,或者从服务器上添加/删除一些包。
  4. 检查一些配置管理工具,如Chef和Puppet;即使你最终不使用它们,它们也会让你了解系统管理专业人员如何处理这个问题。

方法很多。如果从裸机(没有云基础设施)开始,我是SVN分支钩子的粉丝。为你的代码建立一个SVN仓库。在它上面设置一个post-commit钩子,它会检查/branch/production/中是否有任何更改。

如果有,让提交后钩子触发所有的自动转出过程——在这种情况下,一个简单的方法是让所有服务器都知道svn export分支。就这么简单!

(*这是困难的一步)