본문 바로가기
WIKI 기술 지식 베이스

InFlightReq

원문 보기 위키 갱신

출처: Traefik InFlightReq Documentation

본문

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" | "" |

더 알아보기 (Learn more)