8.1.2 应用程序池与工作者进程
“应用程序池(Applicaion Pool)”是Windows Server为提升Web服务的性能和可靠性而引入的一个Web程序隔离机制。
一个应用程序池可包含一个或多个Web应用程序。ASP.NET Web应用程序必须运行在一个应用程序池中。
在Windows Server中,一个或多个“工作者进程(Worker Process)”为应用程序池提供服务,停止一个应用程序池将导致这些工作者进程被关闭,这时,所有发往此应用程序池中Web应用程序的HTTP请求将收到“503服务不可用”的响应信息。
图 8‑7展示了一台Web服务器上正在运行的应用程序池。
图 8‑7 IIS 7中的应用程序池
如图 8‑7所示,本台Web服务器上的设置了3个应用程序池,每个应用程序池中可运行多个Web应用程序,图中DefaultAppPool这一应用程序池运行了5个Web应用程序。每个应用程序池都可以加载特定版本的.NET Framework,以对ASP.NET应用程序提供支持。在IIS 7中,应用程序池有两种运行模式——经典模式和集成模式。
经典模式下,IIS7应用程序池运行方式同IIS 6 [1]。
集成模式下,IIS 7直接预装载.NET Framework,从而为ASP.NET应用程序提供了更好的性能。
在IIS管理器中可以随时启动和停止某个应用程序池。
Windows Server上运行应用程序池的系统帐号是“NetworkService”。在后面的章节中可以看到在部署ASP.NET网站时往往需要给此帐号设置特定的权限(比如允许ASP.NET应用程序向某文件夹中添加文件)。
下面深入介绍一下IIS的系统架构以及Windows Server是如何响应HTTP请求的。
8.1.3 IIS的系统架构
IIS 6(运行于Windows 2003 Server)的架构如图 8‑8所示。
图 8‑8 IIS 6的架构
从图 8‑8中可以看到,IIS 6架构由以下几个部分组成:
(1)HTTP.SYS:运行于Windows核心(Kernel)的一个组件,它负责侦听(Listen)来自于外部的HTTP请求(通常来自网络中另一台计算机上的浏览器),根据请求的URL将其转发给相应的应用程序池,由运行于应用程序池中的工作者进程来响应此HTTP请求。当此HTTP请求处理完成时,它又负责将处理结果发送出去(其接收者通常为发出HTTP请求的浏览器)。
为了提供更好的性能,HTTP.SYS内部建立了一个缓冲区,将最近的HTTP请求处理结果保存起来,如果发现某个HTTP请求“不久以前”处理过了(即在缓冲区中可以找到),它就简单地直接从缓冲区中取出这些结果发回给客户端(通常为发出HTTP请求的浏览器)。
(2)InetInfo:在IIS 5时代,InetInfo是IIS服务的主进程,在IIS 6中,它不再负责处理HTTP请求,但它继续负责管理除了WWW服务之外的其他互联网服务,比如用于文件传输的FTP服务和用于邮件收发的SMTP服务。
InetInfo内部维护了一个元数据库(Metabase),在这个数据库中存入了一些重要的信息,这些信息对于维护各种互联网服务(比如WWW和FTP)等是必不可少的。
(3)Worker Process:负责处理HTTP请求,被译为“工作者进程”,事实上,它是由一个可执行程序W3WP.EXE运行时所生成的一个进程[2],每一个工作者进程内部都可以管理一个或多个ASP.NET应用程序。工作者进程运行于一个应用程序池(Application Pool)中。IIS 6可以创建多个应用程序池,并指定某个ASP.NET应用程序在特定的应用程序池中运行(图 8‑9)。
图 8‑9 设定ASP.NET网站所属的应用程序池(图截自Windows 2003 Server)
一般情况下,一个应用程序池只有一个工作者进程,但也可通过配置必要的参数让多个工作者进程同时运行在同一个应用程序池中,在这种情况下,这个应用程序池被称为“Web Garden(Web园)”。
(4)WAS(Web Admin Service):这是一个监控程序,它一方面可以存取放在InetInfo元数据库(Metabase)中的各种信息,另一方面也负责监控应用程序池(Application Pool)中的工作者进程的工作状态况,必要时它会关闭一个老的工作者进程并创建一个新的取而代之。
[1] IIS 6中应用程序池的运行方式后文有详细介绍
[2]“进程(Process)”是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。如用通俗的语言来表达,可以简单地将“进程”理解成一个正在运行的程序。