可能很多朋友使用Windows Server 2003是因为IIS 6 的强大性能吧,和Windows 2000中包含的IIS 5 相比,IIS 6更为安全和稳定,最重要的是具有更高的性能,那么,为什么IIS 6会具有更高的性能呢?
IIS 5 和 IIS 6 的架构比较
这点需要从IIS 5的架构说起。IIS 5的架构如下图所示,
IIS 5 的所有组件都工作在用户模式中,核心组件INETINFO侦听WinSock端口(例如常见的TCP 80端口)。当HTTP访问请求到达时,工作在内核模式的TCP/IP驱动将其直接路由到INETINFO进程,INETINFO进程自己本身对此请求进行处理或者将其交付扩展组件(如ISAPI扩展)进行处理。IIS 5 使用COM+提供的DLLHOST基础结构方式进行工作,这种方式具有以下缺陷:
在INETINFO中执行第三方代码;这样的后果是如果执行的代码有问题,那么会导致整个Web服务器停止工作;
如果执行的代码工作在OOB方式,那么可能需要多次用户模式到用户模式的转换,这降低了执行效率;
Web服务器上的所有Web站点工作在一个应用程序池内,无法实现隔离;
针对IIS 5中的种种问题,微软将IIS 5的代码推倒重来,重新设计了IIS 6并在Windows Server 2003中提供。IIS 6的架构如下图所示,
可以从上图中看到,INETINFO进程虽然也存在,但是已经不再处理HTTP请求,而是处理FTP、SMTP和NNTP等非HTTP请求了。在IIS 6中,Web服务组件由以下三个组件构成:
运行在内核模式的HTTP.sys(HTTP协议栈);
运行在用户模式的WAS(Web Admin Service,包含于W3SVC服务中);
运行在用户模式的工作进程(WP,Worker Process)
HTTP.sys(HTTP协议栈)
HTTP.sys是工作在内核模式的HTTP请求侦听器,它的架构如下图所示:
HTTP.sys不会执行外部代码,它具有以下作用:
侦听和分析HTTP请求,支持IPv4和IPv6;
根据URL命名空间将接收到的HTTP请求路由到不同的工作进程;如果请求的URL并不位于本地的URL命名空间范围中,则返回400错误;
将HTTP请求进行队列缓存;
在内核模式中缓存静态的和无需身份验证的内容响应;这极大的提高了Web服务的响应速度,增强了Web服务器的性能。
支持PAE内存寻址方式,在x86上支持的内存容量为64GB;
WAS(W3SVC)
WAS包含于W3SVC服务中,它负责管理IIS 6中的配置、应用程序池和工作进程,它工作在用户模式,但不会执行外部代码。
它主要具有以下作用:
配置HTTP.sys;
管理应用程序池;
创建工作进程;
工作进程回收;
工作进程状态监视;
工作进程快速失败保护;
支持孤立工作进程以进行调试等;
工作进程(WP,Worker Process)
在介绍工作进程之前,需要先介绍应用程序池。应用程序池定义了可以共享工作进程的Web应用程序(Web站点)的集合,你可以认为它是一组URL命名空间,属于此URL命名空间范围中的Web站点将共享此应用程序池中的工作进程,而HTTP.sys是根据应用程序池所定义的URL命名空间将接收到的HTTP请求路由到此应用程序池对应的工作进程。
和IIS 5 中只能使用一个应用程序池不同,在IIS 6 中你可以创建多个应用程序池,并将不同的Web站点(Web应用程序)分配到不同的应用程序池中,一个应用程序池可以具有一个或多个Web应用程序。不同应用程序池之间是完全隔离的,某个应用程序池出现故障时不会影响其他应用程序池;这样当属于某个应用程序池的Web站点因为代码编写问题而导致停止服务时,不会影响到使用其他应用程序池的Web站点,这最大的实现了Web服务器的高可用性。
在IIS 6中提供了Web园功能,支持使用超过1个的工作进程,并且支持在SMP系统中为工作进程分配CPU亲缘关系,让其只在某些CPU上运行。
工作进程则是真正用于处理客户发送的HTTP请求的组件,你可以认为它是一个全功能的Web服务器,就像一个微型的IIS 5 服务器一样。当HTTP.sys决定将接收到的HTTP请求路由到某个应用程序池时,它是将HTTP请求路由到此应用程序池对应的工作进程进行处理;工作进程处理HTTP请求,如果需要则加载其他组件(ISAPI扩展或过滤器等等)进行处理,并将处理结果返回给HTTP.sys。
当客户发起HTTP连接请求时,IIS 6完整的处理过程如下:
在W3SVC服务启动时,WAS即启动,并且根据metabase.xml中的设置来配置HTTP.sys;
当HTTP.sys接收到HTTP请求时,分析其URL命名空间,如果在自己的响应缓存中具有匹配值则直接从缓存中获取响应并返回给客户,如果没有匹配值则根据WAS提供的URL命名空间 范围来决定由哪个应用程序池处理此HTTP请求;
如果此应用程序池当前没有工作进程,那么HTTP.sys通知WAS为其创建一个新的工作进程;
HTTP.sys将接收到的HTTP请求路由到对应的工作进程中,工作进程处理此HTTP请求然后将结果返回给HTTP.sys,并且根据缓存活动算法来告知HTTP.sys是否缓存此结果;
HTTP.sys将请求的处理结果返回给原始客户,并根据工作进程的提示来决定是否保存此处理结果到自己的缓存中。
从上面的比较可以看出,IIS 6 和 IIS 5 相比在可靠性、扩展性和安全性上都具有很大的提升,它主要具有以下新特性:
可靠性:由于Web应用程序在不同的工作进程中执行,并且基于WAS完善的隔离、监控和恢复机制,当某个应用程序池出现问题时,不会影响其他应用程序池并且能够得到最快的恢复。
扩展性:通过全新设计的架构,IIS 6显著的提高了Web服务器的吞吐量和性能,从而在以下方面得到了提高:
IIS 6 Web服务器可以架设的Web站点数;
并发活动工作进程数;
Web服务器或Web站点的启动和停止性能;
Web服务器可以处理的并发请求数;
安全性:和安装Windows 2000服务器时会默认安装IIS 5并启用ASP支持不同,在安装Windows Server 2003 标准版/企业版/数据中心版时默认并不会安装IIS 6,并且在安装IIS 6时,默认只能访问静态内容并且禁止使用父路径访问。管理员可以根据自己的需要在IIS管理器中启用或禁用Web服务扩展。
可管理性:为了迎合企业中管理的需要,IIS 6中提供了多种管理工具,例如你可以通过IIS管理器、运行脚本或者直接修改IIS Metabase来配置IIS,你也可以安装IIS的远程管理组件来进行远程管理。
增强开发支持:在IIS 6中提供了ASP.NET的支持,并且也支持XML、SOAP和IPv6。
IIS 6 中的应用程序隔离模式
和IIS 5 的架构相比,IIS 6 的新架构具有更高的性能、稳定性和可用性,但是IIS 6这种新架构所运行的隔离模式(工作进程隔离模式)不支持使用以下特性的Web应用程序:
COM+ OOB;
会话状态保存在工作进程中:在回收工作进程时会话状态就会丢失(IIS 6 中默认会在一定空闲时间后回收工作进程);
多实例ISAPI:为由多个进程加载所编写的并且并发运行的 ISAPI 应用程序。
工作外进程:所编写的将请求转给其他工作进程的应用程序。
不过微软为了保持后向兼容,在IIS 6 中除了提供工作方式如上文所描述的工作进程隔离模式外,还提供了工作方式几乎和IIS 5一样的IIS 5 隔离模式,当工作在IIS 5 隔离模式下,IIS 6的架构如下图所示:
当IIS 6 工作模式为IIS 5 隔离模式时,它和IIS 5 的工作方式基本一样。而当IIS 6 工作在工作进程隔离模式下时,根据IIS 6的新架构,在隔离环境中运行所有应用程序代码,并且由于在应用程序池间切换所需要的指令很少,在隔离方式下运行代码并不会带来性能的降低。工作进程隔离模式和目前的绝大部分Web站点和Web应用程序兼容,并且可以获得更高的安全性和性能,和IIS 5 隔离模式相比,运行在工作进程隔离模式主要具有以下好处:
支持使用多个应用程序池,并且每个应用程序池可以具有不同的配置;而IIS 5 隔离模式只能使用一个应用程序池并且不能进行配置;
工作进程的运行账户为网络服务账户而不是IIS 5 隔离模式中的本地系统账户;
支持在一个应用程序池中使用多个工作进程;支持工作进程CPU亲缘关系设定;支持工作进程回收以减少系统资源的占用;支持工作进程状态监控; 支持工作进程快速失败保护;支持孤立工作进程以进行调试等;
在应用程序池之间完全隔离;
因此强烈推荐你将IIS 6运行在工作进程隔离模式下,除非你的Web应用程序明确说明不支持运行在此模式下。