nic*_*coX 30 httpd centos magento
在实时(电子商务)站点上部署新代码的最佳做法是什么?
现在重命名目录时,我已经停止阿帕奇+/-10秒public_html_new
到public_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 包或配置更改管理(厨师、木偶等)基础设施。
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.new
为public_html
以原子方式切换。请注意,mv
执行该重命名“太聪明了”,但可以使用os.rename
from 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
配置。
Gio*_*ldo 11
Symlinks 和 mv 是你的朋友,但是,如果你真的需要避免最终用户在部署新版本时收到错误页面,你应该在至少 2 个后端服务器(apache在你的情况下)。
在部署期间,您只需要一次停止一个后端,部署新代码,重新启动它,然后在其余后端上迭代。
最终用户将始终被代理引导到良好的后端。
小智 9
如果您在生产系统上定期应用更改,我会处理结构化的生命周期。一个好的做法是 Capistrano http://capistranorb.com/。这是一种开源解决方案,用于在多个平台和配置的一台或多台服务器上部署软件。
对于 Magento,甚至还有一个插件:https : //github.com/augustash/capistrano-ash/wiki/Magento-Example
对于单服务器和几乎无缝的转换,我建议使用符号链接。