413 요청 항목이 너무 큼 - TooBigBody

Apigee Edge 문서를 보고 있습니다.
Apigee X 문서로 이동하세요.
info

증상

클라이언트 애플리케이션은 API 호출의 응답으로 오류 코드 protocol.http.TooBigBody 와 함께 HTTP 상태 코드 413 Request Entity Too Large를 받습니다.

오류 메시지

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

HTTP/1.1 413 Request Entity Too Large

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

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

가능한 원인

이 오류는 클라이언트 애플리케이션에 의해 Apigee Edge에 HTTP 요청의 일부로 전송되는 페이로드 크기가 Apigee Edge에 허용되는 한도보다 큰 경우에 발생합니다 .

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

원인 설명 다음에 관한 문제 해결 안내
요청 페이로드 크기가 허용된 한도를 초과함 Apigee Edge에 대한 HTTP 요청의 일부로 클라이언트 애플리케이션에 의해 전송되는 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 큽니다. Edge Public 및 Private Cloud 사용자
압축 해제 후 요청 페이로드 크기가 허용된 한도를 초과함 클라이언트 애플리케이션이 Apigee Edge에 대한 HTTP 요청의 일부로 압축된 형식으로 전송한 페이로드 크기가 Apigee Edge에서 압축 해제될 때 허용되는 한도를 초과합니다. Edge Public 및 Private Cloud 사용자

일반적인 진단 단계

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

API 모니터링

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

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

  3. 분석 > API 모니터링 > 조사 페이지로 이동합니다.
  4. 오류가 발생한 구체적인 기간을 선택합니다.
  5. 프록시 필터를 선택하여 오류 코드를 좁힐 수 있습니다.
  6. 시간에 대한 오류 코드를 표시합니다.
  7. 아래와 같이 오류 코드 protocol.http.TooBigBody와 상태 코드 413가 있는 셀을 선택합니다.

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

  9. 로그 보기를 클릭하고 실패한 요청의 행을 펼칩니다. 그런 다음 로그 창에서 아래와 같이 세부정보를 확인합니다.

    비압축

    시나리오 1: 요청 페이로드가 압축되지 않은 형식으로 전송됨

    로그 창에서 다음 세부정보를 확인합니다.

    • 상태 코드: 413
    • 결함 소스: proxy
    • 오류 코드: protocol.http.TooBigBody
    • 요청 길이(바이트): 15360440 (~15MB)

    오류 소스 값이 proxy이고 오류 코드 값이 protocol.http.TooBigBody이며 요청 길이가 10MB를 초과하면 클라이언트의 HTTP 요청에 Apigee에서 허용되는 한도보다 큰 요청 페이로드 크기가 있음을 나타냅니다.

    압축

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

    로그 창에서 다음 세부정보를 확인합니다.

    • 상태 코드: 413
    • 결함 소스: proxy
    • 오류 코드: protocol.http.TooBigBody
    • 요청 길이(바이트): 15264 (~15KB)

    오류 소스 값이 proxy이고 오류 코드 값이 protocol.http.TooBigBody이며 요청 길이가 10MB 미만이면 클라이언트의 HTTP 요청에 압축 형식의 허용 한도보다 낮은 요청 페이로드 크기가 있지만 Apigee에서 압축 해제할 때 페이로드 크기가 허용 한도보다 크다는 것을 나타냅니다.

Trace

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

  1. 추적 세션을 사용 설정하고 다음 중 하나를 사용합니다.
    • 413 Request Entity Too Large 오류가 발생할 때까지 기다리거나
    • 문제를 재현할 수 있는 경우 API를 호출하고 413 Request Entity Too Large 오류를 재현합니다.
  2. 모든 흐름 정보 표시가 사용 설정되어 있는지 확인합니다.

  3. 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
  4. 클라이언트로부터 요청 수신 단계로 이동합니다.

    비압축

    시나리오 1: 요청 페이로드가 압축되지 않은 형식으로 전송됨

    다음 정보를 참고하세요.

    • Content-Encoding: 없음
    • Content-Length: 15360204

    압축

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

    다음 정보를 참고하세요.

    • Content-Encoding: gzip
    • Content-Length: 14969
    • Content-Type: application/x-gzip
  5. 트레이스의 여러 단계를 탐색하여 장애가 발생한 위치를 찾습니다.
  6. 일반적으로 아래와 같이 클라이언트에서 요청 수신 단계 이후의 흐름에서 오류가 발생합니다.

  7. 트레이스에서 오류 값을 확인합니다. 위 샘플 트레이스에는 다음이 표시됩니다.
    • 오류: Body buffer overflow
    • error.class: com.apigee.errors.http.user.RequestTooLarge
  8. 클라이언트에 전송된 응답으로 이동하여 트레이스에서 오류 값을 확인합니다. 아래 샘플 트레이스에는 다음이 표시됩니다.

    • 오류: 413 Request Entity Too Large
    • 오류 콘텐츠: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  9. 트레이스에서 AX (분석 데이터 기록됨) 단계로 이동하여 클릭합니다.
  10. 단계 세부정보 섹션에서 변수 읽기까지 아래로 스크롤합니다.

  11. client.received.content.length 변수의 값을 확인합니다. 이 변수는 다음을 나타냅니다.
    • 압축되지 않은 형식으로 전송되는 경우 요청 페이로드의 실제 크기
    • 페이로드가 압축 형식으로 전송될 때 Apigee에서 압축 해제한 요청 페이로드의 크기입니다. 이 시나리오에서는 항상 허용된 한도 (10MB)의 값과 동일합니다.

    비압축

    시나리오 1: 압축되지 않은 형식의 요청 페이로드

    client.received.content.length 변수: 15360204

    압축

    시나리오 2: 압축 형식의 요청 페이로드

    client.received.content.length 변수: 10489856

  12. 다음 표에서는 client.received.content.length 변수의 값에 따라 두 시나리오에서 Apigee가 413 오류를 반환하는 이유를 설명합니다.
    시나리오 client.received.content.length 값 실패 이유
    압축되지 않은 형식의 요청 페이로드 ~15MB 크기가 허용된 한도인 10MB를 초과합니다.
    압축된 형식의 요청 페이로드 ~10MB

    압축 해제 시 크기 제한 초과

NGINX

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

  1. 비공개 클라우드 사용자인 경우 NGINX 액세스 로그를 사용하여 HTTP 413 오류에 관한 주요 정보를 확인할 수 있습니다.
  2. NGINX 액세스 로그를 확인합니다.

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

  3. 특정 기간 동안 413 오류가 있는지 (문제가 과거에 발생한 경우) 또는 413로 인해 여전히 실패하는 요청이 있는지 검색합니다.
  4. X-Apigee-fault-code가 protocol.http.TooBigBody 값과 일치하는 413 오류가 발견되면 X-Apigee-fault-source 값을 확인합니다.

    비압축

    시나리오 1 : 비압축 형식의 요청 페이로드 크기

    위의 NGINX 액세스 로그 샘플 항목에는 X-Apigee-fault-code 및 X-Apigee-fault-source에 다음 값이 있습니다.

    응답 헤더 값
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-sourc policy

    요청 길이: 15360440 (14.6MB > 허용된 한도)

    압축

    시나리오 2 : 압축 형식의 요청 페이로드 크기

    위의 NGINX 액세스 로그 샘플 항목에는 X-Apigee-fault-code 및 X-Apigee-fault-source에 다음 값이 있습니다.

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

    요청 길이: 15264 (허용된 한도 미만)

    이 시나리오에서는 요청이 압축된 형식으로 전송되었을 수 있고 Apigee Edge에서 압축 해제 시 페이로드 크기가 한도를 초과하므로 요청 길이가 허용된 한도보다 낮더라도 Apigee Edge에서 413를 반환합니다.

원인: 요청 페이로드 크기가 허용된 한도보다 큼

진단

  1. 시나리오 1 (압축되지 않음)의 일반적인 진단 단계에 설명된 대로 API 모니터링, 추적 도구 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드, 오류 소스, 요청 페이로드 크기를 확인합니다.
  2. 오류 소스 값이 policy 또는 proxy인 경우 클라이언트 애플리케이션에서 Apigee로 전송한 요청 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 크다는 것을 나타냅니다.
  3. 1단계에서 확인한 요청 페이로드 크기를 확인합니다.
  4. 다음 단계에 따라 실제 요청을 확인하여 요청 페이로드 크기가 허용된 한도인 10MB를 초과하는지 확인할 수도 있습니다.
    1. 클라이언트 애플리케이션에서 만든 실제 요청에 액세스할 수 없는 경우 해결 방법으로 이동하세요.
    2. 클라이언트 애플리케이션에서 보낸 실제 요청에 액세스할 수 있는 경우 다음 단계를 실행합니다.
      1. 요청에 전달된 페이로드의 크기를 확인합니다.
      2. 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 큰 경우 문제가 발생합니다.
      3. 샘플 요청:

        curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
        

        위의 경우 파일 test15mbfile은 약 15MB입니다. 다른 클라이언트를 사용하는 경우 클라이언트 로그를 가져와 전송되는 페이로드 크기를 확인합니다.

해상도

해결 방법으로 이동합니다.

원인: 요청 페이로드 크기가 압축 해제 후 허용된 한도를 초과함

요청 페이로드가 압축 형식으로 전송되고 요청 헤더 Content-Encoding이 gzip, 로 설정되면 Apigee가 요청 페이로드를 압축 해제합니다. 압축 해제 프로세스 중에 Apigee가 페이로드 크기가 10MB, 즉 허용된 한도보다 크다고 판단하면 추가 압축 해제를 중지하고 오류 코드 protocol.http.TooBigBody과 함께 413 Request Entity Too Large로 즉시 응답합니다.

진단

  1. API 모니터링, 추적 도구 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드, 오류 소스, 요청 페이로드 크기를 확인합니다. 시나리오 2 (압축)의 일반적인 진단 단계에 설명되어 있습니다.
  2. 오류 소스 값이 policy 또는 proxy인 경우 클라이언트 애플리케이션에서 Apigee로 전송한 요청 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 크다는 것을 나타냅니다.
  3. 1단계에서 결정된 요청 페이로드 크기를 확인합니다.
    • 페이로드 크기가 허용된 한도인 10MB를 초과하면 오류가 발생합니다.
    • 페이로드 크기가 허용된 10MB 한도 미만이면 요청 페이로드가 압축된 형식으로 전달되었을 수 있습니다. 이 경우 압축된 요청 페이로드의 압축되지 않은 크기를 확인합니다.
  4. 다음 방법 중 하나를 사용하여 클라이언트의 요청이 압축 형식으로 전송되었는지, 압축 해제된 크기가 허용된 한도를 초과하는지 확인할 수 있습니다.

    Trace

    Trace 도구를 사용하여 검증하려면 다음 단계를 따르세요.

    1. 실패한 요청의 트레이스를 캡처한 경우 트레이스 및
      1. client.received.content.length 변수의 값 확인
      2. 클라이언트의 요청에 Content-Encoding: gzip 헤더가 포함되어 있는지 확인합니다.
    2. client.received.content.length 변수 값이 10MB( 허용된 한도)보다 크고 요청 헤더가 Content-Encoding: gzip인 경우 이 오류가 발생합니다.

    실제 요청

    실제 요청을 사용하여 검증하려면 다음 단계를 따르세요.

    1. 클라이언트 애플리케이션에서 실제로 요청한 내용에 액세스할 수 없는 경우 해결 방법으로 이동하세요.
    2. 클라이언트 애플리케이션에서 보낸 실제 요청에 액세스할 수 있는 경우 다음 단계를 실행합니다.
      1. 요청에 전달된 페이로드의 크기와 요청에 전송된 Content-Encoding 헤더를 확인합니다.
      2. 압축 해제된 페이로드 크기가 Apigee Edge에서 허용되는 한도보다 큰지 확인합니다.

        샘플 요청:

        curl https://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile.gz -H "Content-Encoding: gzip" -v
        

        위의 경우 파일 test15mbfile.gz 는 크기 제한 미만입니다. 하지만 압축 해제된 파일 test15mbfile의 크기는 약 15MB이고 Content-Encoding 헤더는 gzip입니다.

        다른 클라이언트를 사용하는 경우 클라이언트 로그를 가져와 전송되는 페이로드 크기를 확인하고 Content-Encoding 헤더가 gzip로 설정되어 있는지 확인합니다.

    메시지 프로세서 로그

    메시지 프로세서 로그를 사용하여 유효성을 검사하려면 다음 단계를 따르세요.

    1. 비공개 클라우드 사용자인 경우 메시지 프로세서 로그를 사용하여 HTTP 413 오류에 관한 주요 정보를 확인할 수 있습니다.
    2. 메시지 프로세서 로그를 확인합니다.

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

    3. 특정 기간 동안 413 오류가 있는지 (문제가 과거에 발생한 경우) 또는 413로 인해 여전히 실패하는 요청이 있는지 검색합니다.

      다음 검색 문자열을 사용할 수 있습니다.

      grep -ri "chunkCount"
      
      grep -ri "RequestTooLarge"
      
    4. 다음과 유사한 system.log의 줄이 표시됩니다(TotalRead 및 chunkCount는 경우에 따라 다를 수 있음).
      2021-07-06 13:29:57,544  NIOThread@1 ERROR HTTP.SERVICE -
        TrackingInputChannel.checkMessageBodyTooLarge()
        : Message is too large.  TotalRead 10489856 chunkCount 2570
      
      2021-07-06 13:29:57,545  NIOThread@1 INFO  HTTP.SERVICE -
        ExceptionHandler.handleException()
        : Exception trace: com.apigee.errors.http.user.RequestTooLarge
        : Body buffer overflow
    5. 압축 해제 프로세스 중에 메시지 프로세서가 총 읽기 바이트가 10MB보다 크다고 판단하면 중지되고 다음 줄이 출력됩니다.
      Message is too large.  TotalRead 10489856 chunkCount 2570

      요청 페이로드 크기가 10MB를 초과하며 크기가 10MB 한도를 초과하기 시작하면 Apigee에서 오류 RequestTooLarge를 발생시키고 오류 코드는 protocol.http.TooBigBody입니다.

해상도

크기 수정

옵션 1[권장]: 허용된 한도보다 큰 페이로드 크기를 보내지 않도록 클라이언트 애플리케이션 수정

  1. 특정 클라이언트가 한도에 정의된 허용 한도보다 많은 요청 / 페이로드 크기를 전송하는 이유를 분석합니다.
  2. 바람직하지 않은 경우 허용된 한도보다 작은 요청 / 페이로드 크기를 전송하도록 클라이언트 애플리케이션을 수정하세요.

    위에서 설명한 예에서는 아래와 같이 더 작은 크기의 파일, 예를 들어 test5mbfile (크기가 5MB) 페이로드를 전달하여 문제를 해결할 수 있습니다.

    curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
    
  3. 허용된 한도보다 많은 요청/페이로드를 전송하려면 다음 옵션으로 이동하세요.

서명된 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에 대해 설명된 허용 한도를 초과하는 페이로드 크기를 전송하지 않을 것으로 예상합니다.

  1. Public Cloud 사용자인 경우 요청 및 응답 페이로드 크기의 최대 한도는 Apigee Edge 한도에 Request/response size에 대해 설명된 대로입니다.
  2. 프라이빗 클라우드 사용자 인 경우 요청 및 응답 페이로드 크기의 기본 제한을 수정했을 수 있습니다 (권장되는 방법은 아님). 현재 한도 확인 방법의 안내에 따라 최대 요청 페이로드 크기 한도를 확인할 수 있습니다.

현재 한도를 확인하는 방법

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

  1. 메시지 프로세서 머신에서 /opt/apigee/edge-message- processor/conf 디렉터리의 HTTPRequest.body.buffer.limit 속성을 검색하고 다음 명령어를 사용하여 설정된 값을 확인합니다.
    grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. 위 명령어의 샘플 결과는 다음과 같습니다.
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
  3. 위의 예시 출력에서 HTTPRequest.body.buffer.limit 속성이 http.properties의 10m 값으로 설정되었습니다.

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

Apigee 지원팀의 지원이 여전히 필요한 경우 진단 정보를 수집해야 함으로 이동하세요.

진단 정보 수집 필요

다음 진단 정보를 수집한 후 Apigee Edge 지원팀에 문의합니다.

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

  • 조직 이름
  • 환경 이름
  • API 프록시 이름
  • 413 오류를 재현하는 데 사용된 전체 curl 명령어
  • API 요청의 추적 파일

프라이빗 클라우드 사용자인 경우 다음 정보를 제공하세요.

  • 실패한 요청에 대해 확인된 전체 오류 메시지
  • 조직 이름
  • 환경 이름
  • API 프록시 번들
  • 실패한 API 요청의 트레이스 파일
  • 413 오류를 재현하는 데 사용된 전체 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