【问题标题】:Deploying a GitHub update to Azure hosted DocPad Node.js website takes the site offline for 1-2 minutes将 GitHub 更新部署到 Azure 托管的 DocPad Node.js 网站会使该网站脱机 1-2 分钟
【发布时间】:2014-05-13 20:54:48
【问题描述】:

我正在测试 DocPad/Node.js 站点的 GitHub 部署。

我的部署工作正常,但是当向 GitHub 进行新推送时,公共网站站点在部署过程中会在 1 到 2 分钟内不可用。

这在我看来是不对的。

我会认为 DocPad 静态 HTML 文件将由 node.js 生成,然后复制到 wwwroot 文件夹——从而最大限度地减少任何类型的停机时间。

然而,情况似乎并非如此。

在部署网站时,网站的访问者会收到以下错误消息:

由于发生内部服务器错误,页面无法显示。

DocPad/Node.js 部署的副本可以在https://github.com/Richard-West/DocPadAzureDemo找到

我会很感激任何关于为什么会发生这种情况的见解,如果有什么我可以修改以防止这种情况发生。我希望能够随时向网站推送更新,同时不影响任何访问者。

【问题讨论】:

    标签: node.js azure github azure-web-app-service docpad


    【解决方案1】:

    有两种选择:

    1. 您可以自定义部署过程,在将静态 html 文件部署到 wwwroot 之前生成静态 html 文件,以了解有关如何: http://www.amitapple.com/post/38418009331/azurewebsitecustomdeploymentpart2/ http://www.amitapple.com/post/38419111245/azurewebsitecustomdeploymentpart3/

    2. 您可以使用“槽”功能首先部署到暂存站点,一旦暂存站点完全部署并准备好在生产站点和暂存站点之间交换请求,访问者就不会受到影响。 更多关于它: http://azure.microsoft.com/en-us/documentation/articles/web-sites-staged-publishing/

    【讨论】:

    • 谢谢阿米特。我在网站上有一个自定义的 deploy.cmd。我什至玩过翻转 KuduSync 命令,直到 DocPad 创建静态 HTML 文件之后——但是在此期间站点仍然“关闭”。你能解释一下 Kudu 同步过程是如何工作的吗?这个命令首先在部署部分运行,然后执行 DocPad node.js 命令,这似乎很奇怪——但是所有这些最终都出现在实时站点上。我想我只是想了解这个脚本中到底发生了什么。任何帮助将不胜感激。
    • 如果我理解正确,您首先构建 (npm install) 然后同步?无论如何,kudu 同步会将文件从源复制到目标,但只有那些已更新(或添加)的文件才会从目标中删除(如果它们不再存在于源中)。
    • 所以我在 GitHub 上发布了一个要点,其中包含我的 deploy.cmd 中的 Deployment 部分——gist.github.com/Richard-West/2fa5a8728ee4a52da674
    • 最初 KuduScript 部分是该部分中的第一个部分——但最终结果是相同的——更新站点被复制到 wwwroot——但是在这两种情况下,站点都处于离线状态 1 到 2分钟。
    • 在要点上添加了注释,基本上npm install应该在源或一些临时目录而不是目标上完成。
    【解决方案2】:

    非常感谢 Amit Apple 在这方面提供的帮助。

    Amit 在我发布的 Gist 的 cmets 中发布了一些非常有用的信息,因此我想在此处发布最终解决方案,以防其他人遇到此问题。

    问题出在 deploy.cmd 文件中的部署部分。这是发布新站点时由 Azure 执行的文件。我最初的部署部分是在 %DEPLOYMENT_TARGET% 文件夹中安装 NPM 包,但是这应该发生在 %DEPLOYMENT_SOURCE% 中——因为这是 DocPad 将首先执行并生成静态站点的地方。

    站点完全生成后,KuduSync 将新版本复制到 %DEPLOYMENT_TARGET% 文件夹中的 wwwroot 中,并且站点处于活动状态。

    部署部分的副本如下。还值得注意的是,在第 3 部分中,在构建 DocPad 站点之前,我将从之前的构建中删除“out”文件夹中的所有文件。这是通过“rd /s /q out”完成的。这可确保以前创建但不再在站点中的页面或文件不会复制到生产站点。

    :: Deployment
    :: ----------
    
    :Deployment
    echo Handling DocPad deployment.
    
    :: 1. Select node version
    call :SelectNodeVersion
    
    :: 2. Install npm packages
    echo Installing npm packages...
    pushd "%DEPLOYMENT_SOURCE%"
    call !NPM_CMD! install --production
    IF !ERRORLEVEL! NEQ 0 goto error
    popd
    
    :: 3. Build DocPad site
    echo Building DocPad site...
    echo Deployment Source Folder: %DEPLOYMENT_SOURCE%
    echo Deployment Target Folder: %DEPLOYMENT_TARGET%
    pushd "%DEPLOYMENT_SOURCE%"
    rd /s /q out
    IF !ERRORLEVEL! NEQ 0 goto error
    "!NODE_EXE!" .\node_modules\docpad\bin\docpad -e static generate
    IF !ERRORLEVEL! NEQ 0 goto error
    popd
    
    :: 4. KuduSync
    echo Copying Files...
    call %KUDU_SYNC_CMD% -v 500 -f "%DEPLOYMENT_SOURCE%\out" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%"
    IF !ERRORLEVEL! NEQ 0 goto error
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多