作者:Tali Smith
介绍
Apache 超文本传输协议 (HTTP) 服务器和 Internet Information Services 是世界上最热门的 Web 服务器中的两个。 本文为熟悉 Apache 的用户提供有关 IIS 的技术信息。 本文比较了 IIS 7(及更高版本)与 Apache 的体系结构、安全模型和管理功能,还比较了常见的 IIS 和 Apache 管理方案和工具。
比较功能
IIS 采用与 Apache Web 服务器类似的模块化设计,通过可扩展的体系结构和直观的图形用户界面,使管理员能够控制。 IIS 中内置的诊断功能有助于缩短解决问题所需的时间,最大限度地缩短停机时间。
模块化体系结构
IIS 的功能分为超过 44 个单独的特性模块。 可通过服务器管理器控制台在设置 Web 服务器 (IIS) 角色期间安装这些模块。 可使用包含的 Win32® 和 Microsoft® .NET 应用程序编程接口 (API) 生成新模块,进一步扩展现有的功能。 虽然 IIS 模块取代了 Internet 服务器应用程序编程接口 (ISAPI) 筛选器和扩展,但 IIS 仍然完全支持这些筛选器和扩展。
Apache Web 服务器对 Microsoft® 语音 API (SAPI) 扩展提供有限支持,但不支持 ISAPI 筛选器。 它依赖于一个名为 Apache 可移植运行时 (APR) 的社区驱动项目,该项目用于创建和维护软件库,该库为特定于平台的基础实现提供可预测的一致接口。 APR 提供一组映射到基础操作系统的 API,从而让开发人员能够编写独立于平台的程序。
Web 服务器安全性
据安全服务提供商 Secunia 称,自 2003 年以来,IIS 6.0 共报告了 4 个安全漏洞,而同期 Apache 2.0.x 报告了 23 个安全漏洞[1]。 IIS 建立在其前身的安全基础之上,并提供了一个增强的进程模型,该模型默认在应用程序级别对资源和配置进行沙盒处理来隔离应用程序。
选择 Windows ServerÒ 2008 的核心安装选项来安装最小环境,可以进一步限制 IIS 安装的暴露区域。 核心安装将省略图形服务和大多数库,从而减少操作系统的总占用空间,同时仍保留通过 IIS 命令行实用工具 Appcmd.exe 进行本地管理以及远程管理的功能。
管理工具
初始设计 Apache 时,没有考虑到为其管理工具实现图形界面的可能性。 Apache 管理功能是通过直接在配置文件中输入条目或通过开源图形管理工具(如 TKApache 和 NetLoony)实现的。
IIS 提供一系列管理工具;可通过图形方式、命令行或手动编辑配置文件来实现管理。
诊断和故障排除
在 Apache 中,通过五个日志文件对故障进行隔离和诊断,必须手动读取每个日志文件以搜索指向特定问题的模式。
IIS 提供两种帮助诊断和故障排除的机制:
- 运行时状态和控制 API 提供有关应用程序池、工作进程、站点、应用程序域,甚至正在运行的请求的实时状态信息。 组件对象模型 (COM) API 通过 IIS Manager 控制台、新的 Appcmd.exe 命令行工具和 WindowsÒ Management Instrumentation (WMI)显示。 这些应用程序可在所选的任何管理环境中提供快速且简单的状态检查。
- 详细事件跟踪功能跟踪整个请求和响应路径中的事件,使开发人员和管理员能够通过 IIS 处理管道跟踪请求并返回到响应。 这些详细跟踪事件收集有关请求路径、请求所引发的错误以及各点所用时间的信息。
IIS 还提供一个详细且可操作的错误消息库。 该库将传统的简短错误代码替换为有关请求的详细信息、错误的可能原因以及建议的问题解决步骤。 IIS 会向浏览器和其他远程客户端发送详细的错误信息。
Web 应用程序支持
IIS 提供了一些工具,使组织能够在单个平台上管理其所有 Web 应用程序,而无需维护两个或更多独立平台,以免产生更高的基础结构成本。
IIS 中的 FastCGI 支持高性能版本的通用网关接口 (CGI)。 FastCGI 克服了标准 CCI 的性能问题,它创建的持久性进程可重复用于多个请求,而不是为每个请求创建一个新进程,然后在请求实现后将该进程丢弃。 FastCGI 还支持应用程序远程运行,从而改善负载分布。
IIS 还可与 MicrosoftÒ .NET Framework 版本 1.1 及更高版本一起运行。 通过支持经典 ASP、Microsoft® ASP.NET 和 PHP,IIS 使组织能够灵活地使用他们选择的语言编写应用程序,并在他们选择的平台上托管应用程序。
实现自定义的扩展性模型
开发人员可通过核心服务器 API 集来扩展 IIS,这样既可通过本机代码(如 C/C++)生成模块,也可通过使用 .NET Framework 的语言(如 C# 和 Microsoft® Visual Basic®)的托管代码生成模块。 IIS 还能够扩展配置、脚本、事件日志记录和管理工具功能集。
x86 和 x64 平台免费下载扩展。 这些扩展涵盖了部署、管理、请求处理、安全性、内容发布和媒体服务等一系列任务。 有关可用的 IIS 扩展,请参阅:IIS 扩展。
适用于 IIS 7 及更高版本的 FTP 发布服务
与以前的 IIS FTP 服务器版本相比,适用于 IIS 的 FTP 发布服务 (FTP 7) 提供了许多增强功能:
- 以基于 .NET XML 的 *.CONFIG 格式通过新的管理用户界面 (UI) 和配置存储,更紧密地与 IIS 集成。
- 支持安全套接字层 (SSL) 的文件传输协议 (FTP),并支持使用非 WindowsÒ 帐户进行身份验证。 新的 FTP 服务还支持其他 Internet 改进,例如 UTF8 和 IPv6。
- 通过与 IIS 完全集成而实现的共享托管改进。 通过这些改进,FTP 7 只需将 FTP 绑定添加到现有网站即可托管同一站点中的 FTP 和 Web 内容。 此外,FTP 服务现在支持虚拟主机名,使用户能够在同一 IP 地址上托管多个 FTP 站点。
- 改进了日志记录和可支持性功能,包括增强了以下项的日志记录:所有 FTP 相关流量、FTP 会话的唯一跟踪、FTP 子状态以及 FTP 日志中的更多详细信息字段。
集成请求管道
在以前的 IIS 版本中,ASP.NET 作为 IIS ISAPI 扩展实现,无法看到对非 ASP.NET 内容(如 ASP 页面或静态文件)的请求。
在 IIS 中,请求管道的布局提供了更多机会来影响请求处理方式。 IIS 处理对任何内容类型的请求,这使 ASP.NET 模块提供的服务(如窗体身份验证或输出缓存)可用于请求 ASP 页面、PHP 页面或静态文件。
IIS 7 及更高版本的配置和管理
在 Apache 的 Httpd.config 文件中,配置以指令项开头。
这种方法与 IIS 配置类似,其中大多数设置可通过 Web.config 文件在本地配置,或通过 ApplicationHost.config 文件在全局配置。 IIS 提供了几种编辑 .config 文件的方法。 这些方法包括:
- 通过 IIS Manager 控制台以图形方式编辑。
- 使用 Appcmd.exe 以及 set config / commit argument/ 从命令提示符编辑。
- 使用 Application 类在 Windows Management Instrumentation 脚本中编辑。
- 手动编辑配置文件,这些文件基于以明文 XML 编写的强类型架构。 可使用 Microsoft® Visual Web Developer 2005 Express Edition 在整洁的代码编辑器环境中编辑 IIS 配置文件。
有关完整的 Appcmd.exe 使用选项,请参阅此处。
使用模块来控制和自定义 IIS
IIS 中的模块可控制和自定义其功能,从而提高服务器平台的灵活性和效率。 默认情况下,这些模块是存储在 %WINDIR%\System32\inetsrv\
文件夹中的动态链接库 (DLL) 文件。 它们可分为两类,如下所示。
- 本机。 本机模块可以不受限制地访问服务器工作进程可用的任何资源,就像以前版本中的 ISAPI 筛选器或扩展一样。
- 托管的。 可为每个站点或应用程序单独配置托管模块。 只有在特定站点或应用程序需要时,才会加载这些模块进行处理。
HTTP 模块
在请求处理管道中,有几个 IIS 模块执行特定于 HTTP 的任务。 其中包括响应客户端标头中发送的信息和查询的模块、返回 HTTP 错误的模块以及重定向请求的模块。
Apache 模块 | IIS 等效项 | 说明 | 资源 |
---|---|---|---|
核心功能:ErrorDocument 指令 | CustomErrorModule | 为响应设置错误状态代码时,发送默认和配置的 HTTP 错误消息。 | Inetsrv\Custerr.dll |
mod_alias | HttpRedirectionModule | 支持 HTTP 请求的可配置重定向。 | Inetsrv\Redirect.dll |
mod_headers | ProtocolSupportModule | 执行与协议相关的操作,例如根据配置来设置响应和重定向标头。 | Inetsrv\Protsup.dll |
安全模块
在请求处理管道中,有几个 IIS 模块执行安全任务。 此外,每个身份验证方案都有单独的模块,可根据服务器上所需的身份验证类型选择模块。 其他模块执行 URL 授权和筛选请求。
内容模块
在请求处理管道中,有几个 IIS 模块执行与内容相关的任务。 内容模块处理静态文件请求、当客户端未在请求中指定资源时返回默认页面、列出目录内容等。
压缩模块
在请求处理管道中,有两个 IIS 模块执行压缩。
Apache 模块 | IIS 等效项 | 说明 | 资源 |
---|---|---|---|
mod_gzip | DynamicCompression- Module | 压缩响应并将 GZIP 压缩传输编码应用于响应。 | Inetsrv\Compdyn.dll |
mod_gzip | StaticCompression- Module | 执行静态内容的预压缩。 | Inetsrv\Compstat.dll |
缓存模块
在请求处理管道中,有几个 IIS 模块执行与缓存相关的任务。 缓存可将处理的信息(如网页)存储在服务器内存中,然后在对同一资源的后续请求中重用该信息,从而提升网站和 Web 应用程序的性能。
日志记录和诊断模块
在请求处理管道中,有几个 IIS 模块执行与日志记录和诊断相关的任务。 日志记录模块支持加载自定义模块并将信息传递给 HTTP.sys。 诊断模块在请求处理期间跟踪并报告事件。
Apache 模块 | IIS 等效项 | 说明 | 资源 |
---|---|---|---|
mod_log_config | CustomLoggingModule | 加载自定义记录模块。 | Inetsrv\Logcust.dll |
不支持 | FailedRequests- TracingModule | 支持“失败请求跟踪”功能。 | Inetsrv\Iisfreb.dll |
mod_log_config | HttpLoggingModule | 将信息和处理状态传递给 HTTP.sys 进行日志记录。 | Inetsrv\Loghttp.dll |
mod_dtrace | RequestMonitorModule | 跟踪当前在工作进程中执行的请求,并使用运行时状态和控制应用程序编程接口报告信息。 | Inetsrv\Iisreqs.dll |
mod_log_config | TracingModule | 将事件报告给 WindowsÒ 事件跟踪 (ETW)。 | Inetsrv\Iisetw.dll |
托管的支持模块
在 IIS 请求处理管道中,有两个 IIS 模块支持托管集成。
Apache 模块 | IIS 等效项 | 说明 | 资源 |
---|---|---|---|
不支持 | ManagedEngine | 将托管代码模块集成到 IIS 请求处理管道中。 | Microsoft.NET\Framework\v2.0.50727\webengine.dll |
第三方 | ConfigurationValidationModule | 验证配置问题(例如应用程序在集成模式下运行,但在 system.web 部分中声明了处理程序或模块)。 | Inetsrv\validcfg.dll |
托管模块
除了本机模块,IIS 还支持使用托管代码模块来扩展 IIS 功能。 某些托管模块(如 UrlAuthorization)具有本机模块对应项,可提供托管模块的本机替代方案。
分布式配置模型
IIS 中的新配置系统会缓存配置文件(如 Apache 中的 .htaccess 文件),但占用的内存要少得多。 此外,可通过多种方式配置 IIS 以利用全局或更精细的配置更改。
IIS 使用提供 ASP.NET 集成的配置方案,包括共享配置和 HTTP 运行时支持。 基于 XML 的配置模型使用配置文本文件来保存配置设置,并且此类文件可以单独的 XML 文件形式存储在文件夹中。
IIS 使用三个主要 XML 文件来维护服务器部署:
- Machine.config 保存服务器的 .NET Framework 设置。 这些设置由所有其他 .NET Framework 配置文件继承,默认位于
%windir%\Microsoft.net\Framework\<*framework\_version*>\Config\Machine.config
。 - ApplicationHost.config 文件包含 IIS 及其服务的设置。 默认情况下,该文件位于
%windir%\System32\inetsrv\config\applicationHost.config
。 - 根 Web.config 文件保存 ASP.NET Web 应用程序的全局设置,位于
%windir%\Microsoft.NET\Framework\<*framework\_version*>\Config\Root Web.config
。 此文件为每个应用程序提供一个替代全局设置的 Web.config 文件,并支持 IIS 配置设置存储在这些 Web.config 文件中,从而使在多个 Web 服务器之间复制应用程序变得更加容易,并避免成本高昂且容易出错的复制、手动同步和其他配置任务。
使用 IIS 7 及更高版本进行管理
IIS 可用于执行 Apache 上执行的相同管理任务。
自定义错误消息
对于每个标准 HTTP 错误 403、404 和 504,系统都会向浏览器返回一条消息。 不同的 Web 服务器支持管理员针对每个错误返回默认错误消息、特定网页或网页形式的文件。
- 在 Apache 中,自定义错误消息是使用 .htaccess 文件完成的,管理员可使用该文件操纵服务器行为并创建自定义服务器错误消息。 此类错误的示例包括链接断开时出现的“404 找不到”错误,以及脚本失败时出现的“500 内部服务器错误”。 .htaccess 文件告知服务器在出现错误时显示特殊页面。
- IIS 还支持管理员返回特殊页面,而不是网站错误的默认页面。 例如,不显示“404 找不到文件”消息,而是显示一条列出可选链接以及公司抬头和致歉说明的消息。
默认情况下,IIS 在出现问题时返回两种类型的错误。 第一种类型是标准自定义错误,包括简短错误说明和错误代码。 第二种类型的错误是详细错误,默认只返回 localhost 发出的请求。 IIS 可配置为始终返回详细错误,特别是当应用程序需要在调试模式下运行时,也可配置为永不返回详细错误,而是始终返回自定义错误。
URL 重写
URL 重写是修改 Web URL 外观的一种方法。 Web 应用程序用户更喜欢简短整洁的 URL,而不是原始查询字符串参数。 简洁的 URL 方便记忆,并且键入时更加省时。 如果 URL 能与页面内容明确相关,那么出现错误的可能性便能大大降低。
- 对于 URL 重写,Apache 提供了一个知名模块,名为 mod_rewrite。 本模块提供基于规则的重写引擎,可即时重写请求的 URL。 mod_rewrite 模块的启用方法是在 Apache.conf 文件中删除 # 并重启 Apache。 然后可在任何特定目录中的 .htaccess 文件中定义重写规则。
- IIS 现在提供 URL 重写模块(请参阅 URL 重写模块)。
Web 缓存
Web 缓存是 Web 对象(如 HTML 文档)的临时存储,供以后检索。 Web 缓存有三大优点:减少带宽消耗,因为需要通过网络的请求和响应变少;减少服务器负载,因为服务器需要处理的请求变少;降低延迟,因为缓存请求的响应会立即提供且离正在处理的客户端更近。 这些优点加在一起,使 Web 成本降低,性能提升。
缓存可由客户端应用程序执行,并且内置于大多数 Web 浏览器中。 许多产品扩展或替换了内置缓存,使系统具有更大存储空间、更多功能或更好的性能。 缓存还可作为代理的一部分在客户端和服务器之间实现。 代理缓存通常位于网关附近,以减少昂贵的专用 Internet 连接所需的带宽。 最后,缓存可直接放置在特定服务器前面,以减少服务器必须处理的请求数。
- 在 Apache 2.0 和 2.2 中,缓存通常依赖于三个模块:mod_cache、mod_disk_cache 和 mod_mem_cache。 配置缓存的命令必须在主服务器配置文件中定义,而不是在 .htaccess 文件中定义。 缓存技术在没有服务器管理员访问权限的情况下无法使用,最适合用于应缓存并以静态内容提供的动态内容。 Apache 就是这样强制将动态内容缓存一段时间,否则这些内容每次都会在再次命中数据库之前以动态方式提供。
- IIS 输出缓存是一项新功能,可将整个响应缓存在内存中,甚至是动态内容的响应,并支持网站所有者和开发人员配置输出缓存,以允许基于查询字符串值缓存响应的单独副本。
输出缓存还与 HTTP.sys 内核缓存集成,有助于提升性能。 内核缓存默认未锁定。 开发人员可在其应用程序中配置缓存配置文件来利用此功能。 可执行命令行工具来显示 HTTP.sys 缓存中的内容。 可配置基于响应头的规则以缓存站点或应用程序中不同版本的内容。
Web 输出压缩
虽然网页压缩不是一项新技术,但最近在 IT 管理员和经理中很受欢迎,因为它几乎立即能产生投资回报率 (ROI)。
- Apache 提供的 Web 输出压缩解决方案是 mod_gzip。在该解决方案中,配置的文件类型在经过 Apache 其他模块处理后,使用 GZIP 编码进行压缩,然后再发送到客户端。 当收到客户端的请求时,Apache 会注意是否发送了“Accept-Encoding”HTTP 请求头,从而确定是否应调用 mod_gzip。 如果客户端发送了该头,当所有配置的文件类型发送到客户端时,mod_gzip 会对它们的输出进行压缩。
- IIS 改进了 GZIP 编码并简化了对其的支持,提供现成可用的 Web 压缩。 压缩在位于
C:\Windows\System32\inetsrv\config\applicationhost.config
的 ApplicationHost.config 文件中配置。 压缩模块使 IIS 能够向支持压缩的客户端提供压缩响应。 可以接受压缩响应的客户端将发送 Accept-Encoding 头(指示可处理的压缩方案)。 如果 IIS 可以使用其中一种压缩方案压缩响应,它会发送一个包含 Content-Encoding 响应头(指示用于压缩响应的方案)的压缩响应。
诊断和故障排除
为了高效管理 Web 服务器,有必要获取有关服务器活动和性能以及可能发生的任何问题的反馈。
Apache
Apache HTTP 服务器提供全面且灵活的日志记录功能:
错误日志。 服务器错误日志(其名称和位置由 ErrorLog 指令设置)是最重要的日志文件。 这是 Apache Httpd 发送诊断信息并记录请求处理过程中遇到的任何错误的位置。 当服务器启动或运行出现问题时,首先要查看的就是这个位置,因为其中通常包含问题以及修复方法的详细信息。
错误日志中可能会出现各种不同消息。 错误日志还包含 CGI 脚本的调试输出。 CGI 脚本写入 stderr 的任何信息都将直接复制到错误日志中。
不可通过添加或删除信息来自定义错误日志。 但是,处理特定请求的错误日志条目在访问日志中具有相应的条目。 还可以自定义访问日志以提供更多信息。
访问日志。 在 Apache 中,服务器访问日志记录服务器处理的所有请求。 CustomLog 指令控制访问日志的位置和内容。 LogFormat 指令可用于简化日志内容的选择。 各种版本的 Apache Httpd 使用不同的模块和指令来控制访问日志记录,包括 mod_log_config、mod_log_referer、mod_log_agent 和
TransferLog
指令。脚本日志。 为了帮助调试,ScriptLog 指令允许记录 CGI 脚本的输入和输出。 这只能在测试期间使用,不能用于实时服务器。
重写日志。 使用强大而复杂的 mod_rewrite 功能时,几乎总是需要使用 RewriteLog 来帮助调试。 此日志文件详细分析重写引擎如何转换请求。 RewriteLogLevel 指令控制详细程度。
IIS 7 及更高版本
IIS 包含有助于诊断和故障排除的重大改进,帮助开发人员和管理员更轻松地处理出错的网站和应用程序。 以下是 IIS 中的诊断和故障排除工具的改进:
- 管理员可查看服务器上当前运行的所有请求。
- 提供详细的本地服务器错误日志。
- 提供详细的跟踪日志,以便跟踪问题并获取有关跟踪事件的详细信息。
- 新增了运行时状态和控制 API (RSCA) 来提供有关应用程序池、工作进程、站点、应用程序域以及正在运行的请求的实时状态信息(通过本机组件对象模型 [COM] API 和 Appcmd.exe 提供实时状态信息)。
- 可配置为自动捕获完整跟踪日志。
- 包含可让 IT 人员在 IIS Manager 中查找问题并进行故障排除的工具。
保护 Web 服务器
Apache
Apache 管理员通常使用以下方法保护其配置:
应用安全修补程序。
隐藏 Apache 版本号和其他敏感信息。
确保 Apache 在自己的用户帐户和组下运行。
确保不提供 Web 根目录之外的文件。
关闭目录浏览。
关闭 CGI 执行。
运行 mod_security,这是为应用多种不同安全配置而编写的模块:
- 筛选(基于简单表达式和正则表达式)
- 编码验证(URL 和 Unicode)
- 审核
- 上传内存限制
- 服务器标识掩码等
IIS 7 及更高版本
请求筛选已集成到 IIS 中。 有关该模块的详细信息和完整选项集,请参阅此处。
用于 IIS 的动态 IP 限制是一个模块,提供针对 Web 服务器和网站上拒绝服务攻击和暴力攻击的保护。 这种保护的实现方式是暂时阻止并发请求数异常高或短时间内发出大量请求的 HTTP 客户端的 IP 地址。 有关安装和使用此模块的详细说明,请参阅此处。
注意
本文基于以下白皮书:面向 Apache 管理员的 IIS 7.0 (https://download.microsoft.com/download/2/D/8/2D863347-3AFF-48A6-9FCF-EC6554C18DCF/IIS_7_for_Apache.doc
)。