IIS入门

来源:互联网 发布:淘宝旺旺名称怎么修改 编辑:程序博客网 时间:2024/06/05 04:01

一,初始IIS

微软Internet信息服务(Internet Information Service,IIS),是在Windows平台上提供的一款微软官方的Web容器服务。IIS在Windows上的作用等同于Apache服务在Linux服务器上的作用,缺少了IIS,Windows操作系统就无法向用户发布Web网站。


二,IIS架构入门

1,w3wp.exe

w3wp.exe是IIS运行Web网站所使用的进程。

w3wp.exe,它是World Wide Worker Process的缩写,即万维网工作进程。w3wp.exe专门对Web网站的I/O场景做了优化,内含有专门运行代码的工作线程和专门处理数据包收发的工作线程,且异步处理HTTP请求的方式,极大地提高了Web网站代码运行效率。

在一个w3wp.exe工作进程中,一个HTTP请求通过多个顺序步骤,在Web服务器中被称为事件。在每个事件中,每个内建的模块处理HTTP请求的一部分,例如认证用户的合法性或将HTTP请求信息添加到事件日志中。如果某个步骤需要一个托管代码功能模块来处理如执行表单验证,内建的托管代码引擎会创建一个应用程序域(AppDomain)来执行必要的处理,当请求顺序通过了所有功能组件的处理,HTTP请求的结果就会被返回到http.sys中发送给用户。

2,tcp.sys和http.sys

与IIS相关的内核驱动程序有两个:一个是tcp.sys,另一个是http.sys。

tcp.sys位于Windows通信的最底层,凡是使用TCP协议传输的HTTP协议数据包都会被tcp.sys完成组包后再交给http.sys进行处理。

当请求的数据包包含一个HTTP请求时,就会由tcp.sys转给http.sys进行处理。http.sys中包含有HTTP引擎,专门用于对HTTP请求进行分析和解析,即从HTTP请求中分析出头部数据。查询串和域名等信息。对于合规的HTTP请求,http.sys会生成HTTP上下文对象,并把上下文对象放到网站对应的请求队列中排队等待处理。

3,一个HTTP请求在IIS上处理的完整流程

1,用户在客户端浏览器输入一个URL,向Web服务器发起HTTP请求,这个请求会首先被http.yss内核驱动进行处理。
2,http.sys驱动联络WAS服务,从配置文件中获取网站相关的配置信息。
3,WAS服务请求从配置文件中获取网站相关配置信息。
4,WWW服务接受到网站相关诸如应用程序池和站点配置等配置信息。
5,WWW服务使用的配置信息来配置http.sys内核驱动的行为,如请求独立等。
6,当站点还没有工作进程为它服务时,WAS服务按照网站应用程序池配置启动一个w3wp.exe工作进程。
7,工作进程处理用户的HTTP请求,并将结果返回到http.sys驱动作为对该HTTP请求的响应。
8,客户端浏览器收到响应,渲染页面给用户看。

4,一个ASP.NET页面请求的处理。

当ASP.NET ISAPI接收到某个站点的第一个请求的时候,会通过一个名为ApplicationManager的对象创建一个应用程序域(Application Domain)。应用程序域为Web应用程序的运行提供一个隔离空间,工作进程内允许每个单独应用程序域进行创建和卸载。在应用程序域内,会创建一个HostingEnvironment类型的对象,这个对象可以用来访问与应用程序相关的信息,如应用程序所在文件夹路径等信息。

当Web网站的应用程序域对象创建成功后,对每一个HTTP请求都会创建一个HttpContext核心对象,该核心对象中包含有HTTP请求相关的全部信息,因此它在内存中非常庞大,每个HttpContext对象会占据大约20~30KB的内存。在HttpContext对象中含有HttoRequest和HttpResponse对象,用于封装HTTP的请求和响应数据。

对于Web网站的全局对象如每个功能模块和Session等对象,都被封装在HttpApplication对象中。HttpContext和HttpApplication两个对象极大地方便了程序员的编程,他们可以在代码的任意位置访问这两个对象,以便获取相关数据。

5,设定日志

IIS日志是web网站运维的重要数据,这些数据可以为日后分析用户在网站上操作和行为作出重要参考,因此记录好IIS日志非常重要。不恰当地配置IIS日志也有可能会影响web网站的性能。

IIS日志首先需要配置的是日志保存路径。IIS日志默认情况下是以 W3C日志格式一天产生一个日志文件。对于互联网上大型电商网站,每天单机的日志量在2~3个GB是很正常的。IIS的默认日志路径是%SystemDrive%\inetpub\logs\LogFiles,以W3SVC+网站id命名各个站点的日志文件夹,网站id可以在相对应的站点右键-管理网站-高级设置查看。日志在系统盘上的路径显然是不合适的。因此建议创建单独的磁盘分区来保存IIS日志。IIS日志模式已经为磁盘I/O作出了优化,日志数据并不是产生一行写入一行,而是在内存中缓存到一定的数量再再一次写入磁盘一批,这样的磁盘I/O性能是最好的。IIS日志写入磁盘的时候与时间无关,而是与数据量有关系。在日常运维中,如果需要立即看到最近几次操作的IIS日志,需要手动强制把日志从内存缓存中写入磁盘。刷新的方法是用管理员权限启动命令控制台,运行netsh http flush logbuffer命令。

日志的字段可以通过选择字段配置。


三,应用程序池入门

IIS应用程序池是为了方便管理人员而创建的针对某个特定的网站或应用程序运行的配置集。IIS应用程序池中定义的配置可以影响Web应用程序的运行方式、性能及安全性。因此,IIS应用程序池的配置对于一个站点或应用程序而言是非常重要的,一个Web站点与运行进程相关的配置项都保存在应用程序池中。

IIS应用程序池和IIS工作进程w3wp.exe之间的关系:
IIS应用程序池管理的是配置,而w3wp.exe进程是运行站点的宿主进程。应用程序池的配置决定了w3wp.exe启动和运行的方式。IIS应用程序池是个逻辑概念,是为了管理员统一管理配置而创建的;w3wp.exe工作进程是实实在在的可执行文件,网站运行时会被操作系统加载到内存中运行。

IIS应用程序池和IIS工作进程w3wp.exe之间是一对多关系,一个应用程序池的配置可以被一个或多个w3wp.exe进程加载,多个w3wp.exe进程可以同时作为一个指定网站。

回收:
回收就是用来解决长时间积累的内存泄露和资源泄露问题的。回收就是把现在已经含有泄露的进程杀掉,把这个进程从Windows操作系统申请的全部资源都归还给操作系统,然后再重新创建一个w3wp.exe进程,重新向操作系统申请资源。


四,ASP.NET中线程池的配置

在ASP.NET的服务处理中,每当服务器收到一个请求,HttpRuntime将从HttpApplication池中获取一个HttpApplication对象处理此请求,请求的处理过程将被排入线程池,对于ASP.NET来说,在Machine.config文件的processModel部分中可以设置线程池的参数。

ASP.NET线程相关的参数配置

autoConfig
基于服务器的配置自动设置以下配置参数:

  1. maxWorkerThreads
  2. maxIoThreads
  3. httpRuntime元素的minFreeThreads属性
  4. httpRuntime元素的minLocalRequestFreeThreads属性
  5. connectionManagement元素的maxConnection属性

默认设置为True

maxWorkerThreads:
设置每个CPU的最大工作线程数量,可以设置的范围为5~100,默认为20,建议设置为100。

minWorkerThreads:
设置每个CPU的最少工作线程数量,默认为1。

maxIoThreads:
配置每个CPU的最大I/O线程数量,可以设置的范围为5~100,默认为20,建议设置为100。

minIoThreads:
配置每个CPUT的最少I/O线程数量,默认为1

HttpRuntime元素的配置参数

minFreeThreads:
处理新请求保留的最少自由线程数量,默认值为8.建议每CPU设置为88个。

minLocalRequestFreeThreads:
为本地主机请求保留的最少自由线程数量,默认值为4。建议每CPU设置为76个。

appRequestQueueLimit:
在ASP.Net没有足够的线程来处理请求的时候,将会把这些请求排入一个请求队列中等待处理,appRequestQueueLimit用来设置这个队列的长度,当请求队列的长度超出这个参数的时候,服务器返回“503-Server Too Busy”。
默认为5000,在ASP.NET 1.1 中,默认为100

可以通过下面的代码获取相对应的信息:

protected void Page_Load(object sender, EventArgs e)  {      string path = this.Request.ApplicationPath;      Configuration config  = WebConfigurationManager.OpenWebConfiguration( null );      ProcessModelSection proecssModeSection  = config.GetSection("system.web/processModel")  as ProcessModelSection;      Response.Write( string.Format("MaxWorkerThreads: {0}", proecssModeSection.MaxWorkerThreads));      Response.Write(string.Format("MinWorkerThreads: {0}", proecssModeSection.MinWorkerThreads));      Response.Write( string.Format("MaxIOThreads: {0}", proecssModeSection.MaxIOThreads));      Response.Write( string.Format("MinIOThreads: {0}", proecssModeSection.MinIOThreads));      HttpRuntimeSection httpRuntimeSection   = config.GetSection("system.web/httpRuntime")  as HttpRuntimeSection;      Response.Write( string.Format("MinFreeThreads: {0}", httpRuntimeSection.MinFreeThreads));      Response.Write(string.Format("MinLocalRequestFreeThreads: {0}", httpRuntimeSection.MinLocalRequestFreeThreads));      Response.Write(string.Format("AppRequestQueueLimit: {0}", httpRuntimeSection.AppRequestQueueLimit));  }  

将minFreeThreads设置为每CPU88个自由线程,当线程池中的可用线程少于这个数量时,请求就会被排入等待队列,这样就会限制用于处理请求的线程数量为12(100 - 88)个线程。
同样,将minLocalRequestFreeThreads设置为76,当可用线程小于这个数字的时候,本地请求就会被排入等待队列中。因此可被并发处理的用户请求最多为24(100 - 76)个。
由于在请求的处理过程中,可能还会使用到新的工作线程,这个两个配置参数请求系统必须保留一定的自由线程,防止由于没有线程可用造成死锁的问题。


五,参考资料

《微软互联网信息服务(IIS)最佳实践》
《ASP.NET本质论》