【发布时间】: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