将网站更新从开发/阶段/测试环境推向生产的最佳实践是什么?
现在,我有一台运行服务器的基本LAMP配置。生产服务器是slicehost。但是我想知道将代码/数据库实例推到阶段dev> stage> production的最佳方法是什么。它与我们创建阶段的方式有关吗?
我们如何在不关闭网站的情况下做到这一点?如果不进行负载平衡,是否有可能?
我知道这有点笼统,我只是想指出正确的方向。
解决方案
我将研究一种针对灯的自动化"构建"样式环境,在该环境中我们将具有打包并为每种环境准备发布的脚本。
我知道并没有PHP的实际构建,但是我们可以设置自动化来更改任何配置或者设置问题,并将所有内容保存到准备实施的文件夹中。
我不相信我们可以在没有负载平衡/ Web场样式环境的情况下完全消除停机时间。但是,在我的书中减少它的最简单方法是建立一致的代码准备过程并多次测试该过程。自动化将为我们提供帮助。
至于实际复制文件的行为,我只知道使用FTP之类的东西或者其他方便的方法。也许张贴一个加载消息。同样,所有这些都可以写成脚本。
最后,请记住,由于未构建PHP,因此它可能很适合我们跟踪现在存在的内容与已更改内容之间的差异,并且仅移动这些文件。有时,这可能会增加不必要的复杂性。
我使用.htaccess创建一个"维护模式",在更新时只有我的IP可以看到主站点。其他人都可以查看一条短消息,因此他们知道所有信息都应在几秒钟内恢复在线。
然后我:
- 进行任何数据库编辑
- SVN导出/上传文件
- 运行自动化测试,并尽可能快速地进行检查,以确保没有任何可怕的错误
- 还原.htaccess
这是给定的,但是在推送到实时服务器之前,我们应该在本地进行尽可能多的测试。有些人使用两个实时服务器(例如生产服务器上的一个隐式名称子域)充当实时更新的测试区域。这样可以减少主站点的实际停机时间。
我要强调一点很重要,不要在没有事先关闭的情况下将更新推送到实时服务器(尤其是如果我们使用Binaries ala ASPNET),因为在更新过程中尝试使用该站点的用户会收到可怕的错误消息,并且我们可能会被锁定文件。
我不知道这是否是个好主意,但是从源代码控制系统进行自动结帐又如何呢?也许有几个分支机构进行前沿开发测试,为维护/小改进进行开发,并为生产代码进行生产。只要开发稳定,就将其合并到生产分支中,并由生产机器定期对其进行自动检出。
至于将文件推送到所有Web服务器,我发现好的老式robocopy可以解决问题。我的开发/阶段/产品环境当然是完全相同的。只需建立一个临时页面,告诉用户该站点将立即返回。
现在,我们使用一系列带有配置文件的shell脚本,这些脚本可将更改后的文件打包,将它们打包到群集中的每个服务器上,然后在它们解压缩后解压缩。这种方法当然有其缺点,我们正在考虑一种方法,其中每个服务器成员都安装了svn客户端,并且一旦标记了新版本,就将生产服务器上的工作副本切换到该新标记。当然,我们在当今的维护时间内都会发布版本,因此我们不必为用户做任何特别的事情(无论如何,他们都会看到维护页面)。
我在核心配置中有一个选项,允许访问该网站或者我可以将所有用户重定向到的预设URL列表(并使用适当的http代码停止任何API通信)。
这些网址是指向静态html文件的链接,可向用户说明发生了什么情况。
启用此功能后,对数据库或者任何文件的请求都不会发生,因为所有请求都将发送到HTML文件,然后再发送给HTML文件,这为我提供了一个"清晰的"空间来部署任何更新。
负责svn和ftp任务的apache蚂蚁为我买单。甚至还有人使用ANT来做数据库工作,但是我倾向于亲自观察一下。一旦将ftp清理并推送到所有位置后,我们会惊讶于它的简易性。