16

我想以原子方式更新实时网站。如果我们对页面、图像和 javascript 进行了多项更改,则所有更改都应该同时出现,不会出现停机、不一致或 404 错误。

如果我只是将更改的文件复制到网站目录中,那么至少有几个请求会看到不一致的站点。如果我将新站点复制到一个单独的目录,然后重命名旧目录以使其退出生产并重命名新目录以使其生效,那么我们将在短时间内得到 404。

我真的有两个问题:

如何以原子方式更新文件目录?

我该如何与 Git 协调呢?我们想使用 git pull(或可能 push)进行部署。git repo 中的站点路径与服务器上的路径不同,因此需要使用 git 命令或 OS 命令进行一些移动/重命名。

4

2 回答 2

22

您可以使用符号链接做您想象的事情。将一个符号链接移到另一个符号链接上是一种原子操作,因此您应该能够避免任何 404 错误。

您的钩子会将您的站点部署到一个目录,该目录可能以提交哈希命名。然后它会为此建立一个符号链接,也许称为登台。然后它将该符号链接移动到生产符号链接上。

hash=`git rev-parse HEAD`
git checkout-index -a -f --prefix=/srv/www/$hash/
ln -s /srv/www/$hash /srv/www/staging
mv -T /srv/www/staging /srv/www/production

-T参数是 GNU 的缩写形式--no-target-directory,它是GNUmv的一部分,可防止其将源移动到目标。阅读有关目标目录的更多信息。

于 2013-01-21T17:14:43.627 回答
0

我对此并不完全确定,但是您可以为 git 创建 post push hook,它会创建新目录,或者复制现有目录,拉取或克隆您的项目并将链接从您的项目更改为新目录。您的项目目录只是链接到已部署的目录之一。

但我的方法听起来像是解决方法。

于 2013-01-21T16:58:55.300 回答