502 잘못된 게이트웨이 - TooBigLine

Apigee Edge 문서입니다.
Go to the Apigee X documentation.
info

증상

클라이언트 애플리케이션에 API 호출의 응답으로 오류 코드 protocol.http.TooBigLine 과 함께 HTTP 상태 코드 502 Bad Gateway가 발생합니다.

오류 메시지

클라이언트 애플리케이션에 다음 응답 코드가 발생합니다.

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

가능한 원인

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

이 오류의 가능한 원인을 살펴보기 전에 응답 라인이란 무엇이며 크기를 확인하는 방법을 알아보겠습니다.

응답 라인 이해하기

일반적인 HTTP 응답은 세 부분으로 구성됩니다.

  1. 상태 라인 (Apigee에서 응답 라인이라고 함)
  2. ( HTTP 헤더 집합 )
  3. [ 본문 ]

응답 라인은 아래와 같이 프로토콜 버전 과 숫자 상태 코드 및 연결된 텍스트 문구 의 세 부분으로 구성됩니다.

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

대상/백엔드 서버 애플리케이션에서 HTTP 응답을 전송할 때 전송되는 첫 번째 줄은 위에 설명된 응답 라인을 나타냅니다. 그 뒤에 헤더와 응답 본문/페이로드가 옵니다.다음 샘플 스크린샷은 일반적인 curl 요청, 요청 부분, 응답 부분 (응답 라인 포함)을 보여줍니다.

응답 라인 크기 이해하기

  1. 위에서 설명한 샘플에서 응답의 시작 줄 (첫 번째 줄)은 응답 라인이라고도 하며 다음과 같습니다.

    HTTP/1.1 200 OK

    이 응답 라인은 15 ASCII characters를 포함하므로 크기가 ~15 bytes입니다. 이 크기는 Apigee Edge에서 허용되는 한도 내에 있으므로 Apigee Edge에서 오류 없이 응답이 클라이언트로 다시 전송됩니다.

  2. 마찬가지로 위에 표시된 오류 메시지의 faultstring을 살펴보면 "response line size exceeding 2,048"이 포함되어 있습니다. 이는 대상/백엔드 서버에서 전송된 HTTP 응답의 응답 라인이 2,048바이트를 초과했음을 나타냅니다.

큰 응답 라인 이해하기

상태 라인 (여기서는 응답 라인이라고 함)의 정의와 일반적인 HTTP 요청 및 응답에 따라 크기는 Apigee Edge에서 정의된 기본 한도인 2K보다 훨씬 작으므로 한도에 도달하지 않을 수 있습니다. 하지만 이 한도를 초과할 수 있는 몇 가지 가능한 시나리오는 다음과 같습니다.

  1. 대상/백엔드 서버가 HTTP 시스템이 아닙니다. HTTP가 아닌 응답으로 응답할 수 있습니다.
  2. 대상/백엔드 서버에 문제가 있어 HTTP 응답의 일부로 긴 응답 라인을 전송합니다.

자세한 내용은 오류 protocol.http.TooBigLine, 'response line size exceeding 2,048' 가져오기를 참고하세요.

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

원인 설명 다음에 관한 문제 해결 안내
응답 라인 크기가 허용된 한도보다 큼 Apigee Edge에 대한 HTTP 응답의 일부로 대상/백엔드 서버에서 전송되는 응답 라인 의 크기가 Apigee Edge에서 허용되는 한도보다 큽니다. Edge Public 및 Private Cloud 사용자

일반적인 진단 단계

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

API 모니터링

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

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

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

    ( 큰 이미지 보기)

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

    ( 큰 이미지 보기)

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

  10. 로그 창에서 다음 세부정보를 확인합니다.
    • 상태 코드: 502
    • 오류 소스: target
    • 오류 코드: protocol.http.TooBigLine.
  11. 오류 소스 의 값이 target이고 오류 코드 의 값이 protocol.http.TooBigLine이면 대상/ 백엔드 서버의 HTTP 응답에 Apigee Edge에서 허용되는 최대 한도보다 큰 응답 라인 크기가 있음을 나타냅니다.

Trace 도구

  1. trace 세션을 사용 설정하고 다음 중 하나를 수행합니다.
    1. 502 Bad Gateway 오류가 발생할 때까지 기다립니다. 또는
    2. 문제를 재현할 수 있는 경우 API를 호출하고 502 Bad Gateway 오류를 재현합니다.
  2. 실패한 요청 중 하나를 선택하고 trace를 검사합니다.
  3. trace의 여러 단계를 탐색하고 실패가 발생한 위치를 찾습니다.
  4. 일반적으로 아래와 같이 대상 서버로 전송된 요청 단계 바로 뒤에 있는 flowinfo 오류 에서 오류를 찾을 수 있습니다.

    trace에서 오류 값을 확인합니다.

    • 오류: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

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

  5. 아래와 같이 클라이언트로 전송된 클라이언트 단계에서 클라이언트로 전송된 오류 메시지가 표시됩니다.

    ( 큰 이미지 보기)

  6. trace에서 오류 값을 확인합니다.
    • 오류: 502 Bad Gateway.
    • 오류 콘텐츠: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. trace의 AX (기록된 분석 데이터) 단계로 이동하여 클릭하여 오류 세부정보를 확인할 수도 있습니다.

    ( 큰 이미지 보기)

    다음 값을 확인합니다.

    요청 헤더 값
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    오류 콘텐츠 : 본문 {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

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. X-Apigee-fault-code 가 protocol.http.TooBigLine 의 값과 일치하는 502 오류를 발견하면 X-Apigee-fault-source 의 값을 확인합니다.

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

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

원인: 응답 라인 크기가 허용된 한도보다 큼

진단

  1. 일반적인 진단 단계에 설명된 대로 API 모니터링, Trace 도구 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드 및 오류 소스를 확인합니다.
  2. 오류 소스 의 값이 target이면 대상/백엔드 서버 애플리케이션에서 Apigee로 전송된 응답 라인 크기가 Apigee Edge에서 허용되는 한도보다 크다는 것을 나타냅니다.
  3. 다음 방법 중 하나를 사용하여 응답 라인 크기가 허용된 한도인 2KB를 초과했는지 확인할 수 있습니다 .

    오류 메시지

    오류 메시지를 사용하여 확인하려면 다음 단계를 따르세요.

    Apigee Edge에서 수신한 전체 오류 메시지에 액세스할 수 있는 경우 faultstring을 참조하세요.

    샘플 오류 메시지:

    "faultstring":"response line size exceeding 2,048"

    위의 faultstring은 응답 라인 크기가 허용된 한도인 2KB를 초과했음을 나타냅니다.

    실제 요청

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

    대상/백엔드 서버 애플리케이션에 대한 실제 요청에 액세스할 수 있는 경우 다음 단계를 수행합니다.

    1. 응답 라인 크기를 확인합니다.
    2. URI 크기가 Apigee Edge에서 허용되는 한도보다 크면 문제가 발생합니다.

      대상/백엔드 서버의 샘플 응답:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0

      위의 경우 응답 라인 HTTP/1.1 200 1111…<trimmed>...11111111이 2KB보다 큽니다. 즉, 2K ASCII 문자를 초과합니다.

      다른 클라이언트를 사용하는 경우 클라이언트 로그를 검토하고 응답 라인 크기를 확인해 볼 수 있습니다. Apigee Edge로 전송됩니다.

    메시지 프로세서 로그

    메시지 프로세서 로그를 사용하여 확인하려면 다음 단계를 따르세요.

    Private Cloud 사용자인 경우 메시지 프로세서 로그를 사용하여 응답 라인 크기가 Apigee Edge에서 허용되는 한도를 초과했는지 확인할 수 있습니다.

    1. 일반적인 진단 단계에 설명된 대로 API 모니터링, Trace 도구, 또는 NGINX 액세스 로그를 사용하여 실패한 요청의 메시지 ID를 확인합니다.
    2. 메시지 프로세서 로그에서 메시지 ID를 검색합니다.

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

    3. 다음과 유사한 system.log의 줄이 표시됩니다.

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)

      위 오류 메시지의 텍스트 message = response line size exceeding 2,048은 응답 라인 크기가 2KB를 초과함을 나타냅니다. 따라서 Apigee Edge는 예외를 발생시키고 오류 코드 protocol.http.TooBigline 와 함께 502 상태 코드를 클라이언트 애플리케이션에 반환합니다.

해상도

크기 수정

옵션 1[권장]: 대상/백엔드 서버 애플리케이션이 허용된 한도보다 큰 응답 라인을 전송하지 않도록 수정

  1. 한도에 정의된 대로 특정 클라이언트가 허용된 한도보다 큰 응답 라인을 전송하는 이유를 분석합니다 한도.
  2. 원하지 않는 경우 대상/백엔드 서버 애플리케이션이 허용된 한도보다 작은 응답 라인을 전송하도록 수정합니다.
  3. 원하는 경우 허용된 한도보다 큰 응답 라인을 전송하려면 다음 옵션으로 이동합니다.

CwC

옵션 2: CwC 속성을 사용하여 응답 라인 한도 늘리기

Apigee는 응답 라인 크기 한도를 늘릴 수 있는 CwC 속성을 제공합니다. 자세한 내용은 메시지 프로세서에서 응답 라인 한도 설정을 참고하세요.

한도

Apigee는 클라이언트 애플리케이션과 백엔드 서버가 Apigee Edge 한도의 요청/응답 라인 한도 에 문서화된 대로 허용된 한도보다 큰 요청/응답 라인 을 전송하지 않도록 합니다.

  1. Public Cloud 사용자인 경우 요청 및 응답 라인 크기의 최대 한도는 요청/응답 라인 크기에 문서화된 대로입니다.
  2. **Private Cloud 사용자** 인 경우 요청 및 응답 라인 크기의 기본 최대 한도를 수정했을 수 있습니다 (권장되는 방법은 아님). 현재 한도를 확인하는 방법 의 안내에 따라 최대 응답 라인 크기 한도를 확인할 수 있습니다.

현재 한도를 확인하는 방법

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

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

    이는 Private Cloud용 Apigee에 구성된 응답 라인 크기의 한도가 2KB 임을 나타냅니다.

Apigee 지원팀의 지원이 필요한 경우 진단 정보 수집 필요로 이동하세요.

진단 정보 수집 필요

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

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

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

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

  • 실패한 요청에 대해 관찰된 전체 오류 메시지
  • 조직 이름
  • 환경 이름
  • API 프록시 번들
  • 실패한 API 요청의 trace 파일
  • 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