我想以原子方式更新实时网站。如果我们对页面、图像和 javascript 进行了多项更改,所有更改都应该同时出现,不会出现停机、不一致或 404 错误。
如果我简单地将更改的文件复制到网站目录中,那么至少有几个请求会看到一个不一致的站点。如果我将新站点复制到一个单独的目录,然后重命名旧目录以使其停止生产并重命名新目录以使其生效,那么在一小段时间内我们将收到 404。
我真的有两个问题:
如何以原子方式更新文件目录?
我如何将其与 Git 协调?我们想使用 git pull(或可能是 push)进行部署。 git 存储库中的站点路径与服务器上的路径不同,因此需要使用 git 命令或操作系统命令进行一些移动/重命名。
最佳答案
您可以使用符号链接(symbolic link)做您想做的事。将一个符号链接(symbolic link)移动到另一个符号链接(symbolic link)是一种原子操作,因此您应该能够避免任何 404 错误。
你的钩子(Hook)会 deploy your site to a directory ,也许以 commit hash 命名.然后它会建立一个符号链接(symbolic link),也许称为暂存。然后它会将该符号链接(symbolic link)移动到生产符号链接(symbolic link)上。
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
参数是 --no-target-directory
的缩写形式,它是 GNU mv
的一部分并阻止它将源移动到目的地。阅读更多关于 target directories 的信息.
关于git - 使用 Git 进行原子网站更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14443472/