IIS 体系结构简介

作者:IIS 团队 Reagan Templin

兼容性

版本 说明
IIS 7.0 及更高版本 本文中所述的功能是在 IIS 7.0 中引入的。
IIS 6.0 及更低版本 在 IIS 7.0 之前,本文中所述的功能不受支持。

介绍

Internet Information Services (IIS) 7 及更高版本提供请求处理体系结构,其中包括:

  • Windows Process Activation Service (WAS),使站点能够使用 HTTP 和 HTTPS 以外的协议。
  • 可以通过添加或删除模块来自定义的 Web 服务器引擎。
  • 来自 IIS 和 ASP.NET 的集成请求处理管道。

IIS 中的组件

IIS 包含多个组件,它们为 Windows Server® 2008 (IIS 7.0) 和 Windows Server 2008 R2 (IIS 7.5) 中的应用程序和 Web 服务器角色执行重要功能。 每个组件都有个用处,例如侦听向服务器发出的请求、管理进程和读取配置文件。 这些组件包括协议侦听器(例如 HTTP.sys)和服务(例如 World Wide Web 发布服务(WWW 服务)和 Windows Process Activation Service (WAS))。

协议侦听器

协议侦听器接收特定于协议的请求,将其发送到 IIS 进行处理,然后将响应返回给请求者。 例如,当客户端浏览器从 Internet 请求网页时,HTTP 侦听器 HTTP.sys 会接收该请求并将其发送到 IIS 进行处理。 IIS 处理请求后,HTTP.sys 就会向客户端浏览器返回响应。

默认情况下,IIS 提供 HTTP.sys 作为协议侦听器,用以侦听 HTTP 和 HTTPS 请求。 IIS 6.0 中引入了 HTTP.sys,这一 HTTP 特定协议侦听器可用于处理 HTTP 请求。 HTTP.sys 在 IIS 7 及更高版本中仍然是 HTTP 侦听器,但支持范围包括安全套接字层 (SSL)。

为了支持使用 HTTP 和 HTTPS 之外的协议的服务和应用程序,可以使用 Windows Communication Foundation (WCF) 等技术。 WCF 具有侦听器适配器,可提供协议侦听器和侦听器适配器的功能。 本文档稍后将介绍侦听器适配器。 有关 WCF 的详细信息,请参阅 MSDN 上的“Windows Communication Foundation”。

超文本传输协议堆栈 (HTTP.sys)

HTTP 侦听器是 Windows 操作系统网络子系统的一部分,会作为内核模式设备驱动程序来实现,这一驱动程序叫做 HTTP 堆栈 (HTTP.sys)。 HTTP.sys 侦听来自网络的 HTTP 请求,将请求传递到 IIS 进行处理,然后将处理后的响应返回到客户端浏览器。

在 IIS 6.0 中,HTTP.sys 取代了 Windows Sockets API (Winsock),后者是以前版本的 IIS 用于接收 HTTP 请求和发送 HTTP 响应的用户模式组件。 IIS 7 及更高版本继续依赖于 HTTP.sys 来处理 HTTP 请求。

HTTP.sys 具有以下好处:

  • 内核模式高速缓存。 无需切换到用户模式即可处理对缓存响应的请求。
  • 内核模式请求队列。 由于内核将请求直接转发到正确的工作进程,减少了请求在上下文切换方面的开销。 如果没有工作进程可以接受请求,则内核模式请求队列将保留该请求,直到工作进程接收该请求。
  • 请求预处理和安全筛选。

World Wide Web 发布服务(WWW 服务)

在 IIS 7 及更高版本中,以前由 World Wide Web 发布服务(WWW 服务)单独处理的功能现在分为两个服务:WWW 服务和新服务 Windows Process Activation Service (WAS)。 这两个服务在同一个 Svchost.exe 进程中作为 LocalSystem 运行,并共享相同的二进制文件。

注意

你还可能会在文档中看到称为 W3SVC 的 WWW 服务。

WWW 服务在 IIS 6.0 中的工作原理

在 IIS 6.0 中,WWW 服务管理 IIS 中的以下主要区域:

  • HTTP 管理和配置
  • 流程管理
  • 性能监视

HTTP 管理和配置

WWW 服务从 IIS 元数据库读取配置信息,并使用该信息来配置和更新 HTTP 侦听器 HTTP.sys。 此外,WWW 服务还会启动、停止、监视和管理负责处理 HTTP 请求的工作进程。

性能监视

WWW 服务监视性能,并为网站和 IIS 缓存提供性能计数器。

进程管理

WWW 服务管理应用程序池和工作进程,例如启动、停止和回收工作进程。 此外,WWW 服务还监视工作进程的运行状况,并在多个工作进程在可配置的时间内发生故障时调用快速故障检测来阻止新进程启动。

WWW 服务在 IIS 中的工作原理

在 IIS 中,WWW 服务不再管理工作进程。 相反,WWW 服务是 HTTP 侦听器 HTTP.sys 的侦听器适配器。 WWW 服务作为监听适配器,主要负责配置 HTTP.sys,在配置发生变更时更新 HTTP.sys,以及在请求进入请求队列时通知 WAS。

此外,WWW 服务继续收集网站的计数器。 由于性能计数器仍然是 WWW 服务的一部分,因此它们为 HTTP 专属,不适用于 WAS。

Windows 进程激活服务 (WAS)

在 IIS 7 及更高版本中,Windows 进程激活服务 (WAS) 管理应用程序池配置和工作进程,而不是 WWW 服务。 这使你能够对 HTTP 和非 HTTP 站点使用相同的配置和进程模型。

此外,如果不需要 HTTP 功能,则可以在没有 WWW 服务的情况下运行 WAS。 例如,如果不需要侦听 HTTP.sys 中的 HTTP 请求,则可以通过 WCF 侦听器适配器(例如 NetTcpActivator)管理 Web 服务,而无需运行 WWW 服务。 有关 WCF 侦听器适配器以及如何使用 WAS 在 IIS 7 及更高版本中托管 WCF 应用程序的信息,请参阅 MSDN 上的在 WCF 中托管

WAS 中的配置管理

启动时,WAS 从 ApplicationHost.config 文件中读取某些信息,并将该信息传递给服务器上的侦听器适配器。 侦听器适配器是在 WAS 和协议侦听器(如 HTTP.sys)之间建立通信的组件。 侦听器适配器收到配置信息后,配置其相关协议侦听器,并准备侦听器以侦听请求。

对于 WCF,侦听器适配器包括协议侦听器的功能。 因此,WCF 侦听器适配器(如 NetTcpActivator)会根据 WAS 中的信息进行配置。 配置 NetTcpActivator 后,它会侦听使用 net.tcp 协议的请求。 有关 WCF 侦听器适配器的详细信息,请参阅 MSDN 上的 WAS 激活体系结构

以下列表描述了 WAS 从配置中读取的信息类型:

  • 全局配置信息
  • HTTP 和非 HTTP 协议的协议配置信息
  • 应用程序池配置,例如进程帐户信息
  • 站点配置,例如绑定和应用程序
  • 应用程序配置,例如启用的协议和应用程序所属的应用程序池

如果 ApplicationHost.config 发生更改,WAS 将收到通知,并使用新信息更新侦听器适配器。

进程管理

WAS 管理 HTTP 和非 HTTP 请求的应用程序池和工作进程。 当协议侦听器选取客户端请求时,WAS 确定工作进程是否正在运行。 如果应用程序池已有正在处理请求的工作进程,则侦听器适配器会将请求传递到工作进程进行处理。 如果应用程序池中没有工作进程,WAS 将启动工作进程,以便侦听器适配器可以向其传递请求进行处理。

注意

由于 WAS 管理 HTTP 和非 HTTP 协议的进程,因此可以在同一个应用程序池中运行使用不同协议的应用程序。 例如,您可以一个应用程序(例如 XML 服务),并通过 HTTP 和 net.tcp 托管。

IIS 中的模块

IIS 提供与以前版本的 IIS 不同的新体系结构。 IIS 没有将大部分功能保留在服务器本身内,而是包含一个 Web 服务器引擎,你可以根据需要在其中添加或删除称为模块的组件。

模块是服务器用来处理请求的单独功能。 例如,IIS 使用身份验证模块对客户端凭据进行身份验证,并使用缓存模块来管理缓存活动。

与早期版本的 IIS 相比,新体系结构具有以下优势:

  • 可以控制服务器上所需的模块。
  • 可以将服务器自定义为环境中的特定角色。
  • 可以使用自定义模块替换现有模块或引入新功能。

新体系结构还改进了安全性并简化了管理。 通过删除不必要的模块,可以减少服务器的攻击面和内存占用情况,即服务器工作进程在计算机上使用的内存量。 此外,对于站点和应用程序,无需管理不必要的功能。

本机模块

以下部分介绍了完整安装 IIS 7 及更高版本后可用的本机模块。 可以根据需求将其删除或替换为自定义模块。

HTTP 模块

IIS 7 及更高版本中的多个模块在请求处理管道中执行特定于超文本传输协议 (HTTP) 的任务。 HTTP 模块包括响应客户端标头中发送的信息和查询、返回 HTTP 错误、重定向请求等的模块。

模块名 说明 资源
CustomErrorModule 为响应设置错误状态代码时,发送默认和配置的 HTTP 错误消息。 Inetsrv\Custerr.dll
HttpRedirectionModule 支持 HTTP 请求的可配置重定向。 Inetsrv\Redirect.dll
ProtocolSupportModule 执行与协议相关的操作,例如根据配置设置响应头和重定向标头。 Inetsrv\Protsup.dll
RequestFilteringModule 已在 IIS 7.5 中添加。 根据配置筛选请求,控制协议和内容行为。 Inetsrv\modrqflt.dll
WebDAVModule 已在 IIS 7.5 中添加。 允许使用基于 SSL 的 HTTP 更安全地发布内容。 Inetsrv\WebDAV.dll

安全模块

IIS 中的多个模块执行与请求处理管道中的安全相关的任务。 此外,每个身份验证方案都有单独的模块,可用于为服务器上所需的身份验证类型选择模块。 还有执行 URL 授权的模块,以及筛选请求的模块。

模块名 说明 资源
AnonymousAuthenticationModule 如果其他身份验证方法均未成功,则执行匿名身份验证。 Inetsrv\Authanon.dll
BasicAuthenticationModule 执行基本身份验证。 Inetsrv\Authbas.dll
CertificateMappingAuthenticationModule 使用 Active Directory 执行证书映射身份验证。 Inetsrv\Authcert.dll
DigestAuthenticationModule 执行摘要式身份验证。 Inetsrv\Authmd5.dll
IISCertificateMappingAuthenticationModule 使用 IIS 证书配置执行证书映射身份验证。 Inetsrv\Authmap.dll
RequestFilteringModule 执行 URLScan 任务,例如配置允许的动词和文件扩展名、设置限制以及扫描错误字符序列。 Inetsrv\Modrqflt.dll
UrlAuthorizationModule 执行 URL 授权。 Inetsrv\Urlauthz.dll
WindowsAuthenticationModule 执行 NTLM 集成身份验证。 Inetsrv\Authsspi.dll
IpRestrictionModule 限制配置中 ipSecurity 列表中列出的 IPv4 地址。 Inetsrv\iprestr.dll

内容模块

IIS 中的多个模块执行与请求处理管道中的内容相关的任务。 内容模块的用途包括处理静态文件请求、当客户端未在请求中指定资源时返回默认页面、列出目录内容等。

模块名 说明 资源
CgiModule 执行通用网关接口 (CGI) 进程以构建响应输出。 Inetsrv\Cgi.dll
DefaultDocumentModule 尝试返回对父目录发出的请求的默认文档。 Inetsrv\Defdoc.dll
DirectoryListingModule 列出目录的内容。 Inetsrv\dirlist.dll
IsapiModule 托管 ISAPI 扩展 DLL。 Inetsrv\Isapi.dll
IsapiFilterModule 支持 ISAPI 筛选器 DLL。 Inetsrv\Filter.dll
ServerSideIncludeModule 处理服务器端包含代码。 Inetsrv\Iis_ssi.dll
StaticFileModule 提供静态文件。 Inetsrv\Static.dll
FastCgiModule 支持 FastCGI,它提供了 CGI 的高性能替代方案。 Inetsrv\iisfcgi.dll

压缩模块

系统在请求处理管道中压缩 IIS 中的两个模块。

模块名 说明 资源
DynamicCompressionModule 压缩响应并将 Gzip 压缩传输编码应用于响应。 Inetsrv\Compdyn.dll
StaticCompressionModule 执行静态内容的预压缩。 Inetsrv\Compstat.dll

高速缓存模块

IIS 中的多个模块执行与请求处理管道中的高速缓存相关的任务。 高速缓存通过将已处理的信息(例如网页)存储在服务器的内存中,然后在对同一资源的后续请求中重用该信息,从而提高网站和 Web 应用程序的性能。

模块名 说明 资源
FileCacheModule 为文件和文件句柄提供用户模式高速缓存。 Inetsrv\Cachfile.dll
HTTPCacheModule 在 HTTP.sys 中提供内核模式和用户模式高速缓存。 Inetsrv\Cachhttp.dll
TokenCacheModule 为生成 Windows 用户主体的模块提供用户名和令牌对的用户模式高速缓存。 Inetsrv\Cachtokn.dll
UriCacheModule 提供 URL 信息的用户模式高速缓存。 Inetsrv\Cachuri.dll

记录和诊断模块

IIS 中的多个模块执行与请求处理管道中的记录和诊断相关的任务。 记录模块支持加载自定义模块并将信息传递到 HTTP.sys。 诊断模块在请求处理期间关注并报告事件。

模块名 说明 资源
CustomLoggingModule 加载自定义记录模块。 Inetsrv\Logcust.dll
FailedRequestsTracingModule 支持失败的请求跟踪功能。 Inetsrv\Iisfreb.dll
HttpLoggingModule 将信息和处理状态传递给 HTTP.sys 进行日志记录。 Inetsrv\Loghttp.dll
RequestMonitorModule 跟踪当前在工作进程中执行的请求,并使用运行时状态和控制应用程序编程接口 (RSCA) 报告信息。 Inetsrv\Iisreqs.dll
TracingModule 将事件报告给 Microsoft Windows 事件跟踪 (ETW)。 Inetsrv\Iisetw.dll

托管的支持模块

IIS 中的一些模块支持 IIS 请求处理管道中的托管集成。

模块名 说明 资源
ManagedEngine 提供 IIS 请求处理管道中托管代码模块的集成。 Microsoft.NET\Framework\v2.0.50727\webengine.dll
ConfigurationValidationModule 验证配置问题,例如应用程序在集成模式下运行但在 system.web 部分中声明了处理程序或模块。 Inetsrv\validcfg.dll

托管模块

除了本机模块,IIS 还允许使用托管代码模块来扩展 IIS 功能。 某些托管模块(例如 UrlAuthorization)具有本机模块对应项,可提供托管模块的本机替代方案。

注意

托管模块依赖于 ManagedEngine 模块。

下表列出了完整安装 IIS 7 及更高版本时可用的托管模块。 有关托管模块的详细信息,请参阅 MSDN 上的 .NET Framework SDK 2.0。

模块名 说明 资源
AnonymousIdentification 管理匿名标识符,这些标识符由支持匿名标识的功能(例如 ASP.NET 配置文件)使用。 System.Web.Security.AnonymousIdentificationModule
DefaultAuthentication 确保上下文中存在身份验证对象。 System.Web.Security.DefaultAuthenticationModule
FileAuthorization 验证用户是否有权访问请求的文件。 System.Web.Security.FileAuthorizationModule
FormsAuthentication 支持使用 Forms 身份验证进行身份验证。 System.Web.Security.FormsAuthenticationModule
OutputCache 支持输出高速缓存。 System.Web.Caching.OutputCacheModule
配置文件 使用 ASP.NET 配置文件管理用户配置文件,该配置文件在数据源(例如数据库)中存储和检索用户设置。 System.Web.Profile.ProfileModule
RoleManager 管理当前用户的 RolePrincipal 实例。 System.Web.Security.RoleManagerModule
会话 支持维护会话状态,这允许存储服务器上应用程序中单个客户端特定的数据。 System.Web.SessionState.SessionStateModule
UrlAuthorization 根据用户所属角色的用户名或角色列表,确定当前用户是否有权访问请求的 URL。 System.Web.Security.UrlAuthorizationModule
UrlMappingsModule 支持将实际 URL 映射到更用户友好的 URL。 System.Web.UrlMappingsModule
WindowsAuthentication 启用 Windows 身份验证时,设置 ASP.NET 应用程序的用户标识。 System.Web.Security.WindowsAuthenticationModule

IIS 中的请求处理

在 IIS 中,IIS 和 ASP.NET 请求管道组合在一起,以使用集成方法处理请求。 新的请求处理架构由本地和托管模块的有序列表组成,这些模块执行特定任务以响应请求。

此设计为早期版本的 IIS 提供了多项优势。 第一,所有文件类型都可以使用最初仅适用于托管代码的功能。 例如,现在可以对静态文件、动态服务器网页 (ASP) 文件以及站点和应用程序中的所有其他文件类型使用 ASP.NET Forms 身份验证和统一资源定位器 (URL) 授权。

第二,这种设计消除了 IIS 和 ASP.NET 中多个功能的重复。 例如,当客户端请求托管文件时,服务器调用集成管道中对应的身份验证模块来对客户端进行身份验证。 在以前版本的 IIS 中,同一请求将在 IIS 管道和 ASP.NET 管道中经历身份验证过程。

第三,可以在一个位置管理所有模块,而不是在 IIS 中管理某些功能,然后在 ASP.NET 配置中管理某些功能。 这简化了服务器上的站点和应用程序的管理。

IIS 中的应用程序池

应用程序池按进程边界分隔应用程序,以防止一个应用程序影响服务器上的另一个应用程序。 在 IIS 7 及更高版本中,应用程序池继续使用 IIS 6.0 工作进程隔离模式。 此外,现在可以指定一个设置,用于确定如何处理涉及托管资源的请求:集成模式或经典模式。

注意

在 IIS 6.0 中,工作进程隔离模式和 IIS 5.0 隔离模式是在服务器级别设置的。 这样就不可能在同一台服务器上运行这两种隔离模式。 但是,在 IIS 7 及更高版本中,集成模式和经典模式是在应用程序池级别设置的,这使你能够在同一服务器上具有不同进程模式的应用程序池中同时运行应用程序。

集成应用程序池模式

当应用程序池处于集成模式时,可以利用 IIS 和 ASP.NET 的集成请求处理体系结构。 当应用程序池中的工作进程收到请求时,系统会通过有序的事件列表传递请求。 每个事件都会调用必要的本机和托管模块来处理部分请求并生成响应。

在集成模式下运行应用程序池有几个好处。 首先是已将 IIS 和 ASP.NET 的请求处理模型集成到统一的处理模型中。 此模型消除了以前在 IIS 和 ASP.NET(例如身份验证)中重复的步骤。 此外,集成模式使所有内容类型都可以使用托管功能。

经典应用程序池模式

当应用程序池处于经典模式时,IIS 7 及更高版本以与 IIS 6.0 工作进程隔离模式相同的方式处理请求。 ASP.NET 请求首先经过 IIS 中的本机处理步骤,然后路由到 Aspnet_isapi.dll,以便在托管运行时中处理托管代码。 最后,请求通过 IIS 路由回以发送响应。

IIS 和 ASP.NET 请求处理模型的这种分离会导致部分处理步骤重复,例如身份验证和授权。 此外,托管代码功能(如 Forms 身份验证)仅适用于 ASP.NET 应用程序或符合以下要求的应用程序:使用脚本映射要由 aspnet_isapi.dll 处理的所有请求。

在将生产环境升级到 IIS 7 及更高版本并在集成模式下将应用程序分配到应用程序池之前,请务必在集成模式下测试现有应用程序的兼容性。 仅当应用程序无法在集成模式下工作时,才应在经典模式下将应用程序添加到应用程序池。 例如,应用程序可能依赖于从 IIS 传递到托管运行时的身份验证令牌,并且由于 IIS 7 及更高版本中的新体系结构,该进程会破坏应用程序。

IIS 中的 HTTP 请求处理

IIS 7 及更高版本具有与 IIS 6.0 类似的 HTTP 请求处理流。 本部分中的关系图概述了进程中的 HTTP 请求。

以下列表描述了图 1 中显示的请求处理流:

  1. 当客户端浏览器为 Web 服务器上的资源发起 HTTP 请求时,HTTP.sys 会截获请求。
  2. HTTP.sys 联系 WAS 以从配置存储中获取信息。
  3. WAS 向配置存储 applicationHost.config 请求配置信息。
  4. WWW 服务接收配置信息,例如应用程序池和站点配置。
  5. WWW 服务使用配置信息来配置 HTTP.sys。
  6. WAS 为发出请求的应用程序池启动工作进程。
  7. 工作进程处理请求并返回对 HTTP.sys 的响应。
  8. 客户端收到响应。

Diagram shows a client in Kernel Mode interacting with elements in User Mode as described above.

图 1:HTTP 请求概述

在工作进程中,系统会按照 Web 服务器核心中的几个有序步骤(称为事件)处理 HTTP 请求。 在每个事件中,本机模块都会处理部分请求,例如验证用户身份或将信息添加到事件日志中。 如果请求需要托管模块,则本机 ManagedEngine 模块会创建一个 AppDomain,托管模块可以在其中执行必要的处理,例如使用 Forms 身份验证对用户进行身份验证。 当请求通过 Web 服务器核心中的所有事件时,系统会向 HTTP.sys 返回响应。 下面的图 2 显示了进入工作进程的 HTTP 请求。

Diagram shows the Worker Process, which contains the Web Server Core, linked to the Native Modules, linked to the AppDomain.

图 2:工作进程内 HTTP 请求的详细信息