Apigee Edge 문서를 보고 있습니다.
Apigee X 문서로 이동하세요. info
증상
클라이언트 애플리케이션은 API 호출의 응답으로 오류 코드 protocol.http.TooBigBody 와 함께 HTTP 상태 코드 502 Bad Gateway를 받습니다.
오류 메시지
클라이언트 애플리케이션은 다음 응답 코드를 받습니다.
HTTP/1.1 502 Bad Gateway
또한 다음 오류 메시지가 표시될 수 있습니다.
{
"fault":{
"faultstring":"Body buffer overflow",
"detail":{
"errorcode":"protocol.http.TooBigBody"
}
}
}가능한 원인
이 오류는 대상/백엔드 서버에서 Apigee Edge로 HTTP 응답의 일부로 전송되는 페이로드 크기가 Apigee Edge의 허용 한도보다 큰 경우에 발생합니다.
이 오류가 발생할 수 있는 원인은 다음과 같습니다.
| 원인 | 설명 | 다음에 관한 문제 해결 안내 |
|---|---|---|
| 응답 페이로드 크기가 허용된 한도보다 큼 | 대상/백엔드 서버에서 Apigee에 대한 HTTP 응답의 일부로 전송되는 페이로드 크기가 Apigee에서 허용되는 한도보다 큽니다. | Edge Public 및 Private Cloud 사용자 |
| 압축 해제 후 응답 페이로드 크기가 허용된 한도를 초과함 | Apigee에 대한 HTTP 응답의 일부로 대상/백엔드 서버에서 압축 형식으로 전송된 페이로드 크기가 Apigee에서 압축 해제될 때 허용되는 한도보다 큽니다. | Edge Public 및 Private Cloud 사용자 |
일반적인 진단 단계
다음 도구/기법 중 하나를 사용하여 이 오류를 진단하세요.
API 모니터링
API 모니터링을 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 적절한 역할이 있는 사용자로 Apigee Edge UI에 로그인합니다.
문제를 조사하려는 조직으로 전환합니다.
- 분석 > API 모니터링 > 조사 페이지로 이동합니다.
- 오류가 발생한 구체적인 기간을 선택합니다.
- 프록시 필터를 선택하여 오류 코드를 좁힐 수 있습니다.
- 시간에 대한 오류 코드를 표시합니다.
아래와 같이 오류 코드
protocol.http.TooBigBody가 있는 셀을 선택합니다.
아래와 같이 결함 코드
protocol.http.TooBigBody에 관한 정보가 표시됩니다.
로그 보기를 클릭하고 실패한 요청의 행을 펼칩니다.
- 로그 창에서 다음 세부정보를 확인합니다.
- 상태 코드:
502 - 결함 소스:
target - 오류 코드:
protocol.http.TooBigBody
- 상태 코드:
- 오류 소스 값이
target이고 오류 코드 값이protocol.http.TooBigBody이면 대상/ 백엔드 서버의 HTTP 응답에 허용되는 Apigee Edge의 한도보다 큰 응답 페이로드 크기가 있음을 나타냅니다.
Trace
Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 추적 세션을 사용 설정하고 다음 중 하나를 실행합니다.
502 Bad Gateway오류가 발생할 때까지 기다리거나- 문제를 재현할 수 있는 경우 API를 호출하고
502 Bad Gateway오류를 재현합니다.
- 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
- 트레이스의 여러 단계를 탐색하여 장애가 발생한 위치를 찾습니다.
아래와 같이 대상 서버에서 응답 수신됨 단계 바로 뒤에 있는 오류 단계로 이동합니다.
트레이스에서 오류 값을 확인합니다.
- 오류:
Body buffer overflow - error.class:
com.apigee.errors.http.server.BadGateway
이는 페이로드 크기가 허용된 한도를 초과하여 Apigee Edge (메시지 프로세서 구성요소)가 백엔드 서버로부터 응답을 수신하는 즉시 오류를 발생시킨다는 것을 나타냅니다.
- 오류:
아래와 같이 클라이언트에 전송된 응답 단계에서 오류가 표시됩니다.
- 트레이스에서 오류 값을 확인합니다. 위 샘플 트레이스에는 다음이 표시됩니다.
- 오류:
502 Bad Gateway - 오류 콘텐츠:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- 오류:
다양한 시나리오에 따라 아래와 같이 타겟 서버에서 수신된 응답 단계로 이동합니다.
비압축
시나리오 1: 압축되지 않은 형식으로 전송된 응답 페이로드
트레이스에서 오류 값을 확인합니다.
- 대상 서버에서 수신된 응답:
200 OK - Content-Length (Response Headers 섹션): ~11MB
압축
시나리오 2: 요청 페이로드가 압축된 형식으로 전송됨
트레이스에서 오류 값을 확인합니다.
- 대상 서버에서 수신된 응답:
200 OK - Content-Encoding: 응답 헤더 섹션에 이 헤더가 표시되면 값을 기록해 둡니다. 예를 들어 이 예시에서 값은
gzip입니다.
- 대상 서버에서 수신된 응답:
응답 콘텐츠 섹션의 본문을 확인합니다.
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}트레이스에서 AX (분석 데이터 기록됨) 단계로 이동하여 클릭하면 관련 세부정보가 표시됩니다.
- 단계 세부정보에서 변수 읽기 섹션까지 아래로 스크롤하여 다음을 나타내는
target.received.content.length값을 확인합니다.- 압축되지 않은 형식으로 전송되는 경우의 실제 응답 페이로드 크기
- 페이로드가 압축 형식으로 전송될 때 Apigee에서 압축 해제한 응답 페이로드의 크기입니다. 이 시나리오에서는 항상 허용된 한도 (10MB)의 값과 동일합니다.
비압축
시나리오 1: 압축되지 않은 형식으로 전송된 응답 페이로드
target.received.content.length 값을 확인합니다.
요청 헤더 값 target.received.content.length ~11MB 압축
시나리오 2: 요청 페이로드가 압축된 형식으로 전송됨
target.received.content.length 값을 확인합니다.
요청 헤더 값 target.received.content.length ~10MB 다음 표에서는 target.received.content.length 값에 따라 두 시나리오에서 Apigee가
502오류를 반환하는 이유를 설명합니다.시나리오 target.received.content.length 값 실패 이유 비압축 형식의 응답 페이로드 ~11MB 크기가 허용된 한도인 10MB를 초과함 압축된 형식의 응답 페이로드 ~10MB 압축 해제 시 크기 제한 초과
NGINX
NGINX 액세스 로그를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 비공개 클라우드 사용자인 경우 NGINX 액세스 로그를 사용하여 HTTP
502오류에 관한 주요 정보를 확인할 수 있습니다. NGINX 액세스 로그를 확인합니다.
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
여기서: ORG, ENV, PORT#은 실제 값으로 대체됩니다.
- 특정 기간 동안
502오류가 있는지 (문제가 과거에 발생한 경우) 또는502로 인해 여전히 실패하는 요청이 있는지 검색합니다. protocol.http.TooBigBody값과 일치하는 X-Apigee-fault-code가 있는502오류가 발견되면 X-Apigee-fault-source 값을 확인합니다.NGINX 액세스 로그의 502 오류 샘플:
위의 NGINX 액세스 로그 샘플 항목에는 X-Apigee-fault-code 및 X-Apigee-fault-source에 다음 값이 있습니다.
응답 헤더 값 X-Apigee-fault-code protocol.http.TooBigBodyX-Apigee-fault-source target
원인: 응답 페이로드 크기가 허용된 한도보다 큼
진단
- 시나리오 1의 일반적인 진단 단계에 설명된 대로 API 모니터링, 추적 도구 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드, 오류 소스, 응답 페이로드 크기를 확인합니다.
- 오류 소스에
target값이 있으면 타겟/백엔드 서버에서 Apigee로 전송된 응답 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 크다는 것을 나타냅니다. - 1단계에서 확인한 응답 페이로드 크기를 확인합니다.
- 페이로드 크기가 허용된 한도인 10MB를 초과하면 오류가 발생합니다.
- 페이로드 크기가 허용된 한도인 10MB에 가까운 경우 응답 페이로드가 압축된 형식으로 전달될 수 있습니다. 원인: 압축 해제 후 응답 페이로드 크기가 허용된 한도를 초과함으로 이동하세요.
- 다음 단계를 사용하여 실제 응답을 확인하여 응답 페이로드 크기가 허용된 제한인 10MB를 초과하는지 확인합니다.
- 타겟/백엔드 서버에 전송된 실제 요청에 액세스할 수 없는 경우 해결 방법으로 이동하세요.
- 타겟/백엔드 서버에 전송된 실제 요청에 액세스할 수 있는 경우 다음 단계를 실행합니다.
- 공용 클라우드/비공개 클라우드 사용자인 경우 백엔드 서버 자체 또는 백엔드 서버에 요청을 보낼 수 있는 다른 머신에서 백엔드 서버에 직접 요청하세요.
- 프라이빗 클라우드 사용자인 경우 메시지 프로세서 중 하나에서 백엔드 서버에 요청할 수도 있습니다.
- Content-Length 헤더를 확인하여 응답에 전달된 페이로드의 크기를 확인합니다.
- 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 큰 경우 문제가 발생합니다.
백엔드 서버의 샘플 응답:
curl -v https://BACKENDSERVER-HOSTNAME/testfile
* About to connect() to 10.14.0.10 port 9000 (#0) * Trying 10.14.0.10... * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0) > GET /testfile HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.14.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 11534336 < Content-Type: application/octet-stream < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Date: Wed, 30 Jun 2021 09:22:41 GMT < ----snipped---- <Response Body>
위의 예에서
Content-Length: 11534336 (which is ~11 MB)이 Apigee Edge에서 허용되는 한도를 초과하므로 이 오류의 원인임을 알 수 있습니다.
해상도
해결 방법을 참고하세요.
원인: 압축 해제 후 응답 페이로드 크기가 허용된 한도를 초과함
응답 페이로드가 압축 형식으로 전송되고 응답 헤더 Content-Encoding이 gzip, 로 설정되면 Apigee가 응답 페이로드를 압축 해제합니다. 압축 해제 프로세스 중에 Apigee가 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 크다고 판단하면 추가 압축 해제를 중지하고 502 Bad Gateway 및 오류 코드 protocol.http.TooBigBody로 즉시 응답합니다.
진단
- 시나리오 2의 일반적인 진단 단계에 설명된 대로 API 모니터링, 추적 도구 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드, 오류 소스, 응답 페이로드 크기를 확인합니다.
- Fault Source 값이
target이면 타겟/백엔드 애플리케이션에서 Apigee로 전송한 응답 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 크다는 것을 나타냅니다. - 1단계에서 확인한 응답 페이로드 크기를 확인합니다.
- 페이로드 크기가 허용된 한도인 10MB를 초과하면 오류가 발생합니다.
- 페이로드 크기가 허용된 한도인 10MB에 가까운 경우 응답 페이로드가 압축된 형식으로 전달될 수 있습니다. 이 경우 압축된 응답 페이로드의 압축되지 않은 크기를 확인합니다.
- 다음 방법 중 하나를 사용하여 타겟/백엔드에서 압축된 형식으로 응답이 전송되었는지, 압축 해제된 크기가 허용된 한도를 초과하는지 확인할 수 있습니다.
Trace
Trace 도구 사용:
- 실패한 요청의 트레이스를 캡처한 경우 트레이스 및
- target.received.content.length 값 확인
- 클라이언트의 요청에 Content-Encoding:
gzip헤더가 포함되어 있는지 확인합니다.
- target.received.content.length 값이 허용된 한도인 10MB에 가까우며 응답 헤더가 Content-Encoding:
gzip인 경우 이 오류가 발생합니다.
실제 요청
실제 요청 사용:
- 타겟/백엔드 서버에 전송된 실제 요청에 액세스할 수 없는 경우 해결 방법으로 이동하세요.
- 타겟/백엔드 서버에 전송된 실제 요청에 액세스할 수 있는 경우 다음 단계를 실행합니다.
- 응답에 전달된 페이로드의 크기와 응답에 전송된
Content-Encoding헤더를 확인합니다. - 응답 헤더
Content-Encoding가gzip로 설정되어 있고 압축 해제된 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 큰 경우 이 오류가 발생합니다.백엔드 서버에서 수신한 샘플 응답:
curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
* About to connect() to 10.1.0.10 port 9000 (#0) * Trying 10.1.0.10... * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0) > GET /testzippedfile.gz HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.1.0.10:9000 > Accept: */* > < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Encoding: gzip < Content-Type: application/x-gzip < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT < Testheader: test < Date: Wed, 07 Jul 2021 10:14:16 GMT < Transfer-Encoding: chunked < ----snipped---- <Response Body>
위의 경우
Content-Encoding: gzip헤더가 전송되고 응답의testzippedfile.gz파일 크기가 제한보다 작지만 압축 해제된 파일testzippedfile의 크기는 약 15MB입니다.
- 응답에 전달된 페이로드의 크기와 응답에 전송된
메시지 프로세서 로그
메시지 프로세서 로그 사용:
- 비공개 클라우드 사용자인 경우 메시지 프로세서 로그를 사용하여 HTTP
502오류에 관한 주요 정보를 확인할 수 있습니다. 메시지 프로세서 로그 확인
/opt/apigee/var/log/edge-message-processor/logs/system.log특정 기간 동안
502오류가 있는지(문제가 과거에 발생한 경우) 또는502로 인해 여전히 실패하는 요청이 있는지 검색합니다. 다음 검색 문자열을 사용할 수 있습니다.grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- 아래와 비슷한
system.log의 줄이 표시됩니다(TotalRead및chunkCount는 경우에 따라 다를 수 있음).2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2571 2021-07-07 09:40:47,012 NIOThread@7 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155 useCount=1 bytesRead=0 bytesWritten=182 age=23ms lastIO=0ms isOpen=true).onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: Body buffer overflow 2021-07-07 09:40:47,012 NIOThread@7 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@77cbd7c4, Body buffer overflow)
압축 해제 프로세스 중에 메시지 프로세서가 총 읽기 바이트가 10MB보다 크다고 판단하면 중지되고 다음 줄이 출력됩니다.
Message is too large. TotalRead 10489856 chunkCount 2571응답 페이로드 크기가 10MB를 초과한다는 의미이며, 크기가 10MB 한도를 초과하기 시작하면 Apigee에서 오류가 발생하고 오류 코드는
protocol.http.TooBigBody입니다.
- 실패한 요청의 트레이스를 캡처한 경우 트레이스 및
해상도
크기 수정
옵션 1[권장]: Apigee 한도를 초과하는 페이로드를 전송하지 않도록 대상 서버 애플리케이션 수정
- 특정 타겟 서버가 한도에 정의된 허용 한도를 초과하는 응답 / 페이로드 크기를 전송하는 이유를 분석합니다.
- 원하지 않는 경우 허용된 제한보다 작은 응답 / 페이로드 크기를 전송하도록 타겟 서버 애플리케이션을 수정하세요.
- 허용된 한도보다 많은 응답/페이로드를 보내고 싶다면 다음 옵션으로 이동하세요.
서명된 URL 패턴
옵션 2[권장]: Apigee JavaCallout 내에서 서명된 URL 패턴 사용
페이로드가 10MB보다 큰 경우 Apigee는 GitHub의 Edge 콜아웃: 서명된 URL 생성기 예시에 설명된 Apigee JavaCallout 내에서 서명된 URL 패턴을 사용하는 것을 권장합니다.
스트리밍
옵션 3: 스트리밍 사용하기
API 프록시가 대규모 요청 및 응답을 처리해야 하는 경우 Apigee에서 스트리밍을 사용 설정할 수 있습니다.
CwC
옵션 4: CwC 속성을 사용하여 버퍼 한도 늘리기
기본 크기가 증가하면 성능 문제가 발생할 수 있으므로 권장 옵션을 사용할 수 없는 경우에만 이 옵션을 사용해야 합니다.
Apigee는 요청 및 응답 페이로드 크기 제한을 늘릴 수 있는 CwC 속성을 제공합니다. 자세한 내용은 라우터 또는 메시지 프로세서에서 메시지 크기 제한 설정하기를 참고하세요.
한도
Apigee에서는 클라이언트 애플리케이션과 백엔드 서버가
Apigee Edge 한도에
Request/response size에 대해 문서화된 허용 한도를 초과하는 페이로드 크기를 전송하지 않을 것으로 예상합니다.
- Public Cloud 사용자인 경우 요청 및 응답 페이로드 크기의 최대 한도는 Apigee Edge 한도에
Request/response size에 대해 설명된 대로입니다. - 프라이빗 클라우드 사용자 인 경우 요청 및 응답 페이로드 크기의 기본 최댓값을 수정했을 수 있습니다 (권장되는 방법은 아님). 현재 한도 확인 방법의 안내에 따라 최대 요청 페이로드 크기 한도를 확인할 수 있습니다.
현재 한도를 확인하는 방법
이 섹션에서는 메시지 프로세서에서 HTTPResponse.body.buffer.limit 속성이 새 값으로 업데이트되었는지 확인하는 방법을 설명합니다.
메시지 프로세서 머신에서
/opt/apigee/edge-message- processor/conf디렉터리의HTTPResponse.body.buffer.limit속성을 검색하고 아래와 같이 설정된 값을 확인합니다.grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
위 명령어의 샘플 결과는 다음과 같습니다.
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
위의 예시 출력에서
HTTPResponse.body.buffer.limit속성이http.properties의10m값으로 설정되었습니다.이는 프라이빗 클라우드용 Apigee에서 구성된 요청 페이로드 크기 한도가 10MB임을 나타냅니다.
Apigee 지원팀의 지원이 여전히 필요한 경우 진단 정보를 수집해야 함으로 이동하세요.
진단 정보 수집 필요
다음 진단 정보를 수집한 후 Apigee Edge 지원팀에 문의합니다.
Public Cloud 사용자인 경우 다음 정보를 제공하세요.
- 조직 이름
- 환경 이름
- API 프록시 이름
502오류를 재현하는 데 사용된 전체 curl 명령어- API 요청의 추적 파일
- 페이로드 크기와 함께 대상/백엔드 서버의 응답을 완전히 출력합니다.
프라이빗 클라우드 사용자인 경우 다음 정보를 제공하세요.
- 실패한 요청에 대해 확인된 전체 오류 메시지
- 조직 이름
- 환경 이름
- API 프록시 번들
- 실패한 API 요청의 트레이스 파일
502오류를 재현하는 데 사용된 전체 curl 명령어- 페이로드 크기와 함께 대상/백엔드 서버의 응답을 완전히 출력합니다.
NGINX 액세스 로그
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log위치: ORG, ENV, PORT#이 실제 값으로 대체됩니다.
- 메시지 프로세서 시스템 로그
/opt/apigee/var/log/edge-message-processor/logs/system.log