由 IIS 团队里根·坦普林
兼容性
| 版本 | 备注 |
|---|---|
| IIS 7.0 及更高版本 | 本文中介绍的功能是在 IIS 7.0 中引入的。 |
| IIS 6.0 及更早版本 | 在 IIS 7.0 之前,本文中所述的功能不受支持。 |
介绍
Internet Information Services (IIS) 7 及更高版本提供请求处理体系结构,其中包括:
- Windows 进程激活服务(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,以及万维网发布服务(WWW 服务)和 Windows 进程激活服务(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 套接字 API (Winsock),这是以前版本的 IIS 用来接收 HTTP 请求和发送 HTTP 响应的用户模式组件。 IIS 7 及更高版本继续使用 HTTP.sys 处理 HTTP 请求。
HTTP.sys 具有以下优势:
- 内核模式缓存。 不切换到用户模式即可提供缓存响应请求。
- 内核模式请求队列。 请求在上下文切换中引起的开销较少,因为内核将请求直接转发到正确的工作进程。 如果没有工作进程可以接受请求,内核模式请求队列将保留请求,直到工作进程拾取请求。
- 请求预处理和安全筛选。
万维网发布服务 (WWW 服务)
在 IIS 7 及更高版本中,以前由万维网发布服务(WWW 服务)单独处理的功能现在在两个服务之间拆分:WWW 服务和新服务 Windows 进程激活服务(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.sys 这个 HTTP 侦听器的侦听器适配器。 作为侦听器适配器,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 |
| Http重定向模块 (HttpRedirectionModule) | 支持 HTTP 请求的可配置重定向。 | Inetsrv\Redirect.dll |
| 协议支持模块 | 执行与协议相关的操作,例如根据配置设置响应标头和重定向标头。 | Inetsrv\Protsup.dll |
| RequestFilteringModule | 在 IIS 7.5 中添加。 根据配置筛选请求以控制协议和内容行为。 | Inetsrv\modrqflt.dll |
| WebDAVModule | 在 IIS 7.5 中添加。 允许使用 HTTP over SSL 更安全地发布内容。 | Inetsrv\WebDAV.dll |
安全模块
IIS 中的多个模块执行与请求处理管道中的安全性相关的任务。 此外,每个身份验证方案都有单独的模块,可用于为服务器上所需的身份验证类型选择模块。 还有执行 URL 授权的模块,以及筛选请求的模块。
| 模块名称 | 说明 | 资源 |
|---|---|---|
| AnonymousAuthenticationModule | 如果没有其他身份验证方法成功,则执行匿名身份验证。 | Inetsrv\Authanon.dll |
| BasicAuthenticationModule | 执行基本身份验证。 | Inetsrv\Authbas.dll |
| 证书映射身份验证模块 | 使用 Active Directory 执行证书映射身份验证。 | Inetsrv\Authcert.dll |
| DigestAuthenticationModule | 执行摘要式身份验证。 | Inetsrv\Authmd5.dll |
| IISCertificateMappingAuthenticationModule | 使用 IIS 证书配置执行证书映射身份验证。 | Inetsrv\Authmap.dll |
| 请求过滤模块 | 执行 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。
| 模块名称 | 说明 | 资源 |
|---|---|---|
| 匿名识别 | 管理匿名标识符,这些标识符由支持匿名标识的功能(如 ASP.NET 配置文件)使用。 | System.Web.Security.AnonymousIdentificationModule |
| 默认认证 | 确保上下文中存在身份验证对象。 | System.Web.Security.DefaultAuthenticationModule |
| 文件授权 | 验证用户是否有权访问请求的文件。 | System.Web.Security.FileAuthorizationModule |
| 基于表单的认证 | 支持使用 Forms 身份验证进行身份验证。 | System.Web.Security.FormsAuthenticationModule |
| OutputCache | 支持输出缓存。 | System.Web.Caching.OutputCacheModule |
| 个人资料 | 使用 ASP.NET 配置文件管理用户配置文件,该配置文件在数据源(如数据库)中存储和检索用户设置。 | System.Web.Profile.ProfileModule |
| 角色管理器 | 管理当前用户的 RolePrincipal 实例。 | System.Web.Security.RoleManagerModule |
| 会期 | 支持维护会话状态,这允许存储服务器上应用程序中单个客户端特定的数据。 | System.Web.SessionState.SessionStateModule |
| URL权限管理 | 根据用户所属角色的用户名或角色列表,确定当前用户是否允许访问请求的 URL。 | System.Web.Security.UrlAuthorizationModule |
| URL映射模块 | 支持将实际 URL 映射到更用户友好的 URL。 | System.Web.UrlMappingsModule |
| WindowsAuthentication | 启用 Windows 身份验证时,设置 ASP.NET 应用程序的用户标识。 | System.Web.Security.WindowsAuthenticationModule |
IIS 中的请求处理
在 IIS 中,IIS 和 ASP.NET 请求管道组合在一起,以使用集成方法处理请求。 新的请求处理体系结构包含本机和托管模块的有序列表,这些模块执行特定任务以响应请求。
此设计相较于早期版本的 IIS 提供了多项优势。 首先,所有文件类型都可以使用最初只可用于托管代码的功能。 例如,现在可以对静态文件、Active Server Pages (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 中显示的请求处理流:
- 当客户端浏览器为 Web 服务器上的资源启动 HTTP 请求时,HTTP.sys 截获请求。
- HTTP.sys 向 WAS 请求从配置存储中获取信息。
- WAS 从配置存储区请求配置信息,applicationHost.config。
- WWW 服务接收配置信息,例如应用程序池和站点配置。
- WWW 服务使用配置信息来配置 HTTP.sys。
- WAS 为发出请求的应用程序池启动工作进程。
- 工作进程处理请求,并将响应返回给 HTTP.sys。
- 客户端收到响应。
图 1:HTTP 请求概述
在工作进程中,HTTP 请求在 Web Server Core 中通过多个有序步骤(称为事件)。 在每个事件中,本机模块处理请求的一部分,例如对用户进行身份验证或向事件日志添加信息。 如果请求需要托管模块,则本机 ManagedEngine 模块将创建 AppDomain,其中托管模块可以执行必要的处理,例如使用 Forms 身份验证对用户进行身份验证。 当请求通过 Web Server Core 中的所有事件时,响应将返回到 HTTP.sys。 下图 2 显示了 HTTP 请求进入工作进程。
图 2:工作进程内 HTTP 请求的详细信息