首页 > 其他分享 >如何优雅的关闭一个IIS站点

如何优雅的关闭一个IIS站点

时间:2023-12-02 17:44:43浏览次数:26  
标签:90s 请求 IIS 应用程序 优雅 站点 NET

众所周知,当我们使用IIS的时候,在使用负载均衡的情况下,想停掉一个站点,通常会点击Sites(网站)中的Stop(停止)来停止一个站点。但是这样做,会带来一个问题,当点击Stop(停止)时,正在响应中的请求会立刻被切断,使客户端无法收到响应,后续也无法连接该站点,在某些业务场景中,比如涉及金额交易业务,在没有使用幂等,锁等手段的情况下,强行切断的请求后,客户端不知道该交易的交易情况,如果再次请求(因为本站点已停止,负载均衡会指向其他机器)会造成重复交易,如果不请求,客户端也不能确切的知道该交易已经成功。类似微服务中,服务间请求超时的情况。

熟悉IIS的读者通常不会直接停止站点,而会选择点击Application Pools(应用程序池)中的Stop(停止)来停止一个站点,应用程序池在被停止后,新的请求会被响应503,负载均衡识别到503后,会把该请求负载到其他机器上,以保证业务不会中断。同样的问题,当点击Stop(停止)停止时,正在响应的请求,会发生什么情况呢。有经验的开发/运维会回答,在Application Pools(应用程序池)里Advanced Settings(高级设置)中Process Model(进程模型)组包含一个Shutdown Time Limit(关闭时间限制)选项,默认值为90s。这就意味着当应用程序池停止、回收时,IIS会最多等待没响应的请求90s,如果90s内,所有的请求响应完毕,应用程序池就会被停止、回收。那么如何判断IIS在这90s内未响应请求是否全部被响应呢,如果部署的程序是ASP.NET Core,可以在Event Viewer(事件查看器)/Windows Logs(Windows 日志)/Application(应用程序)里查看事件日志,如果出现Failed to gracefully shutdown application 'MACHINE/WEBROOT/APPHOST/xxx'.这个警告,则表明存在请求没有被响应,被IIS强行关闭的情况。

事与愿违,在实际生产实践中,读者会发现IIS并没有"等待"90s,就会关掉连接,造成正在请求的HTTP无法响应。通过阅读[官方文档](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-8.0#ihostapplicationlifetime ".NET Generic Host in ASP.NET Core")我们得知,等ASP.NET Core收到关闭信号时,对于正在处理的HTTP请求,会等待5s,5s之后会像IIS那样关闭连接。所以我们需要设置HostOptions
var builder = WebApplication.CreateBuilder(args);

......

builder.Services.Configure<HostOptions>(options =>
{
    //If the timeout period expires before all of the hosted services stop, any remaining active services are stopped when the app shuts down. The services stop even if they haven't finished processing. If services require more time to stop, increase the timeout.
    //Default: 5 seconds
    options.ShutdownTimeout = TimeSpan.FromSeconds(30);
});

......
按照文档修改程序后,实际测试发现,设置.NET Generic Host的ShutdownTimeout"似乎"不生效, 在改动前由于IIS的Shutdown Time Limit默认是90s ,ASP.NET Core中ShutdownTimeout默认值是5s,所以在改动前IIS站点会最多等待正在请求的HTTP 5s 在改动后,笔者把.NET Generic Host的ShutdownTimeout调整至30s后,实测下来发现点击停止应用程序池后,竟然只能正在请求中的HTTP 10s ! 于是再次搜索资料,终于发现还有一个参数需要设置-> https://stackoverflow.com/questions/51634638/graceful-shutdown-of-ihostedservice  和官方文档[地址](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-3.1#attributes-of-the-aspnetcore-element "ASP.NET Core Module (ANCM) for IIS") 在最近的文档(.NET 8)里竟然把Attributes of the aspNetCore element这一节删掉(移走)了,导致查阅最新文档,根部搜索不到所需信息,接下来按照文档操作就十分简单了,加上shutdownTimeLimit属性,修改web.config如下:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2"
          resourceType="Unspecified" />
      </handlers>
      <aspNetCore shutdownTimeLimit="30" processPath="dotnet" arguments=".\WebApplicationTest.dll" stdoutLogEnabled="true"
        stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>
修改后,再次实测,即符合预期,在使用ASP.NET Core的情况下关于shutdownTime总结(省流)如下:

IIS应用程序池shutdownTime默认值为90s

AspNetCoreModuleV2shutdownTime默认值为10s

.NET Generic Host(应用程序)默认值为5s

如要修改shutdownTime则需同时关注以上三处设置。祝您使用愉快!

标签:90s,请求,IIS,应用程序,优雅,站点,NET
From: https://www.cnblogs.com/chasingdreams2017/p/17871919.html

相关文章

  • 【Azure App Service】同一个App Service下创建多个测试站点的方式
    问题描述在一个AppService中,部署多个应用,每个应用相互独立,类似与IIS中在根目录下创建多个子应用的情况。 问题解答可以的。通过AppServiceConfiguration页面,添加virtualapplication,站点链接即对应的virtualpath,在virtualpath下上传应用部署包 具体操作可以参考:https://lea......
  • 【Azure App Service】同一个App Service下创建多个测试站点的方式
    问题描述在一个AppService中,部署多个应用,每个应用相互独立,类似与IIS中在根目录下创建多个子应用的情况。 问题解答可以的。通过AppServiceConfiguration页面,添加virtualapplication,站点链接即对应的virtualpath,在virtualpath下上传应用部署包 具体操作可以参考:ht......
  • Vue网站发布到iis后提示404页面不可访问
    参考:https://www.cnblogs.com/yhnet/p/14804869.htmlvue重定向和跨域配置:https://zhuanlan.zhihu.com/p/5306882511.安装组件:URLRewrite:https://www.iis.net/downloads/microsoft/url-rewriteApplicationRequestRouting:https://www.iis.net/downloads/microsoft/application-re......
  • 如何编写优雅的异步代码 — CompletableFuture
    如何编写优雅的异步代码—CompletableFuture Java实现异步编程的8种方式  ......
  • 使用Win-ACME在Windows+iis服务器下配置自动续期SSL证书
    使用Win-ACME在Windows+iis服务器下配置自动续期SSL证书 由于网站建设和小程序开发等都需要https,但是ssl证书有过期的限制,如果没有及时续期ssl证书,那么将会影响线上程序正常运行,因此我便找了很多可以在windows服务器下使用的自动续期证书的工具。win-acme,github地址:https:/......
  • 优雅代码
    优雅代码part1写注释方便自己看,也方便别人阅读tab键相当于4空格换行与缩进换行符\导入规范假设目录:Tree|___m1.py|___m2.py|___Branch |___m3.py |___m4,py在m2.py写代码defprintself(): print("m2")在m3.py写代码defprintself(): print("m3")import本地......
  • Java8中将List优雅地转Map的多种方式
    在代码开发过程中,我们经常需要将List中的元素根据某一个字段进行分组,这个时候,我们就需要把List来转换成Map来满足我们的业务需求,通常我们转换的场景有以下几种:一、List<Object> 转 Map<String,String>二、List<Object> 转 Map<String,Object> (返回对象本身)三、List<Ob......
  • IIS 10的重大更新通常会随着Windows Server和Windows 10的累积更新一起发布,这些更新可
    IIS10是WindowsServer 和Windows10操作系统中内置的Web服务器角色。针对IIS10的重大更新通常会随着WindowsServer和Windows10的累积更新一起发布,这些更新可能包括性能改进、安全性增强、新功能和修复程序。在过去的更新中,IIS10可能会获得以下方面的重大改进:安全性增......
  • IIS的web.config中跨域访问设置方法
    需求:页面要显示1个图片,但是因为各种原因,导致图片在服务器2上,但是要展示的程序在服务器1的上面,这样就造成了在显示的时候出现了跨域的问题,本来的思路为直接写个程序进行后台获得图片的路径,然后把图片进行下载出来,然后返回服务器1的图片地址,但是,由于这个周期不确定性和现阶段项目的......
  • 中间件IIS监控指标、配置和Windbg调试分析
    1.关键性能计数器指标a.Web服务(W3SVC)性能计数器当前连接数(CurrentConnections):显示当前所有HTTP连接的数量。过高的数值可能表明网站流量过大或连接无法及时释放。每秒请求数(Requests/sec):显示每秒钟收到的HTTP请求的数量。这可以帮助您了解网站的流量。匿名用户/秒(Ano......