502 잘못된 게이트웨이 - DuplicateHeader

Apigee Edge 문서입니다.
Go to the Apigee X 문서로 이동합니다.
info

증상

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

오류 메시지

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

HTTP/1.1 502 Bad Gateway

또한 아래와 비슷한 오류 메시지가 표시될 수 있습니다.

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

가능한 원인

이 오류는 Apigee Edge에서 중복 항목을 갖도록 허용되지 않는 특정 HTTP 헤더가 동일하거나 서로 다른 값을 사용해서 백엔드 서버에서 Apigee Edge로 전송되는 HTTP 응답의 일부로 한 번 이상 표시되는 경우에 발생합니다.

RFC 7230, 섹션 3.2.2: 필드 순서, 에 따라 발신자는 해당 헤더 필드의 전체 필드 값이 쉼표로 구분된 목록으로 정의되거나([예: #(values)]) 헤더 필드가 잘 알려진 예외인 경우를 제외하고 메시지에서 동일한 필드 이름으로 여러 헤더 필드를 생성해서는 안 됩니다. Apigee Edge는 중복 항목을 갖도록 허용되지 않는 특정 동일한 헤더가 대상/백엔드 서버에서 전송된 HTTP 응답 에서 두 번 이상 전송되는 것을 발견하면 502 Bad Gateway 및 오류 코드 protocol.http.DuplicateHeader로 응답합니다.

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

원인 설명 다음에 관한 문제 해결 안내
응답의 중복 헤더 백엔드 서버의 응답에 중복 헤더가 포함되어 있습니다. Edge Public 및 Private Cloud 사용자

일반적인 진단 단계

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

API 모니터링

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

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

  3. 분석 > API 모니터링 > 조사 페이지로 이동합니다.
  4. 오류가 발생한 특정 기간을 선택합니다.
  5. 프록시 필터가 모두 로 설정되어 있는지 확인합니다.
  6. 오류 코드시간 에 대해 표시합니다.
  7. 아래와 같이 오류 코드 protocol.http.DuplicateHeader가 있는 셀을 선택합니다.

    (큰 이미지 보기)

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

    (큰 이미지 보기)

  9. 위의 예와 같이 상태 코드502인지 확인합니다.
  10. 로그 보기 를 클릭하고 실패한 요청의 행을 펼칩니다.
  11. 로그 창에서 다음 세부정보를 확인합니다.

    • 상태 코드: 502
    • 오류 소스: target
    • 오류 코드: protocol.http.DuplicateHeader.
  12. 오류 소스target입니다. 이는 백엔드 서버의 응답에 중복 헤더가 포함되어 있음을 나타냅니다.

Trace 도구

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

  1. trace 세션을 사용 설정하고 다음 중 하나를 수행합니다.
    1. 502 Bad Gateway 오류가 발생할 때까지 기다립니다.
    2. 문제를 재현할 수 있는 경우 API를 호출하고 502 Bad Gateway 오류를 재현합니다.
  2. 모든 흐름 정보 표시 가 사용 설정되어 있는지 확인합니다.

  3. 실패한 요청 중 하나를 선택하고 trace를 검사합니다.
  4. trace의 여러 단계를 탐색하고 실패가 발생한 위치를 찾습니다.
  5. 일반적으로 아래와 같이 대상 서버에 전송된 요청 단계 후 흐름에서 오류가 발생합니다.

    (큰 이미지 보기)

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

    위의 샘플 trace는 오류를 Duplicate Header "Expires"로 보여줍니다. 요청이 백엔드 서버로 전송된 후 Apigee에서 오류가 발생했으므로 백엔드 서버가 Expires 헤더를 두 번 이상 전송했음을 나타냅니다.

  7. trace에서 AX (기록된 분석 데이터) 단계로 이동하여 클릭합니다.
  8. 아래와 같이 단계 세부정보 - 응답 헤더 섹션으로 스크롤하고 X-Apigee-fault-codeX-Apigee-fault-source 값을 확인합니다.

    (큰 이미지 보기)

  9. X-Apigee-fault-codeX-Apigee-fault-source 값이 protocol.http.DuplicateHeadertarget으로 표시됩니다. 이는 백엔드 서버가 응답 헤더 Expires에 중복 헤더를 전달했기 때문에 이 오류가 발생했음을 나타냅니다.
    응답 헤더
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. 프록시 체이닝을 사용하고 있는지, 즉 대상 서버 또는 대상 엔드포인트가 Apigee에서 다른 프록시를 호출하는지 확인합니다.

    1. 이를 확인하려면 대상 서버에 전송된 요청 단계로 돌아갑니다. Curl 표시 를 클릭합니다.

    2. 대상 서버에 전송된 요청의 Curl 창이 열립니다. 여기서 대상 서버 호스트 별칭을 확인할 수 있습니다.

    3. 대상 서버 호스트 별칭이 가상 호스트 별칭을 가리키는 경우 프록시 체이닝입니다. 이 경우 502 Bad Gateway 오류의 실제 원인을 확인할 때까지 체이닝된 프록시에 대해 위의 모든 단계를 반복해야 합니다.
    4. 대상 서버 호스트 별칭이 백엔드 서버를 가리키는 경우 백엔드 서버가 Apigee에 대한 응답으로 중복 헤더를 전송하고 있음을 나타냅니다.

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

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

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

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

원인: 응답의 중복 헤더

진단

  1. 일반적인 진단 단계에 설명된 대로 API 모니터링 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드오류 소스 를 확인합니다.
  2. 오류 소스target 값이 있으면 대상 서버에서 전송된 응답에 중복 헤더가 포함되어 있음을 나타냅니다.
  3. 다음 방법 중 하나를 사용하여 응답의 일부로 두 번 이상 전송되는 실제 헤더를 확인할 수 있습니다.

    오류 메시지

    오류 메시지 사용:

    1. Apigee Edge에서 수신한 전체 오류 메시지에 액세스할 수 있는 경우 faultstring을 참조하세요. faultstring에는 두 번 이상 전송된 헤더 이름이 포함되어 있습니다.

      샘플 오류 메시지:

      "faultstring":"Duplicate Header \"Expires\""
    2. 위의 오류 메시지에서 faultstring에 표시된 대로 Expires 헤더가 두 번 이상 전송되었음을 확인할 수 있습니다.

    실제 요청

    실제 요청 사용:

    1. 대상 서버에 대한 실제 요청에 액세스할 수 없는 경우 해당하는 curl 명령어를 Trace 도구 사용의 10.a단계 및 10.b단계에서 가져옵니다.
    2. 대상 서버 애플리케이션에 대한 실제 요청에 액세스할 수 있는 경우 다음 단계를 수행합니다.

      1. 대상 서버를 호출합니다.

        이 예에서 사용된 대상 서버의 샘플 요청:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. 응답에 표시된 헤더 목록을 확인합니다.

        이 예에서 사용된 대상 서버의 샘플 응답:

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0

        위의 샘플 요청에서 Expires 헤더가 두 번 이상 전송되었습니다. 따라서 이 요청은 502 Bad Gateway 오류 및 오류 코드 protocol.http.DuplicateHeader로 실패합니다.

      3. faultstring에 이름이 표시되는 헤더가 백엔드 서버의 응답에 두 번 이상 표시되면 이 오류의 원인이 됩니다. 위의 경우 Expires 헤더가 두 번 이상 전송되었습니다.

해상도

중복 수정

옵션 1[권장 옵션] 중복 헤더를 포함하지 않도록 백엔드 서버 수정

  1. 특정 백엔드 서버가 중복 헤더 Expires를 전송하는 이유를 분석하고 API 프록시에서 이를 허용해도 되는지 확인합니다. 대부분의 경우 HTTP 사양 RFC7230에 따라 바람직하지 않습니다.
  2. 바람직하지 않은 경우 중복 헤더를 전송하지 않도록 대상 서버 애플리케이션을 수정합니다. 위에서 설명한 예에서는 헤더 Expires가 동일한 값으로 두 번 전송되는 것을 확인할 수 있습니다. 이는 바람직하지 않습니다. 대상 서버가 Expires 헤더를 한 번만 전달하도록 하면 문제를 해결할 수 있습니다.
  3. 바람직하고 중복 헤더를 허용하려면 CwC 속성 사용 옵션 2로 이동합니다.

CwC

옵션 2 CwC 속성 사용

Apigee는 클라이언트 애플리케이션과 대상 서버가 Apigee Edge의 API 프록시에 중복 헤더를 전송할 수 있도록 하는 CwC 속성 HTTPHeader.<HeaderName>을 제공합니다.

CwC 속성
HTTPHeader.<HeaderName> allowDuplicates,multivalued

예를 들어 메시지 프로세서에서 다음 속성을 설정하여 Expires 헤더에 중복 항목 과 여러 값을 허용할 수 있습니다.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. 프라이빗 클라우드 사용자인 경우 중복 헤더 사용을 위한 메시지 프로세서 구성 안내 가이드에 따라 요청에 중복 헤더가 포함되어 있더라도 Apigee Edge에서 502 Bad Gateway 오류가 발생하지 않도록 속성을 구성할 수 있습니다.
  2. Public Cloud 사용자인 경우 Apigee Edge 지원팀에 문의하여 조직의 이 속성을 구성합니다.

사양

Apigee는 백엔드 서버가 다음 RFC 사양에 따라 동작할 것으로 예상하므로 502 Bad Gateway 오류 응답으로 응답합니다.

사양
RFC 7230, 섹션 3.2.2: 필드 순서
RFC 7230, 섹션 3.2: 헤더 필드

Apigee 지원팀의 지원이 여전히 필요한 경우 진단 정보 수집 필요로 이동합니다.

진단 정보 수집 필요

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

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

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

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

  • 실패한 요청에 대해 관찰된 전체 오류 메시지
  • 환경 이름
  • API 프록시 번들
  • API 요청의 trace 파일
  • NGINX 액세스 로그:

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

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

  • 메시지 프로세서 시스템 로그 /opt/apigee/var/log/edge-message-processor/logs/system.log