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 = 10labels:
- "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" |
"" |