docs/配置 Web 应用访问限流
更新于 2026-11-06 阅读约 5 分钟

配置 Web 应用访问限流

本教程演示如何限制单个客户端 IP 的连接频率,并验证超过限制后的恢复过程。

1 为什么要配置访问限流

访问限流用于控制客户端在一定时间内能使用的服务资源。本教程使用 Fast-Https 的全局限流,按客户端 IP 限制新连接的频率和突发量,适合控制单个来源在短时间内建立过多连接的情况。

  • 保护服务器资源。处理大量新连接会占用 CPU、内存和网络资源。限制连接增长速度,可以减轻突发访问给服务器带来的压力。
  • 提高服务质量。高并发时,控制单个来源带来的负载,可以为后端保留处理能力,让服务在访问量上升时更稳定地响应。
  • 缓解恶意流量。短时间内反复建立连接会挤占正常访问的容量。按 IP 限制频率可约束单个攻击来源。面对分布式拒绝服务流量,各来源分别计算额度,整体防护还取决于网络和上游部署。
  • 维护公平性。每个客户端 IP 有自己的额度,可以限制脚本或反复重试的客户端所占用的容量,为其他来源保留访问机会。
  • 控制成本。对于按资源用量付费的服务,可以根据正常流量设置连接额度,减少异常连接激增带来的额外资源消耗。
  • 优化用户体验。流量高峰时,限制异常连接有助于减轻页面响应慢或服务暂时不可用的情况,访客更容易完成浏览和操作。
  • 落实访问频率要求。当站点有明确的连接频率或突发额度要求时,可将其落实为限流配置,并通过安全日志核对规则的生效情况。

2 配置测试站点

http.servers_limit 是实例级配置。v1.5.0 的全局限流按客户端 IP 在接受新连接时检查。测试循环每次运行 curl 都会创建新连接,便于观察限制。使用 HTTP/1.1 复用连接时,同一连接内的多个请求共用这一份连接额度。

下面在 Linux(Ubuntu 为例)用 curl 测试。JSON 配置也适用于 Windows。将与你的架构匹配的压缩包解压到新的测试目录,用下面的内容替换测试目录中的 config/fast-https.json。对已有实例,只需调整 http.servers_limit,保留站点及其他配置。Fast-Https v1.5.0 发行包

{
  "http": {
    "servers_limit": {
      "limit": 1,
      "burst": 2
    },
    "server": [
      {
        "listen": 18111,
        "server_name": "localhost",
        "location": [
          {
            "url": "/",
            "type": "local",
            "root": "./httpdoc/root",
            "index": ["index.html"]
          }
        ]
      }
    ]
  }
}

在含有 fast-https 的解压目录启动测试站点。

FASTHTTPS_FOREGROUND=1 ./fast-https start

3 触发限制并确认恢复

看到 18111 的监听日志后,另开一个终端并进入同一个解压目录。快速连续访问六次,每次打印状态码。直接复制整个循环执行。

for i in 1 2 3 4 5 6; do
  curl --noproxy '*' -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:18111/
done

突发额度用完前,测试请求返回 200。连续建立连接时,消耗额度的速度可能超过补充速度。使用 v1.5.0 Linux 发行包时,触发限制后连接可能被重置,curl 可能显示 000 和 Connection reset by peer。用安全日志中的 "reason":"rate_limit" 确认这次拒绝来自限流。

tail -n 1 logs/safe.log

等待至少两秒后,再发出一次请求。

curl --noproxy '*' -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:18111/

再次看到 200 表示额度已恢复。同一 IP 可以继续访问。

终端中连续请求触发限流,安全日志记录 rate_limit,等待后请求恢复 200

验证完成后停止测试服务。

./fast-https stop

4 为实际服务设置额度

servers_limit 字段含义v1.5.0 发行包默认值
limit每个 IP 每秒补充的额度,0 表示关闭这项频率限制0
burst每个 IP 最多可积攒的额度。每个新连接消耗一份,启用限流时设置为正数0
max_header_size请求头大小上限,单位为字节4096(4 KiB)
max_body_size请求体大小上限,包含上传数据,单位为字节524288(512 KiB)

示例的 limit: 1 和 burst: 2 让同一 IP 一开始可以快速建立两个连接,随后每秒恢复一份额度。配置实际服务时,以正常客户端的连接频率和允许的突发量为依据。请求体与请求头的大小限制可以分别调整。保存后重新加载配置。

频率限制会随额度恢复自动放行。需要持续拒绝指定地址时,使用 IP 黑名单。