我们现在的工作方式
我们有一个文件服务器(使用NFS),多个Web服务器挂载并使用这些挂载作为Web根目录。当我们部署代码库时,我们将SCP存档(tar.gz)发送到NFS服务器,并直接在文件服务器的“web目录”中取消归档数据。
问题
在部署过程中,我们看到一些i / o错误,主要是在无法读取请求的文件时:Smarty error: unable to read resource: "header.tpl"
这些错误似乎在部署完成后消失,因此我们假设这是因为取消归档直接到web目录的数据并不是最安全的。我猜我们需要一些原子。
我的问题
我们如何将新文件原子地复制到现有目录(Web服务器的根目录)?
修改
我们不妥协到web目录中的文件不是目录中的唯一文件。我们正在将文件添加到已有文件的目录中。因此,复制目录或使用符号链接不是一种选择(我知道)。
答案 0 :(得分:1)
这就是我的所作所为。
DocumentRoot例如是/var/www/sites/www.example.com/public_html /:
cd /var/www/sites/www.example.com/
svn export http://svn/path/to/tags/1.2.3 1.2.3
ln -snf 1.2.3 public_html
您可以在更改符号链接之前轻松修改此扩展名.tar.gz,而不是从svn导出。重要的是,更改是符号链接的原子应用程序。
答案 1 :(得分:1)
我认为rsync
是一个更好的选择,而不是scp
,只会更改已更改的文件。但是,按脚本部署代码对于团队中的开发来说并不方便,并且部署中的错误不是人性化的。
你可以考虑Capistrano,Magallanes,Deployer,但它们也是剧本。我可能会建议您尝试walle-web,这是一个用PHP编写的部署工具,yii2开箱即用。我已经在我们公司托管了几个月,它在部署测试,模拟,生产环境的同时运行顺畅。
它依赖于bash工具组,rsync,git,link,但是一个web ui通常很适合操作,请试试:))
答案 2 :(得分:0)
为什么不拥有2个不同版本的网站的2个目录。因此,当您在site_2中完成部署时,您只需在Web服务器配置中切换站点目录(例如apache)并将所有文件复制到site_1目录。然后,您可以使用相同的方法在site_1目录中部署并从site_2切换到它。
答案 3 :(得分:0)
RSync诞生了......呃... 我的意思是做这件事
RSync适用于本地文件系统和ssh - 它非常健壮且快速 - 仅发送/复制已更改的文件。
它可以配置为删除任何已删除的文件(或者只是从源中丢失),或者可以将其配置为不管它们。您可以设置排除列表以在同步时排除某些文件/目录。
Re:atomic - link to another question on SO
答案 4 :(得分:0)
我喜欢NFS的想法。我们将代码部署到我们前端的mout NFS服务器上。实际上,当我们想要发布新版本时,我们会运行一个shell脚本。我们所做的是使用符号链接当前到最后一个版本dir,如下所示:
/fasmounts/website/current -> /fasmounts/website/releases/2013120301/
apache文件根目录是:
/fasmounts/website/current/public
(实际上apache文件root是/ var / www,它是/ fasmounts / website / current / public的符号链接)
在所有内容都正确上传后,shell脚本会将当前符号链接更新为新版本。