by 塔利·史密斯
介绍
您可以采取各种步骤来优化 Windows Server 2008 R2 或 Windows Server 2008、IIS 7 及更高版本以及 Web 工作负载和 PHP 应用程序的 FastCGI 性能。这些过程通常可以通过在命令行窗口中运行 Appcmd.exe 命令并直接编辑配置文件或通过编写 Windows® Management Instrumentation (WMI) 脚本从 UI 执行。
确保FastCGI始终在本机PHP回收开始之前回收php-cgi.exe进程。FastCGI 进程回收行为由配置属性 instanceMaxRequests 控制。此属性指定 FastCGI 进程在回收之前将处理的请求数。PHP 也具有类似的进程回收功能,由环境变量 PHP_FCGI_MAX_REQUESTS 控制。通过将 instanceMaxRequests 设置为更小或等于 PHP_FCGI_MAX_REQUESTS,您可以确保原生 PHP 进程回收逻辑永远不会启动。
可以使用 IIS 管理器或使用命令行工具 AppCmd 配置 FastCGI 设置。
使用 IIS 管理器
-
若要使用 IIS 管理器配置 FastCGI 回收设置,您需要安装 IIS 管理包,然后在服务器级别选择“FastCGI 设置”。
图 1 IIS 管理器,FastCGI 设置
-
接下来,选择要配置的 FastCGI 应用程序,然后单击右侧“操作”窗格中的“编辑”。
图2 FastCGI设置界面
-
在“编辑 FastCGI 应用程序”对话框中,将“InstanceMaxRequest”设置为“10000”,然后单击“EnvironmentVariables”设置旁边的浏览按钮。
图 3 “编辑 FastCGI 应用程序”对话框
-
添加 PHP_FCGI_MAX_REQUESTS 环境变量并将其值设置为 10000。
注意
如果未配置这些设置,则使用以下默认设置:InstanceMaxRequests 为 200,PHP_FCGI_MAX_REQUESTS为 500(在大多数 PHP 构建中)。
图 4 环境变量集合编辑器
使用命令行
要通过 appcmd 配置 FastCGI 和 PHP 的回收行为,请使用以下命令:
C:\>%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /[fullPath='c:\{php_folder}\php-cgi.exe'].instanceMaxRequests:10000
C:\>%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/fastCgi /+"[fullPath='C:\{php_folder}\php-cgi.exe'].environmentVariables.[name='PHP_FCGI_MAX_REQUESTS'
禁用不需要的服务和进程
如果运行 Windows Server 2008 R2 或 Windows Server 2008 的服务器将是专用的 Web 服务器,则可以采取各种步骤来优化 Web 工作负载的性能。请注意,可以从 UI 或命令行轻松快速地执行这些过程。
请确保未安装 Windows Server 2008 安装中任何不需要的角色和功能。删除进程,例如:
- Microsoft Find Fast 和其他搜索索引服务。
- 三维 (3-D) 屏幕保护程序(可能会占用 CPU 资源)。
- 未使用的网络协议。
- 不需要的邮件服务器。
- 未使用的防病毒扫描程序以及用于鼠标和红外端口的硬件驱动程序。
若要使用 UI,请单击“开始”,单击“服务”,然后向下滚动到要禁用的服务,然后单击“属性”。单击“启动类型”下的箭头,然后单击“禁用”。
注意
禁用每个服务后,测试 Web 服务器是否正确运行,以确保没有禁用要继续使用的服务。此外,请注意依赖于要停止的服务的任何服务。
Windows Server 2008 中还有基于命令行的管理。当用户必须添加/删除服务器角色或其他软件时,早期版本的 Windows 几乎没有提供依赖项检查(如果有的话)。Windows Server 2008 中的简单命令可以为服务器管理员提供将添加或删除的组件列表。服务器管理器命令还提供了一种机制,用于执行服务器角色和功能的无人参与安装。可以选择安装单个角色或功能,也可以通过 XML 应答文件合并安装多个角色/功能。现在,您可以轻松地收集有关任何给定服务器的已安装角色和/或功能的信息,并将这些结果导出到 XML 以供记录。还可以确定哪些服务器组件将受到服务器角色或功能的安装或删除的影响。
若要优化 Windows Server 2008 或 Windows Server 2008 R2 性能,您可以:
- 在工作内存中运行 IIS 可分页代码,以最大限度地提高数据吞吐量。
- 将 IIS 进程 (Inetinfo.exe) 作为后台服务运行。
- 禁用 IIS 日志记录。
最小化 IIS 日志记录
除非需要,否则禁用网站、虚拟目录、文件和文件夹的日志记录。您可以使用 UI 或命令行。当日志记录打开时,服务器上会不断追加文本文件,详细说明有关网站的所有内容。但是,如果您正在监控带宽,这是必要的;定期打开日志记录以密切关注站点及其使用的带宽,然后在所有其他时间关闭日志记录。通常不需要永久保持登录状态,除非您确实想持续监控带宽。
若要使用 UI,请打开 IIS 管理器并导航到要管理的级别。在“功能视图”中,双击“日志记录”。在“日志记录”页上的“操作”窗格中,单击“禁用”以禁用日志记录。
若要使用命令行禁用日志记录,请使用以下语法:
C:\windows\system32\inetsrv>appcmd set config /section:httpLogging /dontLog:True
启用带宽限制
随着提供媒体内容的网站数量不断增加,许多企业的带宽成本可能非常高。此外,由于发送到客户端的媒体内容从未真正使用过,因此浪费了很大一部分媒体带宽。浏览视频网站的用户通常会在进入下一个视频或离开页面之前只观看视频的一部分。但是,使用渐进式下载来传送视频的 Web 服务器发送的数据通常比这几秒钟的播放时间所需的数据多得多。其中大部分数据从未被使用过。
例如,如果您的视频平均只有 5 秒的观看时间,但在这 30 秒内提供(缓冲)了 5 秒的视频数据,那么您可能会浪费超过 80% 的带宽。
使用比特率限制模块
IIS 包括一个比特率限制模块,该模块可自动检测最流行的视频类型的编码速率。您可以控制要预发送到客户端的数据量,以消除初始缓冲延迟(快速启动),以及要以编码速率的百分比传送内容。您还可以配置许多其他选项,例如最大带宽和并发连接数,并以编程方式控制模块。
图5 带宽限流
限制与站点的连接数
还可以限制单个网站可用的连接数。
- 在 IIS 管理器中,展开 Web 服务器,然后单击以选择该网站。
- 单击“操作”窗格中的“限制...”
- 选中“限制连接数”框
- 输入要允许的连接数。请注意,每个连接的客户端大约使用四个并发连接。
- 单击“确定”。
启用 CPU 监控
您还可以启用 CPU 监视来监视和自动关闭消耗大量 CPU 时间的工作进程。
- 在 IIS 管理器中,展开 Web 服务器并选择一个应用程序池。
- 单击“操作”选项卡中的“高级设置”。
- 在“CPU”部分的“限制”框中,键入所需的值。
- 单击“确定”。
使用 HTTP Keep-Alives
HTTP 保持活动响应标头通过在对服务器的多个请求中保持客户端/服务器连接处于打开状态来提高 Web 服务器性能。当客户端对网页内容发出多个请求时,打开的连接可提高性能,因为服务器可以更快地返回每个请求的内容。否则,服务器必须为每个请求打开一个新连接。默认情况下,在 IIS 中启用 HTTP 保持活动响应标头。
- 从 IIS 管理器中,导航到要管理的级别。
- 在“功能视图”中,双击“HTTP 响应标头”。
- 在“HTTP 响应标头”页上的“操作”窗格中,单击“设置通用标头”。
- 在“设置通用 HTTP 响应标头”对话框中,选中“启用 HTTP 保持活动状态”复选框,然后单击“确定”。
若要从命令行启用 HTTP keep-alive 标头,请使用以下语法:
C:\Windows\System32\inetsrv>appcmd set config /section:httpProtocol /allowKeepAlive:true | false
使用 HTTP 压缩
减少提供应用程序响应所需的带宽的最有效方法之一是使用 HTTP 压缩。这可以大大减少响应的大小,当应用于易于压缩的文本内容(如 HTML)时,通常会减少 10 倍。由于压缩基于 HTTP 1.1 协议中定义的内容编码协商,因此启用它对于不支持压缩的客户端来说是安全的 - 这些客户端只接收内容的未压缩版本。
IIS 提供两种压缩功能:
静态压缩会预先压缩静态内容并将其保存在磁盘上,从而允许将来的请求直接提供压缩内容,而不会产生压缩开销。动态压缩实时压缩响应,因此可以对应用程序生成的响应进行压缩。IIS 上的任何应用程序框架都可以利用动态压缩,包括 ASP、ASP.NET 或 PHP。
动态压缩通常不会产生令人望而却步的 CPU 开销。事实上,在繁忙的服务器上,动态压缩通常会导致不到总 CPU 使用率的 5%。动态压缩可以在一定程度上自由部署,以便为任何应用程序工作负载节省最大的带宽。
您可以通过配置压缩强度来进一步优化压缩开销,以实现所需的压缩与 CPU 开销之比。
可以使用 UI、在命令行窗口中运行 Appcmd.exe 命令、直接编辑配置文件或编写 WMI 脚本来配置 HTTP 压缩。
例如,若要从命令行启用动态内容压缩,请键入以下命令并按 Enter:
C:\Windows\System32\inetsrv>appcmd set config /section:urlCompression /doDynamicCompression:True
若要从 UI 中对特定站点启用压缩,请选择该站点,然后从“工作”窗格中选择“压缩管理工具”。选择是要压缩静态内容、动态内容,还是同时压缩两者。
图6 HTTP压缩
此功能可保护应用程序和静态图像文件,并且适用于接收许多请求的公共 Web 服务器上的网站或应用程序。此身份验证模式允许您在应用程序级别管理客户端注册和身份验证,而不是依赖于操作系统提供的身份验证机制。您可以使用内置成员资格数据库或自定义成员资格提供程序。
过去,人们通常会自己保护应用程序页面,并将图像和媒体内容开放给公众访问。除非通过自定义处理程序提供静态内容,否则将相同的基于 Internet 的身份验证方案扩展到静态内容并不容易。即使这不是一个完美的解决方案,因为您经常会失去性能和静态内容功能,例如静态压缩和远程请求支持。
使用 IIS,您可以为整个网站配置一次 Forms 身份验证和 URL 授权规则,并且您知道您的 ASPX 页、PHP 脚本、HTML 文件和媒体内容受到保护,不会受到未经授权的访问。
可以通过使用 UI、在命令行窗口中运行 Appcmd.exe、直接编辑配置文件或编写 WMI 脚本来启用窗体身份验证。
-
从 IIS 管理器中,导航到要管理的级别。
-
在“功能视图”中,双击“身份验证”。
-
在“身份验证”页上,选择“窗体身份验证”。
-
在“操作”窗格中,单击“启用”以使用具有默认设置的 Forms 身份验证。
图 7 Forms 身份验证
若要从命令行启用或禁用 Forms 身份验证,请使用以下语法:
C:\Windows\System32\inetsrv>appcmd set config /commit:WEBROOT /section:system.web/authentication /mode: None | Windows | Passport | Forms
使用 PowerShell 提供程序管理 IIS 7.0 及更高版本
IIS PowerShell 提供程序是一个 Windows PowerShell 管理单元,可用于管理 IIS 配置和运行时数据。它允许轻松访问网站、应用程序池、Web 应用程序、虚拟目录、正在进行的请求、工作进程和工作进程中的 .NET 应用程序域。
Microsoft Windows PowerShell 命令行 shell 和脚本语言可帮助 IT 专业人员实现更好的控制和工作效率。Windows PowerShell 使用新的以管理员为中心的脚本语言、130 多个标准命令行工具以及一致的语法和实用工具,使 IT 专业人员能够更轻松地控制系统管理并加速自动化。Windows PowerShell 建立在 .NET 公共语言运行时 (CLR) 和 .NET Framework 之上,接受并返回 .NET 对象。
图 8 显示了如何使用 PowerShell 提供程序创建新的 IIS 应用程序。
图 8 PowerShell 管理控制台
IIS PowerShell 提供程序允许你:
- 创建网站、Web 应用程序、虚拟目录和应用程序池。
- 更改网站、Web 应用程序、虚拟目录和应用程序池的简单配置属性。
- 添加和更改复杂的配置设置。
- 查询运行时数据(网站状态、应用程序池状态、当前正在执行的请求)。
- 执行高级配置任务、脚本编写以及与其他 PowerShell 管理单元和功能的集成。
- 搜索和发现配置设置。
例如,可以从 PowerShell 提供程序创建新的应用程序池。这只需要指定名称。
PS IIS:\> new-item AppPools\DemoAppPool
Name State
---- -----
DemoAppPool
有关详细信息,请参阅文章“使用 IIS 7.0 及更高版本的 PowerShell 管理单元管理 IIS”。
扩展 IIS 7 及更高版本
IIS 体系结构设计为可从上到下进行扩展,允许您将内置功能集的任何部分替换为适合您需求的自定义实现。因此,IIS 不是提供插件点的拼凑,而是在公共扩展性模型之上实现其自己的所有功能。这种设计贯穿整个平台,从模块化 Web 服务器引擎本身到配置系统,再到 IIS 管理器控制台。
通常,所需的 Web 工作负载需要其他功能,这些功能可能不是内置 IIS 功能集的一部分。或者,在某些情况下,应用程序可能需要一组自定义的功能,而内置功能不够灵活。由于所有 IIS 功能都是基于公共扩展性 API 构建的,因此你可以将其中任何一个替换为最适合你需求的自定义实现。
扩展 IIS 管理器
开发人员可以通过为其自定义组件提供 UI 并以与任何现成的 IIS 组件相同的方式将该 UI 完全集成到 IIS 管理器中来扩展 IIS 管理器。通过使用 IIS 管理器扩展性,API 开发人员可以免费利用其组件的远程管理功能。
IIS 管理器具有内置的远程管理功能。在 IIS 管理器和远程服务器之间使用 HTTPS,此功能包括在 IIS 管理器中定义受信任用户并将标识安全地存储在 IIS 配置、Windows 安全帐户管理器 (SAM) 或 Active Directory 或 .NET 提供程序中。
与同样支持远程管理的其他工具不同,IIS 管理器远程管理体系结构具有几个关键优势。首先,它允许非服务器上管理员的用户管理他们有权控制的站点和应用程序。其次,IIS 管理器远程处理机制使用 HTTPS,而不是 DCOM,后者更容易通过公司防火墙公开。总之,这两项功能使 IIS 管理器对 IIS 网站的委派远程管理具有吸引力,尤其是在共享的 Web 宿主环境中。
IIS 管理器提供了一个可扩展的体系结构,大多数内置 IIS 管理器功能都基于该体系结构。为了便于远程管理方案,每个管理功能都由两部分组成:在 IIS 管理器中提供 UI 体验的客户端组件,以及提供实际管理服务的服务器端组件。服务器端服务在本地管理方案的 IIS 管理器中加载,在远程管理方案中加载到 Web 管理服务中。在后一种情况下,IIS 管理器处理客户端计算机上 IIS 管理器中的组件与目标服务器计算机上在 WmSvc 中运行的服务之间的所需通信。
扩展配置架构
扩展配置架构有助于管理应用程序。您可以自动将应用程序脚本部署到虚拟目录,或配置用于授权用户进行标题编辑的角色,无论是在系统范围内还是针对每个网站或应用程序。扩展架构涉及在计算机上的目录中添加一个简单的 .xml 文件。IIS_schema.xml 文件已存在于此目录中,可以用作设置自己的架构的示例。创建一个名为 CUSTOM_schema.xml 的文件并对其进行设置,然后在 applicationHost.config 中注册该部分。这涉及在 applicationHost.config 中仅添加一行。%SystemRoot%\system32\inetsrv\config\schema
使用非线程安全的 PHP 构建
最佳做法是将非线程安全的 PHP 版本与 IIS FastCGI 一起使用,该版本在 PHP 5.2.1 或更高版本中可用。每个 PHP 版本有两个版本。一个是线程安全的,另一个不是,称为非线程安全 (NTS) 版本。线程安全版本是为 Web 服务器核心可以将 PHP 引擎保留在内存中的环境而设计的,同时对不同的 Web 请求运行多个执行步骤。IIS 的体系结构和 FastCGI 扩展提供了一个隔离模型,该模型将请求分开,从而消除了对线程安全版本的需求。NTS 没有任何允许 PHP 管理多个线程的代码。因此,与 tread 安全版本相比,使用 NTS 版本时,IIS 的性能将有所提高。
IIS一直支持PHP,但在某种程度上,许多实际的PHP应用程序无法托管在生产环境中。这是由于 IIS 为运行 PHP 应用程序提供的两种方式存在局限性:使用通用网关接口 (CGI) 协议或使用 PHP ISAPI 扩展。
由于 CGI 需要对每个请求进行单独的处理,因此使用 CGI 托管的应用在 Windows 上的性能会很差。相反,使用 IIS 高性能多线程 ISAPI 接口的 PHP 应用程序通常会由于某些流行的 PHP 扩展中缺乏线程安全性而出现不稳定问题。
为了解决这些问题,IIS 团队开发了 FastCGI 组件。开放的 FastCGI 协议允许 PHP 和许多其他需要单线程环境的应用程序框架(包括 Ruby on Rails、Perl 和 Python)在 IIS 上更可靠地运行。与标准 CGI 实现不同,FastCGI 通过维护一个工作进程池来实现进程重用,每个进程一次处理不超过一个请求,从而大大提高了性能。FastCGI 还受益于以社区为中心的开发和测试模型。
设置默认文档
IIS 使用名为 web.config 的配置文件。此文件可以放置在应用程序内的任何位置,并用于包含影响该目录及其下目录的 Web 服务器指令。许多应用程序当前分发文件 .htaccess,它提供了一组类似的功能。可以使用 web.config 文件标识应用程序的默认文档,如下所示:
<configuration>
<system.webServer>
<defaultDocument>
<files>
<remove value="index.php" />
<add value="index.php" />
</files>
</defaultDocument>
</system.webServer>
</configuration>
在此示例中,粗体删除条目是必需的。如果 Index.php 有以前的定义,这将删除它并将新定义放在默认文档列表的顶部。如果没有上一个,则删除将被忽略。
使用 URL 重写器模块
IIS 包括一个 URL 重写器模块,该模块包含一个完整的、基于表达式的引擎,用于重写规则。这些规则可以手动配置,也可以使用 IIS 管理器进行配置。URL 重写器模块可以导入和转换mod_rewrite规则。
下面的代码显示了一个典型的简单重写规则,该规则将传入 http.example.com 的所有请求转换为 。http://www.example.com
<configuration>
<system.webServer>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_HOST}" pattern="^example\.com$" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="http://www.example.com/{R:1}" />
</rule>
</rules>
</system.webServer>
</configuration>
使用请求筛选模块
IIS 使用“请求筛选”模块根据指定的条件限制浏览器对文件或目录的访问。URL 过滤模块是一个强大的引擎,用于保护对各种 URL 和请求的访问。
如何使用请求筛选来阻止对某些类型的文件(如包含文件或日志文件)的访问的示例如下:
<configuration>
<system.webServer>
<security>
<requestFiltering>
<denyUrlSequences>
<add sequence=".inc"/>
<add sequence=".log"/>
</denyUrlSequences>
</requestFiltering>
</security>
</system.webServer>
</configuration>
IIS 6.0 和 5.1
早期版本的 IIS 没有 URL 重写器模块。该模块的主要用途之一是限制对某些文件和/或目录的访问。对于较旧版本的 IIS,可以提供类似的保护。