【问题标题】:IIS Publish ASP.NET Core App Without Bringing Down IIS WebsiteIIS 发布 ASP.NET Core 应用程序而不关闭 IIS 网站
【发布时间】:2022-06-20 03:40:44
【问题描述】:

当前设置


我们目前将 ASP.NET Core 产品部署到:

  • Windows Server 2016
  • 托管在 IIS 版本 10.0.14393.0 上

我们有一个“站点”,下面有多个应用程序。每个应用程序都使用自己的应用程序池,并映射到不同的物理文件夹路径位置。

每个应用程序都由其自己的源代码 ASP.NET Core Server 项目表示

IIS 结构

问题


我们将 Jenkins 用于我们的 CI/CD,这是无法更改的。我们有与 IIS 交互的 Powershell 脚本

没有 IIS 命令来停止应用程序,只有站点,但理想情况下,我们不希望在发布单个应用程序的新版本时关闭站点。我们只想关闭那个特定的应用程序。

我们通过停止与应用程序关联的 WebAppPool 来尝试此操作,然后等待(2 分钟......然后 5 分钟)。但即使在那之后,应用程序文件仍然被锁定。

我们最终会关闭 WebAppPool 和站点以释放文件以便替换它们。

我知道必须有更好的方法来做到这一点。我们如何关闭单个应用程序并阻止新请求到达它,以便我们可以替换文件然后重新启动它?一直以来,“SITE”及其下未更新的任何其他应用程序仍在运行。我不介意更新应用的停机时间。

2022 年 6 月 8 日更新

找到这个:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/app-offline?view=aspnetcore-6.0

去看看能不能解决我的问题。

【问题讨论】:

  • 这不是一个小问题。来自the docs一般来说,我们建议使用blue-green deployments 之类的模式进行零停机部署。重叠回收等功能会有所帮助,但不能保证您可以进行零停机部署。 这意味着部署到新站点或机器并将新请求重定向到新站点。旧请求完成后,终止旧站点。
  • 一种方法是使用负载均衡器来重定向流量。另一种方法是创建一个新的 Web 应用程序并使用 ARP 将调用重定向到它。这不是微不足道的。您可以找到描述如何使用 Jenkins 进行蓝绿部署的文章。有些会使用负载均衡器,有些会使用 ARP
  • 这是一款企业产品和本地服务器。有很多方法可以更好地做到这一点,但从平台的角度来看,我能做的事情有限。我可以影响的是与 IIS 交互的脚本。我不介意应用程序有停机时间......只是不是整个站点。当我说“站点”时,我指的是 IIS“站点”节点。因此,目前有 5 个应用程序作为该站点的子级运行。一个停机进行更新,另外 4 个应该继续运行。所以我需要一种方法来不停止站点,但仍然阻止请求被定向到需要替换的 asp.net 应用程序。
  • 我对问题进行了编辑,希望能澄清 ASK。

标签: .net asp.net-core iis-8


【解决方案1】:

在应用程序的根文件夹中添加名为 app_offline.htm 的文件应该会强制 ASP.NET Core 模块关闭应用程序并停止处理传入请求。 然后,您应该能够在不影响其他应用程序的情况下部署新文件。

【讨论】:

【解决方案2】:

我强烈建议将web deploy 与 IIS 一起使用。设置起来有点麻烦,但一旦配置好,效果就很好。

如果你以这种方式发布,它会自动执行以下操作:

  • 继续接受传入的请求,但暂停它们
  • 优雅地停止旧版本的应用程序
  • 回收应用程序池
  • 启动新版本的应用程序
  • 暂停的请求将恢复到新版本的应用程序

此解决方案使您能够部署新版本而不会对您的服务造成明显的中断,而其他解决方案可能会导致您的服务在发布期间无法访问。

我只使用了 Visual Studio 的发布菜单,但应该可以通过调用 msbuild.exe 作为described here 的 CI/CD 脚本使其工作。 (链接描述了 TeamCity 的灵魂,但应该可以适应 Jenkins)

【讨论】:

    【解决方案3】:

    我以前成功地将 IIS 中的站点指向符号链接。然后,符号链接又指向一个包含网页内容的文件夹。

    每当我必须更新网页时,我都会创建一个新文件夹,我们将其命名为 pages_date,然后更新符号链接并将其指向新文件夹。最后我回收了负责网页的AppPool。

    这样就可以了:

    符号链接 -> 网页_1

    将更新网页的文件夹放在它旁边,称之为webpage_2。指向它的符号链接:

    符号链接 -> 网页_2

    然后回收 AppPool。

    这使得停机时间非常短。

    Powershell 命令重启-WebAppPool:

    Restart-WebAppPool -Name "YourAppPool"
    

    Restart-WebAppPool documentation

    符号链接可以用

    创建
    New-Item -ItemType SymbolicLink -Path .\link -Target .\Notice.txt
    

    Powershell New-Item Symlink documentation

    【讨论】:

      猜你喜欢
      • 2015-03-19
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 2018-11-13
      • 2014-04-22
      • 1970-01-01
      • 2019-01-09
      • 2021-01-30
      相关资源
      最近更新 更多