跳到正文
Træfɪk

InFlightReq

inFlightReq 中间件主动防止服务被高负载压垮。

配置示例

# Limiting to 10 simultaneous connections
http:
  middlewares:
    test-inflightreq:
      inFlightReq:
        amount: 10
# Limiting to 10 simultaneous connections
[http.middlewares]
  [http.middlewares.test-inflightreq.inFlightReq]
    amount = 10
labels:
  - "traefik.http.middlewares.test-inflightreq.inflightreq.amount=10"
// Limiting to 10 simultaneous connections
{
  "Tags" : [
    "traefik.http.middlewares.test-inflightreq.inflightreq.amount=10"
  ]
}
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: test-inflightreq
spec:
  inFlightReq:
    amount: 10

配置选项

字段 说明 默认值 必填
amount amount 选项定义允许同时处理的最大请求数。
如果已有 amount 个请求正在处理(基于同一个 sourceCriterion 策略),中间件将返回 HTTP 429 Too Many Requests。
0 否
sourceCriterion.requestHost 是否将请求主机作为来源。
sourceCriterion 的更多信息见此处。
false 否
sourceCriterion.requestHeaderName 用于对传入请求进行分组的请求头名称。
sourceCriterion 的更多信息见此处。
"" 否
sourceCriterion.ipStrategy.depth 从右侧开始,在 X-Forwarded-For 头中选择 IP 的深度位置。
0 表示不使用深度。
如果大于 X-Forwarded-For 中的 IP 总数,客户端 IP 为空。
如果大于 0,则不计算 excludedIPs 选项。
更多信息参阅下文的 sourceCriterion、ipStrategy](#ipstrategy), and [depth`。
0 否
sourceCriterion.ipStrategy.excludedIPs 允许 Traefik 扫描 X-Forwarded-For 头,选取第一个不在此列表中的 IP。
如果指定了 depth,则忽略 excludedIPs。
更多信息参阅下文的 sourceCriterion、ipStrategy](#ipstrategy), and [excludedIPs`。
否
sourceCriterion.ipStrategy.ipv6Subnet 如果提供 ipv6Subnet,且选中的 IP 为 IPv6,则将该 IP 转换为其所属子网的第一个 IP。
更多信息参阅下文的 sourceCriterion、ipStrategy.ipv6Subnet 和 excludedIPs。
否

sourceCriterion 来源判定标准

sourceCriterion 选项定义将请求归为同一来源时使用的判定标准。 如果同时定义多种策略,将报错。 如果均未设置,默认使用 requestHost。

ipStrategy IP 策略

ipStrategy 选项定义 depth、excludedIPs 和 ipv6Subnet 三个参数,用于配置 Traefik 如何确定客户端 IP。

inFlightReq 作为中间件,在实际向后端代理请求之前执行。 此外,前一网络跳点仅在代理过程的最后阶段才会追加到 X-Forwarded-For 中,此时请求已经通过该中间件。 因此,在 InFlightReq 处理期间,前一网络跳点尚未出现在 X-Forwarded-For 中,无法使用它,也不能依赖它。

ipStrategy.ipv6Subnet IPv6 子网

此策略仅适用于 Depth 和 RemoteAddr 策略。 如果提供 ipv6Subnet,且选中的 IP 为 IPv6,则将该 IP 转换为其所属子网的第一个 IP。

这可用于将 IPv6 地址按子网分组,防止通过获取新的 IPv6 地址来绕过此中间件。

  • 如果 ipv6Subnet 的值 ≤ 0 或 > 128,将导致中间件创建失败。

ipv6Subnet 示例

提供 ipv6Subnet 时,IP 按以下方式转换。

IP ipv6Subnet clientIP(客户端 IP)
"::abcd:1111:2222:3333" 64 "::0:0:0:0"
"::abcd:1111:2222:3333" 80 "::abcd:0:0:0:0"
"::abcd:1111:2222:3333" 96 "::abcd:1111:0:0:0"

Depth 与 X-Forwarded-For 示例

如果 depth 设置为 2,且请求的 X-Forwarded-For 头为 "10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1",则“真实”客户端 IP 为 "10.0.0.1"(深度为 4),但用作判定标准的 IP 是 "12.0.0.1"(depth=2)。

X-Forwarded-For depth clientIP(客户端 IP)
"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" 1 "13.0.0.1"
"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" 3 "11.0.0.1"
"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" 5 ""

ExcludedIPs 与 X-Forwarded-For 示例

X-Forwarded-For excludedIPs clientIP(客户端 IP)
"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" "12.0.0.1,13.0.0.1" "11.0.0.1"
"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" "15.0.0.1,13.0.0.1" "12.0.0.1"
"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" "10.0.0.1,13.0.0.1" "12.0.0.1"
"10.0.0.1,11.0.0.1,12.0.0.1,13.0.0.1" "15.0.0.1,16.0.0.1" "13.0.0.1"
"10.0.0.1,11.0.0.1" "10.0.0.1,11.0.0.1" ""

版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证