502 잘못된 게이트웨이 - TooBigBody

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

증상

클라이언트 애플리케이션은 API 호출에 대한 응답으로 오류 코드 protocol.http.TooBigBody 와 함께 HTTP 상태 코드 502 Bad Gateway를 가져옵니다.

오류 메시지

클라이언트 애플리케이션은 다음 응답 코드를 가져옵니다.

HTTP/1.1 502 Bad Gateway

또한 다음과 같은 오류 메시지가 표시될 수 있습니다.

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

가능한 원인

이 오류는 대상/백엔드 서버에서 HTTP 응답의 일부로 Apigee Edge로 전송한 페이로드 크기가 Apigee Edge에서 허용된 한도보다 큰 경우에 발생합니다.

오류의 가능한 원인은 다음과 같습니다.

원인 설명 다음에 관한 문제 해결 안내
응답 페이로드 크기가 허용된 한도보다 큼 대상/백엔드 서버에서 Apigee에 대한 HTTP 응답의 일부로 전송한 페이로드 크기가 Apigee에서 허용되는 한도를 초과합니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
압축 해제 후 응답 페이로드 크기가 허용 한도를 초과함 대상/백엔드 서버에서 Apigee에 대한 HTTP 응답의 일부로 압축된 형식으로 전송한 페이로드 크기가 Apigee에서 압축 해제할 때 허용되는 한도를 초과합니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자

일반적인 진단 단계

다음 도구/기술 중 하나를 사용하여 이 오류를 진단하세요.

API 모니터링

API 모니터링을 사용하여 오류를 진단하려면 다음 안내를 따르세요.

  1. 적절한 역할이 있는 사용자로 Apigee Edge UI에 로그인합니다.
  2. 문제를 조사하려는 조직으로 전환합니다.

  3. 분석 > API 모니터링 > 조사 페이지로 이동합니다.
  4. 오류를 관찰한 특정 기간을 선택합니다.
  5. 프록시 필터를 선택하여 오류 코드의 범위를 좁힐 수도 있습니다.
  6. 시간을 기준으로 결함 코드를 표시합니다.
  7. 아래와 같이 오류 코드가 protocol.http.TooBigBody인 셀을 선택합니다.

  8. 아래와 같이 오류 코드 protocol.http.TooBigBody에 관한 정보가 표시됩니다.

  9. 로그 보기를 클릭하고 실패한 요청이 있는 행을 펼칩니다.

  10. 로그 창에서 다음 세부정보를 확인합니다.
    • 상태 코드: 502
    • 결함 소스: target
    • 오류 코드: protocol.http.TooBigBody.
  11. 오류 소스의 값이 target이고 오류 코드의 값이 protocol.http.TooBigBody이면 대상/ 백엔드 서버의 HTTP 응답의 응답 페이로드 크기가 Apigee Edge의 한도보다 큰 것입니다.

Trace

Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.

  1. 트레이스 세션을 사용 설정하고 다음 중 하나를 사용합니다.
    • 502 Bad Gateway 오류가 발생할 때까지 기다립니다.
    • 문제를 재현할 수 있는 경우 API를 호출하고 502 Bad Gateway 오류를 재현합니다.
  2. 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
  3. trace의 여러 단계를 살펴보고 실패가 발생한 위치를 찾습니다.
  4. 아래와 같이 Response received from target server(대상 서버에서 수신된 응답) 단계 바로 직후에 Error 단계로 이동합니다.

    트레이스에서 오류 값을 기록해 둡니다.

    • 오류: Body buffer overflow
    • error.class: com.apigee.errors.http.server.BadGateway

    이는 페이로드 크기가 허용 한도를 초과하여 백엔드 서버에서 응답을 받는 즉시 Apigee Edge (메시지 프로세서 구성요소)에서 오류를 발생시킨다는 것을 나타냅니다.

  5. 아래와 같이 Response Sent to Client 단계에서 실패가 표시됩니다.

  6. 트레이스에서 오류 값을 기록합니다. 위의 샘플 trace는 다음을 보여줍니다.
    • 오류: 502 Bad Gateway
    • 오류 콘텐츠: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. 여러 가지 시나리오에서 아래와 같이 Response Received from target server(대상 서버에서 수신된 응답) 단계로 이동합니다.

    비압축

    시나리오 #1: 압축되지 않은 형식으로 전송된 응답 페이로드

    트레이스에서 오류 값을 기록해 둡니다.

    • 대상 서버에서 수신된 응답: 200 OK
    • Content-Length (Response Headers 섹션): ~11MB

    압축

    시나리오 #2: 압축된 형식으로 전송된 요청 페이로드

    트레이스에서 오류 값을 기록해 둡니다.

    • 대상 서버에서 수신된 응답: 200 OK
    • Content-Encoding: 응답 헤더 섹션에 이 헤더가 표시되면 값을 기록해 둡니다. 예를 들어 이 예에서 값은 gzip입니다.
  8. 응답 콘텐츠 섹션의 본문을 확인합니다.

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. 추적에서 AX (애널리틱스 데이터 기록됨) 단계로 이동한 후 이를 클릭하여 관련 세부정보를 확인합니다.

  10. 단계 세부정보에서 변수 읽기 섹션까지 아래로 스크롤하고 다음을 나타내는 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
  11. 다음 표에서는 target.received.content.length 값을 기준으로 두 가지 시나리오에서 Apigee에서 502 오류를 반환하는 이유를 설명합니다.

    시나리오 target.received.content.length의 값 실패 원인
    비압축 형식의 응답 페이로드 약 11MB 크기 > 허용되는 한도 10MB
    압축된 형식의 응답 페이로드 약 10MB

    압축 해제 시 크기 제한을 초과했습니다.

NGINX

NGINX 액세스 로그를 사용하여 오류를 진단하려면 다음 안내를 따르세요.

  1. Private Cloud 사용자는 NGINX 액세스 로그를 사용하여 HTTP 502 오류에 대한 주요 정보를 확인할 수 있습니다.
  2. NGINX 액세스 로그를 확인합니다.

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    여기서 ORG, ENV, PORT#는 실제 값으로 대체됩니다.

  3. 특정 기간 동안 502 오류가 있었는지 (과거에 문제가 발생한 경우) 502와 함께 여전히 실패하는 요청이 있는지 검색합니다.
  4. protocol.http.TooBigBody 값과 일치하는 X-Apigee-fault-code 가 포함된 502 오류가 있으면 X-Apigee-fault-code 의 값을 확인합니다.

    NGINX 액세스 로그의 샘플 502 오류:

    NGINX 액세스 로그의 위 샘플 항목에는 X-Apigee-fault-codeX-Apigee-fault-source에 대한 값이 다음과 같습니다.

    응답 헤더
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-source target

원인: 응답 페이로드 크기가 허용된 제한보다 큽니다.

진단

  1. 시나리오 #1의 일반적인 진단 단계에 설명된 대로 API Monitoring, Trace 도구 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 결함 코드, 오류 소스, 응답 페이로드 크기를 확인합니다.
  2. 오류 소스의 값이 target이면 대상/백엔드 서버에서 Apigee로 보낸 응답 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 크다는 의미입니다.
  3. 1단계에서 결정한 대로 응답 페이로드 크기를 확인합니다.
  4. 다음 단계에 따라 실제 응답을 확인하여 응답 페이로드 크기가 실제로 허용된 한도인 10MB를 초과하는지 확인합니다.
    1. 대상/백엔드 서버에 대한 실제 요청에 액세스할 수 없는 경우 해결로 이동합니다.
    2. 대상/백엔드 서버에 대한 실제 요청에 액세스할 수 있는 경우 다음 단계를 수행합니다.
      1. 퍼블릭 클라우드/프라이빗 클라우드 사용자인 경우 백엔드 서버 자체 또는 백엔드 서버에 요청할 수 있는 다른 머신에서 백엔드 서버로 직접 요청을 보냅니다.
      2. Private Cloud 사용자인 경우 메시지 프로세서 중 하나에서 백엔드 서버에 요청할 수도 있습니다.
      3. Content-Length header를 확인하여 응답에 전달된 페이로드 크기를 확인합니다.
      4. 페이로드의 크기가 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>
    

    위의 예시에서는 Apigee Edge에서 허용되는 한도를 초과하므로 이 오류의 원인인 Content-Length: 11534336 (which is ~11 MB)를 확인할 수 있습니다.

해상도

해결 방법을 참고하세요.

원인: 압축 해제 후 응답 페이로드 크기가 허용 한도를 초과합니다.

응답 페이로드가 압축 형식으로 전송되고 응답 헤더 Content-Encodinggzip, 로 설정된 경우 Apigee는 응답 페이로드를 압축 해제합니다. 압축 해제 프로세스 중에 Apigee에서 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 큰 것을 발견하면 추가 압축 해제를 중지하고 즉시 502 Bad Gateway 및 오류 코드 protocol.http.TooBigBody를 반환합니다.

진단

  1. 시나리오 #2의 일반적인 진단 단계에 설명된 대로 API Monitoring, Trace 도구 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 결함 코드, 결함 소스, 응답 페이로드 크기를 결정합니다.
  2. 오류 소스의 값이 target이면 대상/백엔드 애플리케이션에서 Apigee로 보낸 응답 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 크다는 의미입니다.
  3. 1단계에서 결정한 대로 응답 페이로드 크기를 확인합니다.
    • 페이로드 크기가 허용 한도 10MB를 초과하면 오류가 발생한 것입니다.
    • 허용되는 페이로드 크기가 10MB를 초과하면 응답 페이로드가 압축된 형식으로 전달될 수 있습니다. 이 경우 압축된 응답 페이로드의 압축되지 않은 크기를 확인합니다.
  4. 타겟/백엔드의 응답이 압축된 형식으로 전송되었고 압축되지 않은 크기가 다음 방법 중 하나를 사용하여 허용된 제한보다 큰지 확인할 수 있습니다.

    Trace

    추적 도구 사용:

    1. 실패한 요청의 trace를 캡처한 경우 Trace
        에 자세히 설명된 단계를 참조하세요.
      1. target.received.content.length 값 확인
      2. 클라이언트의 요청에 Content-Encoding: gzip 헤더가 포함되었는지 확인
    2. target.received.content.length 값이 허용되는 제한(10MB) 정도이고 응답 헤더 target.received.content.length 이 목표이면 이 오류가 발생한 것입니다.

    실제 요청

    실제 요청 사용:

    1. 대상/백엔드 서버에 대한 실제 요청에 액세스할 수 없는 경우 해결로 이동합니다.
    2. 대상/백엔드 서버에 대한 실제 요청에 액세스할 수 있는 경우 다음 단계를 수행합니다.
      1. 응답에 전송된 Content-Encoding 헤더와 함께 응답에 전달된 페이로드 크기를 확인합니다.
      2. 응답 헤더 Content-Encodinggzip로 설정되어 있고 압축되지 않은 페이로드 크기가 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입니다.

    메시지 프로세서 로그

    Message Processor 로그 사용:

    1. Private Cloud 사용자는 메시지 프로세서 로그를 사용하여 HTTP 502 오류에 대한 주요 정보를 확인할 수 있습니다.
    2. 메시지 프로세서 로그 확인

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. 특정 기간 동안 502 오류가 있는지(과거에 문제가 발생한 경우) 또는 502와 함께 여전히 실패하는 요청이 있는지 검색합니다. 다음과 같은 검색 문자열을 사용할 수 있습니다.

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. system.log에서 아래와 유사한 행이 표시됩니다(TotalReadchunkCount은 경우에 따라 다를 수 있음).
      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)
      
    5. 압축 해제 과정 동안 메시지 프로세서는 총 읽기 바이트가 10MB를 초과하는 것으로 확인하면 즉시 중지하고 다음 줄을 출력합니다.

      Message is too large. TotalRead 10489856 chunkCount 2571

      응답 페이로드 크기가 10MB를 초과하고 크기가 10MB 한도를 초과하기 시작하면 오류 코드가 protocol.http.TooBigBody인 경우 Apigee에서 오류를 발생시킵니다.

해상도

크기 수정

옵션 #1 [권장]: Apigee 한도를 초과하는 페이로드 크기를 전송하지 않도록 대상 서버 애플리케이션 수정

  1. 특정 대상 서버에서 한도에 정의된 허용 한도를 초과하는 응답 / 페이로드 크기를 보내는 이유를 분석합니다.
  2. 원하지 않는 경우 허용 한도보다 작은 응답 / 페이로드를 전송하도록 대상 서버 애플리케이션을 수정하세요.
  3. 허용 한도를 초과하는 응답/페이로드를 전송하려면 다음 옵션으로 이동합니다.

서명된 URL 패턴

옵션 #2 [권장]: Apigee Java콜아웃 내에서 서명된 URL 패턴 사용

10MB보다 큰 페이로드의 경우 Apigee는 GitHub의 에지 콜아웃: 서명된 URL 생성기 예시에 설명된 대로 Apigee JavaCall 내에서 서명된 URL 패턴을 사용하는 것이 좋습니다.

스트리밍

옵션 #3: 스트리밍 사용

API 프록시가 매우 큰 요청 또는 응답을 처리해야 하는 경우 Apigee에서 스트리밍을 사용 설정할 수 있습니다.

CwC

옵션 #4: CwC 속성을 사용하여 버퍼 한도 늘리기

이 옵션은 권장 옵션을 사용할 수 없는 경우에만 사용해야 합니다. 기본 크기가 증가하면 성능 문제가 발생할 수 있기 때문입니다.

Apigee는 요청 및 응답 페이로드 크기 한도를 늘릴 수 있는 CwC 속성을 제공합니다. 자세한 내용은 라우터 또는 메시지 프로세서의 메시지 크기 한도 설정을 참조하세요.

한도

Apigee에서는 클라이언트 애플리케이션과 백엔드 서버에서 Apigee Edge 한도 Request/response size에 설명된 허용 한도를 초과하는 페이로드 크기를 전송하지 않을 것으로 예상합니다.

  1. 퍼블릭 클라우드 사용자인 경우 요청 및 응답 페이로드 크기의 최대 한도는 Apigee Edge 한도Request/response size에 설명되어 있습니다.
  2. Private Cloud 사용자 의 경우 권장되지는 않지만 요청 및 응답 페이로드 크기의 기본 최대 한도를 수정했을 수 있습니다. 현재 한도를 확인하는 방법의 안내에 따라 최대 요청 페이로드 크기 한도를 확인할 수 있습니다.

현재 한도를 확인하는 방법

이 섹션에서는 HTTPResponse.body.buffer.limit 속성이 메시지 프로세서의 새 값으로 업데이트되었는지 확인하는 방법을 설명합니다.

  1. 메시지 프로세서 시스템의 /opt/apigee/edge-message- processor/conf 디렉터리에서 HTTPResponse.body.buffer.limit 속성을 검색하고 어떤 값이 아래와 같이 설정되어 있는지 확인합니다.

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. 위 명령어의 샘플 결과는 다음과 같습니다.

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
    
  3. 위의 출력 예에서 HTTPResponse.body.buffer.limit 속성이 http.properties10m 값으로 설정되어 있음을 알 수 있습니다.

    프라이빗 클라우드용 Apigee에 구성된 요청 페이로드 크기의 한도가 10MB임을 나타냅니다.

Apigee 지원의 도움이 더 필요하면 진단 정보 수집 필수로 이동하세요.

진단 정보 수집 필요

다음 진단 정보를 수집한 다음 Apigee Edge 지원팀에 문의하세요.

Public Cloud 사용자인 경우 다음 정보를 제공합니다.

  • 조직 이름
  • 환경 이름
  • API 프록시 이름
  • 502 오류를 재현하는 데 사용된 전체 curl 명령어
  • API 요청에 대한 추적 파일
  • 페이로드 크기와 함께 대상/백엔드 서버의 응답을 빠짐없이 출력

Private Cloud 사용자인 경우 다음 정보를 제공하세요.

  • 실패한 요청에 대해 발견된 전체 오류 메시지
  • 조직 이름
  • 환경 이름
  • 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