配置 IIS 7 输出缓存
作者:Tali Smith
Internet Information Services (IIS) 包含一个输出缓存功能,该功能可以在内存中缓存动态 PHP 内容(或 Microsoft® ASP.NET 或经典 ASP 或其他动态页面的输出)。 这可以带来巨大的性能改进,因为用于生成动态输出的脚本不需要为每个请求运行。 缓存可能会根据查询字符串值以及从客户端发送到服务器的 HTTP 标头来更改缓存的输出。 缓存还与 Http.sys 内核模式驱动程序集成,从而提高性能。
何时使用输出缓存
Web 内容可以分为两个主要类别:静态内容和动态内容。
- 静态内容不会因请求而异。 返回到 Web 浏览器的内容始终相同。 静态内容的示例包括 HTML、JPG 或 GIF 文件。
- 动态内容是随每个请求而变化的输出。 示例包括 ASP.NET 或 PHP 内容。
这两个类别之间的内容是半动态内容。 想象一下执行数据库查询的动态 ASP.NET 页。 如果基础数据库表很少更改,则没有理由对每个请求执行此查询。
IIS 会自动缓存静态内容(如 HTML 页面、图像和样式表),因为这些类型的内容不会随请求而变化。 IIS 还会在进行更新时检测对文件的更改,IIS 会根据需要刷新缓存。
IIS 输出缓存功能面向半动态内容。 它允许缓存动态请求的静态响应并提高可伸缩性。
请注意,并非每个动态页面都可以利用输出缓存。 高度个性化的页面(如购物车或电子商务交易)不是很好的候选项,因为动态输出不太可能重复请求,并且用于缓存内容的内存将浪费。 作为 POST 类型请求的结果输出到 HTML 表单的内容也是不可缓存的。
输出缓存的最佳候选项是动态生成数据但不太可能基于 URL 或标头信息从一个请求更改到另一个请求的页面。 例如,动态调整图像大小以在网页中显示的照片库类型的应用程序是输出缓存的理想选择,因为缓存数据可以使服务器不必重新处理每个请求的图像大小调整。 可以利用输出缓存功能的应用程序类型的另一个很好的示例是股票代号应用程序。
选择缓存策略
IIS 支持两种类型的缓存策略:
- varyByQuerystring,其中 URL 相同,但查询字符串值有所不同。
- varybyHeaders,根据从客户端发送到服务器的 HTTP 标头来改变缓存。
使缓存失效
使用动态内容时,数据可能会频繁更改,必须刷新缓存,以便检索和重新缓存新数据。 请注意,即使数据像每秒一样频繁更改,缓存数据可能仍然很有用:站点每秒可能会获取数百个请求,缓存可以减少数据库检索数据的次数,从而节省 Web 服务器和数据库服务器的额外工作。
IIS 支持两种方法使动态内容失效:
- 使用简单的超时期限 - 配置属性为 CacheForTimePeriod。
- 检测对基础资源的更改 - 配置属性为 CacheUntilChange。 只有当希望在基础资源更改时刷新缓存时,才使用这种类型的失效方案。
配置缓存价值
即使启用输出缓存,IIS 也不会立即缓存请求。 在 IIS 将请求视为“值得缓存”之前,必须多次请求它。可以通过 ServerRuntimeSection 类一文中所述的 ServerRuntime 部分配置缓存价值。
两个属性确定缓存价值:
- frequentHitTimePeriod
- frequentHitThreshold
只有当可缓存 URL 在 <frequentHitTimePeriod>
内达到 <frequentHitThreshold>
个以上的请求时,才会缓存请求。 frequentHitTimePeriod
的默认设置为 10 秒。 frequentHitThreshold
的默认设置为 2 次命中。
通过 IIS 管理器配置输出缓存
使用新 IIS 管理工具中的用户界面功能配置缓存非常简单。
从“开始”菜单中,单击“管理工具”,然后单击“Internet Information Services (IIS) 管理器”。
在左侧的树视图中,找到应用程序。
选择“输出缓存”菜单项。
在右侧列中,单击“操作”菜单中的“添加”。 可以在此处添加输出缓存规则。
在“文件扩展名”字段中,键入 .php,然后选择“用户模式缓存”。
单击“高级”,然后选择“查询字符串变量”复选框。
在“查询字符串变量”文本框中输入相应的变量。
图 1:输出缓存示例
通过 Web.config 文件配置输出缓存
还可以在内容目录中找到的本地 Web.config 文件中配置缓存功能。 下面是 ShowStockPrice.asp 页面所需的配置示例,该页面的 varyByQueryString 参数为 *(表示缓存查询字符串参数的所有唯一变体),超时时间为 1 秒。
<configuration>
<location path="showStockPrice.asp">
<system.webserver>
<caching>
<profiles>
<add varybyquerystring="*"location="Any"
duration="00:00:01" policy="CacheForTimePeriod"
extension=".asp">
</profiles>
</caching>
</system.webserver>
</location>
</configuration>
如果想在内核中缓存此数据以获得更快的性能,只需将 policy 属性更改为 kernelCachePolicy。
注意
Microsoft ASP.NET 已包含输出缓存功能;IIS 输出缓存功能与 ASP.NET 缓存并行工作,适用于所有类型的应用程序。
检查性能计数器
若要查看输出缓存中的性能,可以在可靠性和性能监视器中查看输出缓存计数器。
- 从“开始”菜单中,单击“管理工具”,然后单击“可靠性和性能监视器”。 (在 Windows Vista® 或 Windows® 7 上,“管理工具”位于控制面板中。)
- 选择右侧树视图中的“性能监视器”,然后单击工具栏中的 +。
- 导航到“Web 服务缓存”计数器,然后单击它将其打开。
- 添加“缓存的总 URI”计数器。
如果运行性能测试,则可以看到缓存的 URI 的数量随着你请求的 If 项数量而增加。
使用内核模式缓存
IIS 输出缓存支持两个缓存策略:
- 用户模式输出缓存策略,该策略使用驻留在 IIS 工作进程中的缓存。
- 内核模式缓存策略,该策略使用驻留在内核模式驱动程序 Http.sys 中的缓存。
以内核模式缓存内容可以提高网站性能。 可以在 IIS 输出缓存一文中找到使用内核模式缓存的示例。
请注意,用户模式和内核模式输出缓存之间存在两个显著差异。
- 内核模式输出缓存不支持必须在用户模式下运行的模块和功能,例如身份验证或授权。 例如,如果启用了基本身份验证或 Windows® 身份验证等身份验证方案,则缓存策略不起作用。 内容已提供,但未缓存。 可以在此知识库文章中找到更多关于为什么响应可能无法在内核模式下缓存的详细信息。
- 内核模式输出缓存支持 varyByHeaders 属性,但不支持 varyByQuerystring。
缓存故障排除
失败的请求事件缓冲 (FREB) 是确定请求是否已缓存的最佳方式;还可以找出请求没有被缓存的原因。 例如,FREB 日志中的 HTTPSYS_CACHEABLE 事件可以告诉你,由于内核模式缓存未启用,请求未被缓存。
以下命令可用于查找在内核模式下缓存的内容:
netsh http show cachestate
缓存最常用的页面
可以将输出缓存设置为仅缓存默认页面(最常请求的页面):
在 %systemdrive%\inetpub\wwwroot\<你的应用程序> 目录中创建一个名为 default.aspx 的文件,并添加以下代码:
<%=DateTime.Now%>
从“开始”菜单中,单击“管理工具”,然后单击“Internet Information Services (IIS) 管理器”。
使用左侧的树视图导航到应用程序。
单击页面底部的“内容视图”。
选择默认文档(例如,Default.aspx 页)。
在右侧的“操作”菜单中,单击“切换到功能”视图。 配置的每个设置现在仅应用于默认文档。
打开“输出缓存规则”设置。
将 .aspx 添加为文件扩展名。
选择“内核模式缓存”,选择“时间间隔”,启用“监视缓存的文件”,然后键入时间间隔,例如 00:00:30。
使用 Windows® Internet Explorer® 浏览到
http://localhost//<your application>
。 通过不断刷新页面(按 Ctrl+F5 以确保未使用浏览器缓存),可以看到时间在 30 秒内不会更改。
注意
本文基于 Bill Staples 于 2007 年 5 月 2 日发表的文章“IIS 7 动态内容输出缓存 - 加速 ASP 和 PHP 应用程序”中的信息。