【问题标题】:How do I gracefully take a web app offline during Octopus deployment?如何在 Octopus 部署期间优雅地使 Web 应用程序脱机?
【发布时间】:2013-11-30 23:16:54
【问题描述】:

我有点疏忽了,虽然 Octopus 很神奇,但在升级之前关闭你的网络应用程序并没有做任何可爱或聪明的事情。

在我们的解决方案中,我们有两个 Web 应用(一个网站和一个单独的 API Web 应用)依赖于同一个数据库,因此当一个正在升级时,另一个仍然存在,并且 Web 或 API 请求可能仍然存在正在升级数据库时提供服务。

不干净!

干净的做法是让 Octopus 关闭网络应用程序,等到它们关闭然后继续升级,完成后让应用程序池重新上线。

如何实现?

【问题讨论】:

标签: octopus-deploy


【解决方案1】:

更好的解决方案是使用网络负载平衡器,例如 f5 LTM。您可以设置多台服务器来接收站点的流量,然后,在部署时,您可以禁用 NLB 中的一个节点,以便所有其他流量都流向另一台机器。

我喜欢 f5,因为它非常适合编写脚本。当我们部署到我们的网站时,我们不会出现任何中断。网站的所有流量都指向当前未升级的服务器。

有一些注意事项:

您必须在 NLM 中编写禁用池成员的脚本,以便它适用于您的站点。如果您的站点需要会话(例如取决于会话状态或共享对象),那么您必须从 NLB 节点排出流量。在 f5 中,您可以禁用它们,然后观察连接计数变为零(也可编写脚本)。

您必须与您的开发人员/数据库管理员强制执行一项政策,该政策规定所有数据库更改不得导致现有代码降级或失败。这意味着您必须非常小心数据库和配置。这样,您甚至可以在开始部署到您网站的第一个池之前进行数据库更新。

【讨论】:

    【解决方案2】:

    停止 apppool 和/或设置 App_Offline 文件对我来说还不够。两者都没有向客户正确解释网站为何关闭。特别是 App_Offline。我需要清理 bin 文件夹,这会导致 YSOD (http://blog.kurtschindler.net/more-app_offline-htm-woes/)。

    我的解决方案: 第一个任务将部署的站点重定向到仅包含 index.html 和正确消息的不同文件夹。最后一个任务带回原来的文件夹。

    【讨论】:

      【解决方案3】:

      我们采用的方法是使用应用程序部署一个 _app_offline.htm (App Offline) 文件。这样我们就会收到一条很好的消息,解释网站关闭的原因。

      然后,当需要部署时,我们使用 Mircrosofts Webdeploy 将其重命名为 app_offline.htm。我们将重命名代码放在一个 powershell 脚本中,该脚本作为 Octopus 部署的第一步运行。

      write-host "Website: $WebSiteName"
      
      # Take Website Offline
      $path = "$WebDeployPath";
      $path
      
      $verb = "-verb:sync";
      $verb
      
      # Take root Website offline
      $src = "-source:contentPath=```"$WebSiteName/_app_offline.htm```"";
      $src
      
      $dest = "-dest:contentPath=```"$WebSiteName/app_offline.htm```"";
      $dest
      Invoke-Expression "&'$path' $verb $src $dest"; 
      
      
      # Take Sub Website 1 offline
      $src = "-source:contentPath=```"$WebSiteName/WebApp1/_app_offline.htm```"";
      $dest = "-dest:contentPath=```"$WebSiteName/WebApp1/app_offline.htm```"";
      Invoke-Expression "&'$path' $verb $src $dest"; 
      

      $WebSiteName 通常是“默认网站”。另请注意,` 不是单引号,而是反引号字符(通常与键盘上的 tilda 一起出现)。

      现在,如果 octopus 将您的网站部署到新位置,您的网站将自动重新上线。如果您不希望这样,您可以使用 app_offline 文件部署新网站。然后您可以使用以下脚本将其删除。

      write-host $WebSiteName
      
      # & "c:\Program Files (x86)\IIS\Microsoft Web Deploy V2\msdeploy.exe" -verb:delete -dest:contentPath="$WebSiteName/app_offline.htm"
      # those arn't QUOTES!!!!, they are the back accent thing.  
      
      write-host "Website: $WebSiteName"
      
      # Put Web app Online.
      $path = "$WebDeployPath";
      $path
      
      $verb = "-verb:delete";
      $verb
      
      $dest = "-dest:contentPath=```"$WebSiteName/app_offline.htm```"";
      $dest
      Invoke-Expression "&'$path' $verb $dest"; 
      
      # Put Sub Website Online
      $dest = "-dest:contentPath=```"$WebSiteName/WebApp1/app_offline.htm```"";
      Invoke-Expression "&'$path' $verb $dest";
      

      【讨论】:

      • 我也尝试过这种方法,但是当您的网站有后台线程时,您无法确定他们在下一个 Octopus 步骤开始之前完成了工作。
      • 听起来理想的方法是同时使用两者?
      • 可以创建一个临时应用程序池来托管app_offline.htm。重新映射应用程序以在部署时使用该应用程序池,关闭实际的应用程序池,然后最后执行相反的步骤。
      【解决方案4】:

      自拍回答!

      让 Octopus-deploy 对您的部署更加小心是很容易的,您只需要在部署例程中执行几个额外的 Execute-Powershell 步骤即可。

      添加新的第一步停止应用程序池:

      # Settings
      #---------------
      $appPoolName = "PushpayApi" # Or we could set this from an Octopus environment setting.
      
      # Installation
      #---------------
      Import-Module WebAdministration     
             # see http://technet.microsoft.com/en-us/library/ee790588.aspx
      
      cd IIS:\
      
      
      if ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Stopped" )
      {
          Write-Host "AppPool already stopped: " + $appPoolName
      }
      
      Write-Host "Shutting down the AppPool: " + $appPoolName
      Write-Host (Get-WebAppPoolState $appPoolName).Value
      
      # Signal to stop.
      Stop-WebAppPool -Name $appPoolName
      
      do
      {
          Write-Host (Get-WebAppPoolState $appPoolName).Value
          Start-Sleep -Seconds 1
      }
      until ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Stopped" )
      # Wait for the apppool to shut down.
      

      然后在最后再添加一步重启应用池:

      # Settings
      #---------------
      $appPoolName = "PushpayApi"
      
      # Installation
      #---------------
      Import-Module WebAdministration     
             # see http://technet.microsoft.com/en-us/library/ee790588.aspx
      
      cd IIS:\
      
      if ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Started" )
      {
          Write-Host "AppPool already started: " + $appPoolName
      }
      
      Write-Host "Starting the AppPool: " + $appPoolName
      Write-Host (Get-WebAppPoolState $appPoolName).Value
      
      # To restart the app pool ... 
      Start-WebAppPool -Name $appPoolName
      
      Get-WebAppPoolState -Name $appPoolName
      

      【讨论】:

      • 这是否意味着用户在部署期间在浏览器中收到 503 服务器错误?
      • 我怀疑你会想要打开 app_offline 页面而不是关闭它。
      猜你喜欢
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2020-07-28
      相关资源
      最近更新 更多