如何更新网站而不使其崩溃


How to update a website without making it go down?

我需要一个最佳实践来更新我的网站上的一个或多个文件而不会使它崩溃;

的例子,如果我更新Model.php文件,上传将需要几秒钟,就像它在服务器上替换文件之前的一两秒钟,在此期间,网站会显示一些错误,没有找到Model.php,或者不完整,即使我抑制错误,网站最终会死亡。

这方面的最佳实践是什么?

我在实践中经常使用和看到的一种做法是-

  • 使用版本控制系统(VCS),如SVN或Git

  • 在实时服务器上,使网站的web根目录成为一个符号链接,该链接指向包含网站最新版本的目录(例如。/www/domain.com/r555)为修订编号。555

  • 当出现更改时,检查VCS的更改

  • 有一个脚本,将最新版本签出到一个新目录,携带版本名称(例如,/www/domain.com/r556)

  • 签出完成后,更改符号链接,使其指向/www/domain.com/r556

如果你有像文件上传这样的动态数据,你不能在VCS中有一些障碍,但它们都可以在不停机的情况下处理。

像数据库更改这样的事情可能仍然需要某种维护模式。

当您更新产品时,创建一个名为1.1的文件夹并将新应用程序放入其中(无论是手动还是通过一些VCS),然后将公共html目录与它进行符号链接。开关将是即时的。

这不是一个不常见的方法,因为它的一个好处是,如果代码有问题,管理员可以立即符号链接回1.0文件夹。

另一件好事是将VCS标签命名为与文件夹相同,这样可以很容易地跟踪使用的版本。

使用缓存服务器/应用程序为用户保留可用的缓存副本。清漆就是一个例子。您可以将Varnish设置为缓存内容一段时间,并在实际网站的服务器不可访问(Model.php not found错误和类似)的情况下选择一段时间。

在这种情况下,如果你更新你的生产系统,Varnish可以继续提供网站的缓存副本,直到后端启动并再次正常运行(可能是2秒或2小时)。只要记住在更新后清除Varnish缓存,以防用户的某些东西(UI,内容等)发生变化。

所有的web服务器都有一些可用的缓存功能,但是Varnish等是缓存而设计的。

另一个选择是在HAProxy等负载平衡器后面运行同一个网站的两个或多个实例。每次更新一个,HAProxy可以将流量重定向到您当前没有更新的那个。

如果您需要更多关于服务器级缓存或负载平衡的信息,请转到Server Fault。