InFlightReq
본문
InFlightReq
inFlightReq 미들웨어는 서비스가 과부하로 압도되는 일을 사전에 방지해 줘요. 처리 중(in-flight)인 요청 수를 제한해서 서비스를 보호하는 거죠.
구성 예시
구조화된 (YAML)
# 동시 접속을 10개로 제한
http:
middlewares:
test-inflightreq:
inFlightReq:
amount: 10
구조화된 (TOML)
# 동시 접속을 10개로 제한
[http.middlewares]
[http.middlewares.test-inflightreq.inFlightReq]
amount = 10
Labels
labels:
- "traefik.http.middlewares.test-inflightreq.inflightreq.amount=10"
Consul Catalog
// 동시 접속을 10개로 제한
{
"Tags" : [
"traefik.http.middlewares.test-inflightreq.inflightreq.amount=10"
]
}
Kubernetes
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: test-inflightreq
spec:
inFlightReq:
amount: 10
구성 옵션
| Field | Description | Default | Required |
| amount | 허용되는 동시 처리 중 요청의 최대 개수를 정의해요. 이미 amount만큼 요청이 진행 중이면(같은 sourceCriterion 전략 기준) 미들웨어는 HTTP 429 Too Many Requests로 응답합니다. | 0 | No |
| sourceCriterion.requestHost | 요청 호스트를 소스로 간주할지 여부. sourceCriterion에 대한 자세한 내용은 여기를 참고하세요. | false | No |
| sourceCriterion.requestHeaderName | 들어오는 요청을 그룹화하는 데 사용하는 헤더 이름. sourceCriterion에 대한 자세한 내용은 여기를 참고하세요. | "" | No |
| sourceCriterion.ipStrategy.depth | X-Forwarded-For 헤더에서 선택할 IP의 깊이 위치(오른쪽부터 시작). 0이면 깊이 없음. X-Forwarded-For의 총 IP 수보다 크면 클라이언트 IP는 비어 있게 돼요. 0보다 크면 excludedIPs 옵션은 평가되지 않습니다. sourceCriterion, ipStrategy](#ipstrategy), [depth에 대한 자세한 내용은 아래를 참고하세요. | 0 | No | | sourceCriterion.ipStrategy.excludedIPs| Traefik이X-Forwarded-For헤더를 훑어 목록에 없는 첫 IP를 선택하도록 허용해요.depth가 지정되면 excludedIPs는 무시됩니다. sourceCriterion, ipStrategy](#ipstrategy), [excludedIPs에 대한 자세한 내용은 아래를 참고하세요. | | No |
| sourceCriterion.ipStrategy.ipv6Subnet | ipv6Subnet이 제공되고 선택된 IP가 IPv6라면, 그 IP는 속한 서브넷의 첫 IP로 변환됩니다. sourceCriterion, ipStrategy.ipv6Subnet, excludedIPs에 대한 자세한 내용은 아래를 참고하세요. | | No |
sourceCriterion
sourceCriterion 옵션은 어떤 기준으로 요청을 공통 소스에서 온 것으로 그룹화할지 정의합니다. 여러 전략이 동시에 정의되면 오류가 발생해요. 아무것도 설정하지 않으면 기본값은 requestHost를 사용합니다.
ipStrategy
ipStrategy 옵션은 Traefik이 클라이언트 IP를 어떻게 결정할지 구성하는 세 가지 파라미터를 정의합니다: depth, excludedIPs, ipv6Subnet.
미들웨어로서 inFlightReq는 실제 백엔드로의 프록시가 일어나기 전에 실행됩니다. 게다가 이전 네트워크 홉은 프록시의 마지막 단계, 즉 이미 미들웨어를 통과한 뒤에만 X-Forwarded-For에 추가돼요. 따라서 InFlightReq 중에는 이전 네트워크 홉이 아직 X-Forwarded-For에 없으므로, 이를 사용하거나 의존할 수 없습니다.
ipStrategy.ipv6Subnet
이 전략은 Depth와 RemoteAddr 전략에만 적용됩니다. ipv6Subnet이 제공되고 선택된 IP가 IPv6라면, 그 IP는 속한 서브넷의 첫 IP로 변환됩니다.
새 IPv6를 얻어 이 미들웨어를 우회하는 것을 막기 위해 IPv6 주소를 서브넷으로 그룹화할 때 유용해요.
ipv6Subnet값이 0 이하이거나 128보다 크면 미들웨어 생성이 실패합니다.
ipv6Subnet 예시
ipv6Subnet이 제공되면 IP는 다음과 같이 변환됩니다.
| IP | ipv6Subnet | clientIP |
| "::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"(depth 4 지점)이지만 기준으로 사용되는 IP는 "12.0.0.1"(depth=2)입니다.
| X-Forwarded-For | depth | clientIP |
| "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 |
| "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" | "" |