实时部署新代码

nic*_*coX 30 httpd centos magento

在实时(电子商务)站点上部署新代码的最佳做法是什么?

现在重命名目录时,我已经停止阿帕奇+/-10秒public_html_newpublic_html老来public_html_old。在我再次启动 Apache 之前,这会造成短暂的停机时间。

如果使用 Git 将新的 repo 拉到 live 目录,也会出现同样的问题。我可以在站点处于活动状态时拉出 repo 吗?如果我还需要复制数据库呢?

在对实时站点进行 tar(备份目的)压缩期间,我注意到媒体目录中发生了变化。这向我表明文件会定期更改。如果 Apache 在部署期间没有停止,这些更改是否会干扰。

小智 32

最快最简单的是使用版本目录,例如

/var/www/version/01
/var/www/version/02
Run Code Online (Sandbox Code Playgroud)

并使用当前的符号链接作为您的 html_root :

/var/www/html -> /var/www/version/02
Run Code Online (Sandbox Code Playgroud)

这种技术完美地集成到修订控制系统(svn、git、mercurial 等)中,因为您可以检查分支和标签、更改符号链接并重新加载 Apache。使用此技术可将停机时间降至最低,并且可以非常轻松地回滚

它还可以与更复杂的部署系统很好地集成,例如 RPM 包或配置更改管理(厨师、木偶等)基础设施。

  • 最简单的解决方案总是最好的... :-) 当然不要忘记提到,可能需要一些 FollowSymlinks 和配置中的此类 apache 标志。 (4认同)

kas*_*erd 14

在不关闭 Apache 的情况下重命名目录也应该有效。这将显着缩短窗口。mv public_html public_html_old && mv public_html_new public_html应该在几分之一秒内完成。

有几个缺点是,这种方法会给404在窗口期间仍然设法发生的任何请求提供一个。而且,如果您在没有public_html_new目录的情况下运行上述命令,它将失败并为您留下404每个请求的站点。

不支持对目录进行原子操作。但是你可以用符号链接来做到这一点。不是有一个名为 的目录public_html,而是有一个名为的目录public_html.version-number和一个public_html指向该目录的符号链接。现在您可以创建一个名为的目录public_html.new-version-number和一个名为public_html.new.

然后您可以重命名public_html.newpublic_html以原子方式切换。请注意,mv执行该重命名“太聪明了”,但可以使用os.renamefrom python 或其他任何调用rename系统调用的方法来完成,而无需尝试变得聪明。

如何处理数据库取决于您使用的数据库以及您使用它的目的。您需要提供有关数据库的更多详细信息,然后我们才能为您的那部分问题提供一个很好的答案。


Gar*_*het 13

使用负载均衡器是个好主意。如果站点重要到需要担心几秒钟的停机时间,那么担心容错也很重要。

除此之外,如果这是在 UNIX 系统上,您可以在重命名(或符号链接更新等)期间暂停 Apache:

killall -STOP httpd  # Pause all httpd processes
mv public_html public_html_orig
mv public_html_new public_html
killall -CONT httpd  # Resume all httpd processes
Run Code Online (Sandbox Code Playgroud)

这将阻止 Apache 在重命名期间接受新请求。如果您更喜欢符号链接或其他一些方法,可以使用相同的想法:

killall -STOP httpd  # Pause all httpd processes
rm /var/www/html
ln -s /var/www/version/03 /var/www/html
killall -CONT httpd  # Resume all httpd processes
Run Code Online (Sandbox Code Playgroud)

请注意,任何挂起的连接或数据包都将在操作系统中排队。对于非常繁忙的站点,如果适合您的 httpd 工作器类型,请考虑调整 ListenBacklog,并检查与 TCP 侦听积压相关的操作系统设置。

您还可以更改 httpd.conf 中的 DocumentRoot 并进行正常重启 ( apachectl graceful)。这里的缺点是增加了错误的风险,因为您还必须更新任何Directory配置。

  • 换句话说,当 Apache 暂停时站点将没有响应,但是当它恢复时挂起的操作将完成。用户不会得到“连接被拒绝”,下载也不会中断,但只有在 Apache 恢复后才能继续操作。这将确保现有事务可以完成,但只有在您的新内容移动到位后才会处理新请求。 (5认同)
  • 它停止为 Apache 提供 CPU 时间。如果您在 Apache 暂停时尝试在浏览器中访问该站点,则浏览器将等待连接,直到 Apache 恢复(或浏览器超时,如果 Apache 暂停时间超过超时时间)。如果有人正在下载文件,Apache 将在暂停时停止发送数据,同样是因为它没有获得任何 CPU 时间。同样,如果 Apache 停止的时间太长以至于传输超时,这只会导致问题。 (4认同)

Gio*_*ldo 11

Symlinks 和 mv 是你的朋友,但是,如果你真的需要避免最终用户在部署新版本时收到错误页面,你应该在至少 2 个后端服务器(apache在你的情况下)。

在部署期间,您只需要一次停止一个后端,部署新代码,重新启动它,然后在其余后端上迭代。

最终用户将始终被代理引导到良好的后端。

  • 当我看到你已经发布了它时,我正在研究这个答案。Balancer + 2 个服务器使这个过程不可见,并且更容易从错误的升级中恢复...... (4认同)

小智 9

如果您在生产系统上定期应用更改,我会处理结构化的生命周期。一个好的做法是 Capistrano http://capistranorb.com/。这是一种开源解决方案,用于在多个平台和配置的一台或多台服务器上部署软件。

对于 Magento,甚至还有一个插件:https : //github.com/augustash/capistrano-ash/wiki/Magento-Example

对于单服务器和几乎无缝的转换,我建议使用符号链接。