2011-12-16 197 views
6

我们如何做的事情现在寻找部署PHP代码

我们有一个文件服务器(使用NFS)多个Web服务器安装和使用这些坐骑作为Web根目录的安全方式。当我们部署我们的代码库时,我们将SCP档案(tar.gz)发送到NFS服务器,并直接在文件服务器的“网络目录”中解压缩数据。

问题

在部署过程中,我们已经看到了一些I/O错误,大多是当一个请求的文件无法读取:Smarty error: unable to read resource: "header.tpl"这些错误似乎消失部署完成后,让我们假设这是因为将数据直接解压到Web目录并不是最安全的事情。我猜我们需要一些原子。

我的问题

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

编辑

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

+1

重命名为原子(MV),也可能它的最好使用软链接而实际的网络目录只是一个链接到/storage/www.revision.3282378例如 – jackdoe 2011-12-16 19:18:15

回答

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出口。重要的部分是变化是符号链接的原子应用。

0

为什么你不只是有两个不同版本的网站2个目录。因此,当您在site_2中完成部署时,您只需在您的web服务器配置(例如apache)中切换站点目录并将所有文件复制到site_1目录。然后,您可以使用相同的方法在site_1目录中进行部署,并从site_2进行切换。

+0

我想这里提到的东西是最快的方法。复制你的新东西到一个临时文件夹,然后重命名原来的和新的/临时文件夹(这将不需要太多时间)。 – djot 2011-12-16 19:10:17

+0

查看我的编辑 - 我们还有其他必须保留的文件(营销网站)和大量(> 40GB的用户生成的内容),我不想一直复制它... – mmattax 2011-12-17 02:56:50

0

rsync的诞生跑......呃...... 我的意思做的这事

rsync的作品在本地文件系统和ssh - 这是非常强大和快速 - 仅发送/复印更改文件。

它可以配置为删除任何已删除的文件(或者只是简单地从源文件中缺少),或者可以配置为使它们保持独立。您可以设置排除列表,以便在同步时排除某些文件/目录。

这是link to a tutorial

回复:原子 - link to another question on SO

+0

它的价值,我在多个网站上使用它可以在过去的2年内部署代码而不会出现任何错误(我记录和发送电子邮件错误) - 没有丢失文件通知/错误 - 只需简单的单一命令和命令行脚本部署即可。 – 2011-12-16 19:33:56

0

我喜欢NFS想法。我们将代码部署到我们前端的NFS服务器上。事实上,我们在发布新版本时运行一个shell脚本。我们做什么用的符号链接电流的最后一个版本目录,像这样的:

/fasmounts/website/current -> /fasmounts/website/releases/2013120301/ 

和Apache文档根目录为:

/fasmounts/website/current/public 

(其实Apache的文档根目录为/ var/WWW这是一个符号链接到/ fasmounts /网站/当前/公共)

shell脚本更新当前符号链接到新版本后,一切都已正确上传。

1

我认为rsync是一个更好的选择,而不是scp,只有被更改的文件会被同步。但是通过脚本部署代码对于团队中的发布来说并不方便,并且部署中的错误不是人性化的。

你可以考虑Capistrano,Magallanes,Deployer,但它们也是脚本。我可能会建议你试一试walle-web,这是一个使用yii2开箱即用PHP编写的部署工具。我已经在我们公司托管了好几个月,它在部署测试,模拟和生产环境的同时运行顺利。

这取决于bash的工具,rsync的,git的,链路组,但Web UI的普遍好评操作,试试:)