寻找一种安全的方式来部署PHP代码

时间:2011-12-16 19:03:48

标签: php linux deployment

我们现在的工作方式

我们有一个文件服务器(使用NFS),多个Web服务器挂载并使用这些挂载作为Web根目录。当我们部署代码库时,我们将SCP存档(tar.gz)发送到NFS服务器,并直接在文件服务器的“web目录”中取消归档数据。

问题

在部署过程中,我们看到一些i / o错误,主要是在无法读取请求的文件时:Smarty error: unable to read resource: "header.tpl"这些错误似乎在部署完成后消失,因此我们假设这是因为取消归档直接到web目录的数据并不是最安全的。我猜我们需要一些原子。

我的问题

我们如何将新文件原子地复制到现有目录(Web服务器的根目录)?

修改

我们不妥协到web目录中的文件不是目录中的唯一文件。我们正在将文件添加到已有文件的目录中。因此,复制目录或使用符号链接不是一种选择(我知道)。

5 个答案:

答案 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 - 它非常健壮且快速 - 仅发送/复制已更改的文件。

它可以配置为删除任何已删除的文件(或者只是从源中丢失),或者可以将其配置为不管它们。您可以设置排除列表以在同步时排除某些文件/目录。

这是link to a tutorial

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脚本会将当前符号链接更新为新版本。