Web 限制 <webLimits>

概述

<webLimits> 元素指定 TCP/IP 连接和带宽限制。

工作进程每隔 60 秒检查一次处于空闲状态的时间。 如果其当前空闲时间大于 Windows Process Activation Service (WAS) 指定的空闲超时值,则工作进程将启动关闭操作。 为 dynamicIdleThreshold 属性指定非零值时,WAS 将根据使用的 RAM 量动态减少此空闲超时时间。

dynamicIdleThreshold 属性表示提交的物理 RAM 量。 例如,如果服务器安装了 2 GB 的物理内存且将 dynamicIdleThreshold 属性值设置为 200,则已提交 200% (4 GB) 的物理 RAM 以供使用。 下表显示,分配了 4 GB 的 80%(即 160% (3.2 GB) 的物理 RAM)时,WAS 将开始将所有工作进程空闲超时时间减少 50%。

下表列出了根据 dynamicIdleThreshold 值的预定百分比进行的空闲超时时间减少情况。

Dynamic idle threshold percentage reached Dynamic idle time-out reduction
75 及以下 WAS 使用原始空闲超时时间设置。
80 WAS 将所有工作进程已配置的空闲超时时间减少至一半。
85 WAS 将所有工作进程已配置的空闲超时时间减少至 1/4。
90 WAS 将所有工作进程已配置的空闲超时时间减少至 1/8。
95 WAS 将所有工作进程已配置的空闲超时时间减少至 1/16。
100 WAS 将所有工作进程已配置的空闲超时时间减少至 1/32。

动态站点激活

动态站点激活允许延迟网站激活,以此来帮助 IIS 解决可伸缩性问题。 当网站数超过限制时,IIS 在启动服务时不会激活任何网站。 不会像以前在 IIS 8.0 和更早版本中所做的那样,在启动时为每个已配置的站点创建队列和绑定。 而是会创建一个队列,该队列侦听所有站点的请求,并具有单个绑定。 WAS 可加载站点列表、绑定、应用程序、应用程序池以及应用程序池设置。 对站点的请求到达时,IIS 使用该列表创建一个队列并为该站点注册一个绑定。 此时,HTTP.sys 将请求置于队列中,WAS 启动工作进程并处理请求。

使用动态站点激活,IIS 服务启动速度可能会更快,消耗的内存更少。 IIS 重启的时间也会明显缩短,因为不需要释放所有已注册的队列以及与 HTTP 的绑定。 在此上下文中,“激活”是指 IIS 向 HTTP 协议堆栈 (HTTP.sys) 注册网站的过程。 此激活与创建工作进程不同,只有在收到对站点的请求时才会进行。

当服务器处理的站点数大于预设限制时,将启用动态站点激活。 默认情况下,该限制为 100。 如果不更改该值,站点将在托管超过 100 个站点的服务器上动态激活。 另一方面,如果站点数量未超过 100,所有站点将在启动后激活。 可以通过更改 dynamicRegistrationThreshold 属性来更改该限制。 请注意,如果服务器的站点数量较少,那么其性能提升没有那么明显(相对于站点数量更多的服务器)。

注意

启用动态站点激活后,便不允许用户使用 IP 地址发送 Web 请求。 例如,如果用户尝试浏览到 HTTP://127.0.0.1,则将收到错误“400 错误请求”。

兼容性

版本 说明
IIS 10.0 <webLimits> 元素在 IIS 10.0 中未进行修改。
IIS 8.5 IIS 8.5 中添加了 dynamicRegistrationThreshold 属性。
IIS 8.0 <webLimits> 元素在 IIS 8.0 中未进行修改。
IIS 7.5 <webLimits> 元素未在 IIS 7.5 中进行修改。
IIS 7.0 <webLimits> 元素是在 IIS 7.0 中引入的。
IIS 6.0 <webLimits> 元素替换以下 IIS 6.0 元数据库设置:
  • ConnectionTimeout
  • HeaderWaitTimeout
  • MaxGlobalBandwidth
  • MinFileBytesPerSec

安装

<webLimits> 元素包含在 IIS 7 及更高版本的默认安装中。

操作方式

如何配置动态站点激活的下限

  1. 打开 Internet Information Services (IIS) 管理器:

    • 如果使用的是 Windows Server 2012 R2:

      • 在任务栏上,单击“服务器管理器”,单击“工具”,然后单击“Internet Information Services (IIS)管理器”
    • 如果使用的是 Windows 8.1:

      • 按住 Windows 键,按字母 X,然后单击“控制面板”。
      • 单击“管理工具”,然后双击“Internet 信息服务(IIS)管理器”。
  2. 在“连接”窗格中,选择服务器,然后在“管理”区域中双击“配置编辑器”

  3. 在“配置编辑器”的“部分”中,展开 system.applicationHost,然后选择“webLimits”

  4. 输入 dynamicRegistrationThreshold 的值。

  5. 在“操作”窗格中,单击“应用”

    Screenshot showing how to configure dynamic site activation using the Configuration Editor.

配置

特性

属性 说明
connectionTimeout 可选的 timeSpan 属性。

指定 IIS 等待的时间,超过此时间后,将断开被视为处于非活动状态的连接。

默认值为 00:02:00
demandStartThreshold 可选 uint 属性。

指定允许在 Web 服务器上并发运行的最大工作进程数。 当启动过多的工作进程时,可以使用此属性来防止 IIS 服务器陷入无响应状态。

默认值为 2147483647
dynamicIdleThreshold 可选 uint 属性。

指定提交的物理 RAM 的百分比。 有效整数范围为 0 到 10000。 WAS 使用此阈值动态缩短工作进程的空闲超时时间。 有关详细信息,请参阅“备注”部分。

默认值为 0
dynamicRegistrationThreshold 可选 uint 属性。

指定动态网站激活的下限。 当服务器上配置的网站数超过此属性的值时,服务在启动服务时不会激活所有网站。 相反,当 IIS 收到每个站点的第一次请求时,会激活相应站点。 如果配置的站点数小于或等于此数字,则启动服务时将激活所有已配置的网站。

单独激活站点时,IIS 所需的系统资源量较低,尤其是在不经常访问大量站点的情况下。 在网站被激活时对该网站的第一次请求将需要更长时间,但后续访问会正常响应。

默认值为 100
headerWaitTimeout 可选的 timeSpan 属性。

指定服务器等待接收请求的所有 HTTP 标头的时间,超过此时间后,将断开与客户端的连接。 此属性用帮助防止拒绝服务 (DoS) 攻击的常见变体,DoS 攻击会试图最大限度地利用连接并保持连接状态。

默认值为 00:00:00
maxGlobalBandWidth 可选 uint 属性。

指定服务器的最大总带宽。 将值设置为 0 会为服务器启用无限带宽。

默认值为 4294967295
minBytesPerSecond 可选 uint 属性。

指定 HTTP.sys 向客户端发送响应时强制执行的最小吞吐率(以字节为单位)。 minBytesPerSecond 属性可使用最少数据将连接保持打开状态,从而防止恶意或故障软件客户端使用资源。 如果吞吐率低于 minBytesPerSecond 设置,则连接将终止。

对于当前实现,只有在超过了以最低带宽传输速度将整个响应流式传输到连接客户端所用时间后才会终止连接。 如果传输速率仅在一小段时间内低于 minBytesPerSecond 指定的值,但总体传输速率较高,则不会终止连接。

默认值为 240

子元素

无。

配置示例

以下配置示例将连接超时设置为 1 分钟,将提交的物理 RAM 百分比设置为 150,将标头等待超时设置为 30 秒,并将允许的最小吞吐率设置为每秒 500 字节。

<configuration>
   <system.applicationHost>
      <webLimits connectionTimeout="00:01:00"
         dynamicIdleThreshold="150"
         headerWaitTimeout="00:00:30"
         minBytesPerSecond="500"
      />
   </system.applicationHost>
</configuration>

代码示例

以下代码示例将连接超时设置为 1 分钟,将提交的物理 RAM 百分比设置为 150,将标头等待超时设置为 30 秒,并将允许的最小吞吐率设置为每秒 500 字节。

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/webLimits /connectionTimeout:"00:01:00" /commit:apphost
appcmd.exe set config -section:system.applicationHost/webLimits /dynamicIdleThreshold:"150" /commit:apphost
appcmd.exe set config -section:system.applicationHost/webLimits /headerWaitTimeout:"00:00:30" /commit:apphost
appcmd.exe set config -section:system.applicationHost/webLimits /minBytesPerSecond:"500" /commit:apphost

注意

使用 AppCmd.exe 配置这些设置时,必须确保将 commit 参数设置为 apphost。 这会将配置设置提交到 ApplicationHost.config 文件中的相应位置部分。

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection webLimitsSection = config.GetSection("system.applicationHost/webLimits");

         webLimitsSection["connectionTimeout"] = TimeSpan.Parse("00:01:00");
         webLimitsSection["dynamicIdleThreshold"] = 150;
         webLimitsSection["headerWaitTimeout"] = TimeSpan.Parse("00:00:30");
         webLimitsSection["minBytesPerSecond"] = 500;

         serverManager.CommitChanges();
      }
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample

   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim webLimitsSection As ConfigurationSection = config.GetSection("system.applicationHost/webLimits")

      webLimitsSection("connectionTimeout") = TimeSpan.Parse("00:01:00")
      webLimitsSection("dynamicIdleThreshold") = 150
      webLimitsSection("headerWaitTimeout") = TimeSpan.Parse("00:00:30")
      webLimitsSection("minBytesPerSecond") = 500

      serverManager.CommitChanges()
   End Sub

End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";

var webLimitsSection = adminManager.GetAdminSection("system.applicationHost/webLimits", "MACHINE/WEBROOT/APPHOST");
webLimitsSection.Properties.Item("connectionTimeout").Value = "00:01:00";
webLimitsSection.Properties.Item("dynamicIdleThreshold").Value = 150;
webLimitsSection.Properties.Item("headerWaitTimeout").Value = "00:00:30";
webLimitsSection.Properties.Item("minBytesPerSecond").Value = 500;

adminManager.CommitChanges();

VBScript

Set adminManager = WScript.CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"

Set webLimitsSection = adminManager.GetAdminSection("system.applicationHost/webLimits", "MACHINE/WEBROOT/APPHOST")
webLimitsSection.Properties.Item("connectionTimeout").Value = "00:01:00"
webLimitsSection.Properties.Item("dynamicIdleThreshold").Value = 150
webLimitsSection.Properties.Item("headerWaitTimeout").Value = "00:00:30"
webLimitsSection.Properties.Item("minBytesPerSecond").Value = 500

adminManager.CommitChanges()