当前设置
我们目前将我们的ASP.NET Core产品部署到:
- Windows Server 2016
- 托管在IIS版本10.0.14393.0上
我们有一个单一的“网站”与多个应用程序下。每个应用程序都使用自己的应用程序池,并Map到不同的物理文件夹路径位置。
每个应用程序都由其自己的源代码ASP.NETCoreServer项目表示
IIS结构
问题
我们使用Jenkins作为CI/CD,这是无法更改的。我们有PowerShell脚本与IIS交互
没有IIS命令来停止应用程序,只有一个站点,但理想情况下,我们不希望在发布单个应用程序的新版本时关闭站点。我们只想降低这个特定的应用程序。
我们尝试通过停止与应用程序关联的WebAppPool,然后等待(2分钟)来实现此目的。然后5分钟)。但即使在此之后,应用程序文件仍然被锁定。
我们最终会关闭WebAppPool和站点以释放文件,以便可以替换它们。
”””我知道有一个更好的方法来做这件事。我们如何才能关闭一个单独的应用程序,并防止新的请求到达它,以便我们可以替换文件,然后重新启动它?而“网站”及其下的任何其他应用程序未被更新仍在运行。我不介意下载应用程序更新的时间。**
更新6/8/2022
标签:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/app-offline?view=aspnetcore-6.0
我想看看这是否能解决我的问题。
4条答案
按热度按时间kgsdhlau1#
在应用程序的根文件夹中添加名为app_offline. htm的文件应强制ASP.NET Core Module关闭应用程序并停止处理传入请求。然后,您应该能够部署新文件,而不会影响其他应用程序。
wlzqhblo2#
下面是我使用蓝/绿色策略的方法:
首先,我在服务器上创建了这个文件夹结构:
接下来,在IIS中,我将应用程序的物理路径指向D:\inetpub\wwwroot\MyAppPath\绿色
然后我创建了D:\inetpub\wwwroot\MyAppPath\SetAppPath.ps1
然后,我创建了一个运行SetAppPath.ps1的不带触发器的任务(SetMyAppPath
在我的开发工作站上,我在项目根目录下创建了deploy.ps1:
然后,为了部署,我运行.\Deploy Debug或.\Deploy Release
因此,当我准备部署一个新版本时,文件被复制到服务器上的staging文件夹。然后,触发服务器上的任务,该任务将暂存文件复制到绿色或蓝色文件夹中,这些文件夹永远不是当前文件夹。
最后,应用程序路径被更新到绿色或蓝色文件夹,这不是当前文件夹。
很管用。
cnwbcb6i3#
我强烈建议在IIS中使用web deploy。有几个步骤来设置它,但一旦配置它真的工作得很好。
如果以这种方式发布,它将自动执行以下操作:
此解决方案使您能够部署新版本,而不会对您的服务造成可察觉的中断,而其他解决方案可能会使您的服务在发布期间无法访问。
我只使用了Visual Studio中的发布菜单,但应该可以从CI/CD脚本调用msbuild.exe作为described here。(链接描述了TeamCity的解决方案,但应该可以适应Jenkins)
xam8gpfp4#
我以前成功地将IIS中的站点指向符号链接。然后,符号链接又指向保存网页内容的文件夹。
每当我必须更新网页时,我都会创建一个新文件夹,让我们称之为webpage_date,然后更新符号链接并将其指向新文件夹。最后,我回收了负责网页的AppPool。
所以它会这样:
symlink -> webpage_1
将更新网页的文件夹放在旁边,称之为webpage_2。指向它的符号链接:
symlink -> webpage_2
然后回收AppPool。
这使得有可能有一个相当低的停机时间。
用于Restart-WebAppPool的PowerShell命令:
Restart-WebAppPool documentation
符号链接可以用
Powershell New-Item Symlink文档