一、前言
通过安装 IIS 10 应用程序初始化功能,并启用网站预加载设置,达到提高网站响应速度目的。当我们第一次把 ASP.NET 网站程序部署在 IIS 时,在浏览器中第一次访问网站,会发现很慢,即使你的程序并没有执行什么耗费资源的操作,也是会很慢,但当我们第二次访问网站时,会发现打开速度很快。接下来我们还会发现,网站在一段时间内,没有接收到任何请求访问时,当再次访问网站,依然会很慢,第二次访问后,居然恢复了,网站打开速度很快。这是为什么呢?
原因是 IIS 网站在第一次请求时,进行了初始化操作,而这个初始化操作耗费了时间。当第二次请求时,不再需要初始化操作,因此变快了。当网站在一段时间内,没有接收到请求时,IIS 回收了资源,当再次接收请求时,又重新进行初始化操作。IIS 的初始化和资源回收,是为了网站稳定运行,内存资源得到充分利用管理。IIS 默认情况下 29 小时回收一次资源。下面我们通过设置改变 IIS 默认行为,使网站既能保持稳定运行,又能提高网站响应速度,最终提高用户体验。
IIS 应用程序初始化使网站,能够通过在第一个请求到达之前加载 Web 应用程序来提高其 Web 站点的响应能力。通过主动加载和初始化所有依赖项(如数据库连接,ASP.NET 代码编译和模块加载),可以确保 Web 站点始终响应,即使 Web 站点使用自定义请求管道或如果应用程序池被回收。在初始化应用程序时,还可以将 IIS 配置为在应用程序完成其初始化任务之前返回备用响应,例如静态内容作为占位符或“启动页面”。
配置环境:
- 操作系统:Windows Server 2016
- IIS 版本:IIS 10
二、安装 IIS 10 应用程序初始化功能
1、打开“服务器管理器”,左侧选择“IIS”,右侧列表中,鼠标右键选择“添加角色和功能”。
2、弹出“添加角色和功能向导”,在向导中“服务器角色”里选择“应用程序初始化”,右侧显示描述为,应用程序初始化先执行耗费资源的 Web 应用程序初始化任务,然后再为网页提供服务。
从 IIS 8 以后都内置了应用程序初始化,以前比较老的 IIS 7.5 版本需要下载安装“应用程序初始化模块”,详细看这里《Application Initialization Module for IIS 7.5》,低于 IIS 7.5 版本的不支持应用程序初始化。
1、打开 IIS 管理器,左侧展开“应用程序池”节点,右侧选择某个网站的应用程序池,鼠标右键“高级设置”。
2、在应用程序池高级设置中,设置 4 项。
- 常规 > 启动模式,设置为“AlwaysRunning”。将应用程序池配置为始终运行模式下运行。
- 回收 > 固定时间间隔(分钟),设置为“0”。一个时间段(以分钟为单位),超过该时间后,应用程序池将回收。值为 0 意味着应用程序池不会按固定间隔回收。
- 回收 > 特定时间,添加一组时间为凌晨 4 点。应用程序池进行回收的一组特定的本地时间(24 小时制)。
- 进程模型 > 闲置超时(分钟),设置为“0”。工作进程在关闭之前可以保持闲置状态的时间(以分钟为单位)。如果某个工作进程既未处理请求,也未收到任何新的请求,则将进入闲置状态。
设置解释:将某网站的应用程序池设置为始终运行,工作进程不进入闲置状态,不按照固定时间间隔回收程序池,采用特定时间回收程序池,并设置回收时间为每天凌晨 4 点回收。设置凌晨 4 点回收,也就是考虑此时网站访问人数相对较少,服务器资源相对较多,最大降低对用户的影响。另外,需要注意的是,回收将导致网站内存信息消失,例如 session 存放在内存,会导致 session 消失。不只是回收会导致 session 丢失,其它也会导致,例如更新网站配置,手动重启回收等,都会导致 session 丢失。可考虑其他方式保存 session,例如数据库或 cookie 等。
通过预加载工作进程减少第一个请求的响应时间。IIS 应用程序初始化允许网站在第一个请求到达之前,在工作进程启动后立即配置要预加载的 Web 应用程序。通过预加载应用程序,工作进程能够减少响应第一个请求所需的时间。在请求到达服务器时,已经执行了依赖项的加载和初始化,例如数据库连接,.NET Framework 以及 ASP.NET 应用程序和依赖项的即时编译。
1、打开 IIS 管理器,左侧展开“网站”节点,在网站上鼠标右键选择“管理网站 > 高级设置”。
2、在“高级设置”设置“预加载已启用”为“true”。
五、设置初始化请求地址
IIS 应用程序初始化可以提高用户体验。通过指定要执行的一组 URL 来初始化应用程序,并且可以将 IIS 配置为在应用程序完成初始化之前返回备用响应(如静态内容)。
1、打开“配置编辑器”。
2、找到“system.webServer/applicationInitialization”节点。
- 设置“doAppInitAfterRestart”为“true”。指定每当应用程序重新启动时自动启动初始化过程。
- 在“(集合)”行最后面,单击省略号。在集合编辑器中,添加要初始化的应用程序,单击“添加”,单击“hostName”,然后将 hostName 设置为主机的名称。单击 initializationPage 并将其设置为应用程序的 URL。关闭对话框。
属性介绍:
属性 | 描述 |
---|---|
(集合/Collection) | 可选的集合属性。默认集合为空。指定在应用程序重新启动时要初始化的应用程序。 |
doAppInitAfterRestart | 可选的布尔属性。默认值为false 。指定每当应用程序重新启动时自动启动初始化过程。请注意,这与 application 元素中的 preLoadEnabled 属性不同,后者指定在重新启动应用程序池后启动初始化过程。 |
remapManagedRequestsTo | 可选字符串属性。默认值为空"" 。指定在应用程序初始化期间要返回的静态文件的名称(html 静态页面)。 |
skipManagedModules | 可选的布尔属性。默认值为false 。指定在初始化期间是否加载托管模块,true 为不加载托管模块。 |
在 Web.config 配置文件中也可以设置以上属性:
<system.webServer>
<applicationInitialization
doAppInitAfterRestart="true"
skipManagedModules="true"
remapManagedRequestsTo="filename.htm">
<add initializationPage="/default.aspx" hostName="myhost"/>
</applicationInitialization>
</system.webServer>
微软文档:Application Initialization <applicationInitialization>
(完)