1.概述
IIS6.0
提供了一个全新的IIS
架构。这个架构的详细情况如下图所示:
由上看出IIS 6.0
的内核体系主要由三个组件构成:HTTP.SYS
,W3SVC
以及W3Core
。作为一个全新的架构,IIS6.0
有如下让人值得关注的新特点:
Ø HTTP.SYS
。全新的内核监听模式。
Ø Web
管理服务(W3SVC
)。
Ø 应用程序池。
Ø 工作进程。
Ø IIS6.0
新的应用程序隔离模式-工作进程隔离模式。
核心变化:
-
在
IIS6.0
中将WWW
服务从Inetinfo.exe
进程中独立了出来,作为一个单独的组件(W3SVC
)来处理 -
将接收用户
http
请求的功能从W3SVC
中分离了出来。接收用户http
请求的功能现在由W3Core
来实现
IIS7.0
架构和6.0
没有根本性变化,但是有不少优化。
IIS
启动
web
服务器进程(Inetinfo.exe
)
2.HTTP.SYS
HTTP.SYS
的主要功能是:侦听用户的http
请求(请求来自于TCPIP.sys
驱动程序)并将请求转发给相关的web
应用程序(http
请求中包含了IIS
上运行的web
站点所使用的IP
地址和端口)处理,最后HTTP.SYS
将处理结果返回给用户(返回到TCPIP.sys
驱动程序)。具体操作流程如下图所示:
用户通过浏览器对IIS中的web应用程序发出http
请求。(用户发出请求)
经过各种处理http请求最终会到达TCPIP.SYS驱动程序,TCPIP.SYS将请求转发给HTTP.SYS网络驱动程序。(TCP.sys转发请求到http.sys)
在HTTP.SYS中,它的监听模块始终在监听着网络上是否有对它的http请求,当一个http请求到达以后,监听模块会对这个http请求进行分析并根据请求的类型的不同,将这些请求进行排队,等候应用程序池中的web应用程序对队列中的请求进行处理。(http.sys对请求分类排队)
在HTTP.SYS中维护着一张数据配置表,在这个表中记录着URL与应用程序池之间的对应关系(操作系统启动时IIS首先在HTTP.SYS中注册自己的虚拟路径即可访问的url),请求到达时根据请求的URL将其转发给相应的应用程序池,运行于应用程序池中的工作者进程来响应此HTTP请求
如果在一个http数据请求包到达之后,相关的应用程序池还没有启动,那么HTTP.SYS负责将这个应用程序池启动。这种处理方式也叫做请求式启动。
当一个http请求被处理完毕之后,处理的结果会返回到HTTP.SYS中,由HTTP.SYS中的响应发送模块将这个处理结果返回到TCPIP.SYS中,并最终返回给用户。
关于内核模式与用户模式:
在Windows Server操作系统中,一个进程既可以运行于内核模式,也可以运行于用户模式。如果一个进程运行于内核模式,那么这个进程就可以访问所有硬件和系统数据;如果一个进 程运行于用户模式,那么这个进程不能直接访问硬件,而且访问系统数据时也会受到限制。在Intel处理器架构中一共有0~3四个特权级,内核模式运行于0级之内,而用户模式运行于3级。通过在内核模式运行Http.SYS,侦听器可以直接访问TCP/IP协议栈,但是又能够位于www服务之外,这样就不会受到应用程序中代码缺陷的影响,也不会因为应用程序崩溃而出现问题。
用户模式和内核模式之间转换是一项开销很大的操作,服务器首先从内核模式的TCP/IP栈将传入的HTTP请求传递给用户模式的Winsock,由Winsock将请求传递给IIS。从内核模式到用户模式的切换很快发生,但不可避免地给处理过程带来瞬间的延迟。当负载较大时延迟不断累加,由于这种转换是必不可少的,所以管理员根本没有办法优化处理过程。
IIS 6.0的https.sys内核模式驱动程序极大地减少了用户模式和内核模式之间的切换次数。http.sys监听着HTTP请求,决定由哪一个用户模式的进程来处理该请求,或者是否由驱动程序本身返回用户请求的内容。
3.W3SVC
(3w服务)
与IIS 5.0
不同,W3SVC
已经从Inetinfo.exe
进程中分离了出来作为一个独立的进程运行。根据配置数据的设置,W3SVC
负责创建工作进程(W3Core
)。在工作进程的运行过程中,W3SVC
还负责监视它的运行状态。何时创建工作者进程??当应用程序池启动完成后。
4.W3Core
W3Core
又称为工作进程(Worker Process
)或W3WP.exe
。默认情况下IIS 6.0
是在工作进程隔离模式下运行的。对于每一个web
应用程序,IIS6.0
都有一个或多个工作进程实例来运行和管理它。每一个工作者进程也可以管理多个web
程序。功能是在一个名为W3Core.dll
的动态联接库中实现的。在IIS5.0
隔离模式下,这个DLL
可以被加载到Inetinfo.exe
进程中;在应用程序隔离模式下,这个DLL
可以被加载到W3WP.exe
进程中。
web
应用程序与工作进程与 应用程序池的关系
- 在
IIS6.0
中,每一个用户web应用程序都会运行在一个应用程序池中。这个应用程序池可以是IIS
默认的应用程序池,也可以是用户自定义的应用程序池。 - 作为一个宿主程序,每个应用程序池中都会运行着一个或者多个用户
web
应用程序。 - 在应用程序池中,存在着一个或者多个工作进程。每个工作进程只能属于一个特定的应用程序池,由这些工作进程来负责管理应用程序池中的用户
web
应用程序。
他们的结构关系如下图所示:
(图 16)应用程序池
如果我们将应用程序池比喻成为一座公寓,那么在公寓里面的那些住户就是一个个web
应用程序,而公寓的物业的管理人员就是工作进程。如果公寓比较大,住户比较多,那么就可能需要有多个物业管理人员。也就是说,每个应用程序池里面可以有多个工作进程在工作。
在处理用户的http
请求的时候,内核模式下的HTTP.SYS
直接监听用户的http
请求,并将用户的http
请求直接转发给W3Core
。并由W3Core
所管理的web
应用程序来处理用户的http
请求。这一操作过程如下图所示:
(图 19)用户请求的处理过程
通过这种方式,IIS6.0
中处于内核模式下的HTTP.SYS
直接与用户应用程序通信。这就缩短了数据的请求、转发过程,提高了IIS
的性能。
5.应用程序池
是Windows Server
为提升Web
服务的性能和可靠性而引入的一个Web
程序隔离机制。
一个或多个工作者进程为应用程序池提供服务(管理应用程序)
应用程序池
应用程序池中可运行多个Web
应用程序,DefaultAppPool
应用程序池运行了5个Web
应用程序。
每个应用程序池都可以加载特定版本的.NET Framework
对ASP.NET
应用程序提供支持。
在IIS 7
中,应用程序池有两种运行模式——经典模式和集成模式。
- 经典模式下,
IIS7
应用程序池运行方式同IIS 6
- 集成模式下,
IIS 7
直接预装载.NET Framework
,从而为ASP.NET
应用程序提供了更好的性能。
Windows Server
上运行应用程序池的系统帐号是“NetworkService
”。
在后面可以看到在部署ASP.NET
网站时往往需要给此帐号设置特定的权限(比如允许ASP.NET
应用程序向某文件夹中添加文件)。
应用程序池的回收功能
在工作进程隔离模式中,通过配置,IIS
可以定期重新启动应用程序池中的工作进程。通过这种机制IIS
可以更好地管理那些有错误的工作进程。在默认情况下,当IIS
回收一个应用程序池的时候,它会使用一种称为overlapped recycle
的回收技术。
在这种回收模式下,失败的工作进程将不会接收新的http
请求,当它处理完存储在请求队列中的所有剩余的http
请求后,这个进程则正常关闭;或者如果在达到了配置的时间限制、请求数、设置的时间计划,或当达到指定的内存用量限制后仍没有关闭,则明确地终止进程。默认情况下,应用程序池每隔1740分钟(29小时)回收一次。
为了防止服务中断,在失败的工作进程继续处理存储在请求队列中的剩余的请求的时候,IIS
启动了新的工作进程,所有新的http
请求都会由给这个新的工作进程处理。在此期间,TCP/IP
连接不会丢失。
6. Web园
在一个应用程序池中存在着一个或者多个web
应用程序,并且由这个应用程序池中一个或者多个工作进程来管理这些web
应用程序。如果在一个应用程序池中存在着多个工作进程的话,那么就形成了一个web
园(Web Gardens
)。
关于Web
园的配置,如下图所示,只需要将“最大工作进程数”的值设置为大于1的值就可以了。
(图 23)配置Web园
这样做的好处是:提高了处理用户http
请求的效率;当一个工作进程坏掉之后,其他的工作进程仍然能够处理用户的请求,保证了系统的稳定性和可靠性。