微软互联网信息服务(IIS)最佳实践 (微软技术开发者丛书)
上QQ阅读APP看书,第一时间看更新

1.3 关键进程InetInfo.exe和w3wp.exe

IIS服务有两个进程最为关键:IIS服务自身的进程Inetinfo.exe或WAS服务进程,以及运行Web网站所使用的进程w3wp.exe。

Inetinfo.exe进程负责在IIS启动时加载IIS的配置文件Metabase.xml到内存中,并按照配置文件的描述启动和管理IIS的各个网站。IIS 7.0以后,InetInfo.exe不复存在,它的功能被分散到几个IIS相关的Windows服务中。但是在最早期的IIS服务中,InetInfo.exe进程不但负责运行IIS服务程序,还负责运行Web网站。这样的设计会带来一个问题:Web网站的崩溃也会导致IIS服务的崩溃。为了增强IIS的鲁棒性,势必要把IIS的服务进程和Web网站工作进程分离开,于是出现了使用DLLHost.exe作为Web网站的运行进程的方式。时间一长,人们发现DLLHost.exe作为运行微软动态链接库的壳程序,运行Web网站有一些天然的劣势,例如没有对Web网站的高I/O场景进行优化,DLLHost.exe安全性差,容易被注入等(很多病毒就是靠DLLHost.exe注入Windows操作系统的)。于是到了IIS 6.0,为Web网站单独设计一款运行网站代码的壳程序就势在必行了。

以上所提到的壳程序的名字就是w3wp.exe,它是World Wide Web Worker Process的缩写,即万维网工作进程。这款w3wp.exe进程自IIS 6.0版本引入,专门针对Web网站的I/O场景做了优化,内含有专门运行代码的工作线程和专门处理数据包收发的工作线程,且异步处理HTTP请求的方式,极大地提高了Web网站代码运行效率。

在64位操作系统上,IIS同时提供了64位和32位两个版本的w3wp.exe进程。分别用来运行64位的网站代码和32位的网站代码。这是因为从Windows的设计上考虑,64位的进程是没办法直接运行32位的代码的,需要使用32位的进程才能加载针对32位编译的代码。

在IIS 6.0中,两个进程的关系是:Inetinfo.exe进程负责启动、关闭和管理w3wp.exe进程。Inetinfo.exe进程是w3wp.exe的父进程,Inetinfo.exe通过向w3wp.exe进程定期发送数据包的方式感知w3wp.exe进程是否工作良好。在IIS 7.0以后版本,对w3wp.exe进程的启动停止以及监控工作交给了Windows的WAS服务。

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