美文网首页
IIS站点自预热

IIS站点自预热

作者: 小路哥丶 | 来源:发表于2020-07-18 21:27 被阅读0次

介绍

     众所周知ASP.NET第一次访问时需要JIT编译,这就导致了ASP.NET程序第一次访问速度特别慢,尤其是ASP.NET MVC Razor模板引擎是解释型的,第一次还会将它编译一次,从前我们经常会说第一个人访问的都是人品有问题的,但是应用程序池会每过20分钟(默认,可修改)自动回收一次,也就是说每20分钟就要做一次人品有问题的人。
    在IIS7.5之前我们想让我们只能设置的ASP.NET应用程序应用程序池的回收时间,比如设一个超大的时间,但是这样做只是防止了应用程序池定时回收,却不能解决重启后,或是其它原因进程回收后每一个人访问的慢的“人品问题”,所以微软在IIS7.5 WINDOWS 2008带的IIS上增加一个叫做热启动的功能。
    热启动的原理很简单,就是在IIS的配置文件中做一些设定并指定一个继承自System.Web.Hosting.IProcessHostPreloadClient的类,然后告诉IIS说,如果哪个应用程序池回收了再次激活启动的时候就执行一下这家伙,而这家伙的功能基本上就是初始化系统的数据。

配置方法

  1. 在站点项目中添加一个心跳检查的接口,接口不需要经过鉴权,以下是我添加方法:
  • 在Global.asax下的HttpApplication中添加
protected void Application_BeginRequest()
{
      var context = HttpContext.Current;
      if (context.Request.Path == "/health/ping")
      {
            context.Response.StatusCode = 200;
            context.Response.Write("OK");

            HttpContext.Current.ApplicationInstance.CompleteRequest();
      }
}
  1. 添加预热方法
  • 站点项目下添加如下类
public class ApplicationPreload : System.Web.Hosting.IProcessHostPreloadClient {
    public void Preload (string[] parameters) {
        try {
            Console.WriteLine($"{GetLocalIp()}预热中,开始时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
            //自动请求的url,其中http://localhost:8001 最好配置在config中,这边只是演示。
            string url = "http://localhost:8001/health/ping"; //请求地址
            HttpWebRequest req = (HttpWebRequest) WebRequest.Create (url);
            req.Method = "GET";
            req.BeginGetResponse (o => {//一定要异步请求
                Console.WriteLine($"{GetLocalIp()}预热成功!结束时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
            }, null);
        } catch (Exception ex) {
            Console.WriteLine($"{GetLocalIp()}预热失败,失败原因:{ex.Message}");
        }
    }

    private string GetLocalIp () {
        ///获取本地的IP地址
        string addressIP = string.Empty;
        foreach (IPAddress address in Dns.GetHostEntry (Dns.GetHostName ()).AddressList) {
            if (address.AddressFamily.ToString () == "InterNetwork") {
                addressIP = address.ToString ();
            }
        }
        return addressIP;
    }
}
  1. 打开IIS站点下应用池的高级设置,如下图:
  • 把启动模式改成AlwayRunning


    image.png
  1. 选中根节点,在右边的功能中找到【配置编辑器】,如图所示:


    image.png
  2. 我们需要修改以下两个配置,如图所示


    image.png
  3. 打开serviceAutoStartProviders,添加预热类信息


    image.png
    image.png
  4. 打开sites配置,把预热与站点绑定


    image.png
    image.png
  5. 到此站点的热启动已经配置完毕,重新站点可以查看效果。

注意事项

  1. 在代码中最好将所有的都用try{}catch{}包住,因为如果这里抛出的异常会导致应用程序停止.
  2. 运行的状态我们可以从事件管理器中进行查看,或是自己在代码中写日志记录运行的状态.
  3. 这个类中所做的并不会引用站点的启动,不会执行应用程序的生命周期,也就是说不会调用Application_Start以及其它生命周期过程.所以在本例中我们会一个请求这个站点.
  4. 如果在这里请求站点时一定要用异步的方式Request.同步的Request会报超时.

相关文章

  • IIS站点自预热

    介绍      众所周知ASP.NET第一次访问时需要JIT编译,这就导致了ASP.NET程序第一次访问速度特别慢...

  • IIS 站点迁移

    公司有些机器用的是windows,现在要配置iis,之前没接触过,记录下;什么是IISInternet Infor...

  • Web Deploy部署错误:未能连接到远程计算机,请确保在远程

    一、安装IIS及管理服务 启用管理服务并设为自启动 配置IIS,首先在IIS根上打开管理服务 然后配置站点的IIS...

  • [值得收藏]站点部署,IIS配置优化指南

    通常把站点发布到IIS上运行正常后,很少会去考虑IIS提供的各种参数,如何配置才是最适合当前站点运行需要的?这篇文...

  • Zabbix 监控IIS站点

    新来的小伙伴需要监控IIS站点信息,所以就有了这篇文章内容很简单基于ZABBIX的LLD功能,本文所有最新内容请点...

  • IIS发布.net core项目注意事项

    VS2019下.net core的项目发布到IIS后、无法打开页面,显示如下: 在IIS对应的网站点"模块“,完全...

  • IIS配置反向代理

    使用IIS新建一站点,绑定到某个端口(通常是80)【若已有站点此步可跳过】 进入这个站点的“URL重写”组件: 点...

  • iis站点部署域名绑定

    https://www.cnblogs.com/eggTwo/p/3450864.html

  • IIS部署web服务

    1.安装IIS 2.在IIS中添加该服务的站点 3.启用文件浏览功能 4.设置应用程序 5.完工,检查。 6.使用...

  • 今天是技术帖

    今天是技术帖。 问题描述:在服务器上部署了一个网站IIS站点供人使用,这里且叫做站点A;为了方便本地工...

网友评论

      本文标题:IIS站点自预热

      本文链接:https://www.haomeiwen.com/subject/sdofkktx.html