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 모니터링을 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 적절한 역할을 가진 사용자로 Apigee Edge UI에 로그인합니다.
문제를 조사하려는 조직으로 전환합니다.

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

아래와 같이 오류 코드
protocol.http.DuplicateHeader에 대한 정보가 표시됩니다.(큰 이미지 보기)

- 위의 예와 같이 상태 코드 가
502인지 확인합니다. - 로그 보기 를 클릭하고 실패한 요청의 행을 펼칩니다.
로그 창에서 다음 세부정보를 확인합니다.
- 상태 코드:
502 - 오류 소스:
target - 오류 코드:
protocol.http.DuplicateHeader.
- 상태 코드:
- 오류 소스 는
target입니다. 이는 백엔드 서버의 응답에 중복 헤더가 포함되어 있음을 나타냅니다.
Trace 도구
Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- trace 세션을 사용 설정하고 다음 중 하나를 수행합니다.
502 Bad Gateway오류가 발생할 때까지 기다립니다.- 문제를 재현할 수 있는 경우 API를 호출하고
502 Bad Gateway오류를 재현합니다.
모든 흐름 정보 표시 가 사용 설정되어 있는지 확인합니다.

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

trace에서 오류 값을 확인합니다.
위의 샘플 trace는 오류를
Duplicate Header "Expires"로 보여줍니다. 요청이 백엔드 서버로 전송된 후 Apigee에서 오류가 발생했으므로 백엔드 서버가Expires헤더를 두 번 이상 전송했음을 나타냅니다.- trace에서 AX (기록된 분석 데이터) 단계로 이동하여 클릭합니다.
아래와 같이 단계 세부정보 - 응답 헤더 섹션으로 스크롤하고 X-Apigee-fault-code 및 X-Apigee-fault-source 값을 확인합니다.
(큰 이미지 보기)

- X-Apigee-fault-code 및 X-Apigee-fault-source 값이
protocol.http.DuplicateHeader및target으로 표시됩니다. 이는 백엔드 서버가 응답 헤더Expires에 중복 헤더를 전달했기 때문에 이 오류가 발생했음을 나타냅니다.응답 헤더 값 X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target 프록시 체이닝을 사용하고 있는지, 즉 대상 서버 또는 대상 엔드포인트가 Apigee에서 다른 프록시를 호출하는지 확인합니다.
이를 확인하려면 대상 서버에 전송된 요청 단계로 돌아갑니다. Curl 표시 를 클릭합니다.
대상 서버에 전송된 요청의 Curl 창이 열립니다. 여기서 대상 서버 호스트 별칭을 확인할 수 있습니다.
- 대상 서버 호스트 별칭이 가상 호스트 별칭을 가리키는 경우 프록시
체이닝입니다. 이 경우
502 Bad Gateway오류의 실제 원인을 확인할 때까지 체이닝된 프록시에 대해 위의 모든 단계를 반복해야 합니다. - 대상 서버 호스트 별칭이 백엔드 서버를 가리키는 경우 백엔드 서버가 Apigee에 대한 응답으로 중복 헤더를 전송하고 있음을 나타냅니다.
NGINX
NGINX 액세스 로그를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- Private Cloud 사용자인 경우 NGINX 액세스 로그를 사용하여 HTTP
502오류에 대한 주요 정보를 확인할 수 있습니다. NGINX 액세스 로그를 확인합니다.
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log여기서 ORG, ENV, PORT#는 실제 값으로 대체됩니다.
- 특정 기간(문제가 과거에 발생한 경우)에
502오류가 있는지 또는502로 인해 여전히 실패하는 요청이 있는지 검색합니다. 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.DuplicateHeaderX-Apigee-fault-source target
원인: 응답의 중복 헤더
진단
- 일반적인 진단 단계에 설명된 대로 API 모니터링 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드 및 오류 소스 를 확인합니다.
- 오류 소스 에
target값이 있으면 대상 서버에서 전송된 응답에 중복 헤더가 포함되어 있음을 나타냅니다. 다음 방법 중 하나를 사용하여 응답의 일부로 두 번 이상 전송되는 실제 헤더를 확인할 수 있습니다.
오류 메시지
오류 메시지 사용:
Apigee Edge에서 수신한 전체 오류 메시지에 액세스할 수 있는 경우
faultstring을 참조하세요.faultstring에는 두 번 이상 전송된 헤더 이름이 포함되어 있습니다.샘플 오류 메시지:
"faultstring":"Duplicate Header \"Expires\""
- 위의 오류 메시지에서
faultstring에 표시된 대로Expires헤더가 두 번 이상 전송되었음을 확인할 수 있습니다.
실제 요청
실제 요청 사용:
- 대상 서버에 대한 실제 요청에 액세스할 수 없는 경우
해당하는
curl명령어를 Trace 도구 사용의 10.a단계 및 10.b단계에서 가져옵니다. 대상 서버 애플리케이션에 대한 실제 요청에 액세스할 수 있는 경우 다음 단계를 수행합니다.
대상 서버를 호출합니다.
이 예에서 사용된 대상 서버의 샘플 요청:
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
응답에 표시된 헤더 목록을 확인합니다.
이 예에서 사용된 대상 서버의 샘플 응답:
* ...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로 실패합니다.faultstring에 이름이 표시되는 헤더가 백엔드 서버의 응답에 두 번 이상 표시되면 이 오류의 원인이 됩니다. 위의 경우Expires헤더가 두 번 이상 전송되었습니다.
해상도
중복 수정
옵션 1[권장 옵션] 중복 헤더를 포함하지 않도록 백엔드 서버 수정
- 특정 백엔드 서버가 중복 헤더
Expires를 전송하는 이유를 분석하고 API 프록시에서 이를 허용해도 되는지 확인합니다. 대부분의 경우 HTTP 사양 RFC7230에 따라 바람직하지 않습니다. - 바람직하지 않은 경우 중복 헤더를 전송하지 않도록 대상 서버 애플리케이션을 수정합니다.
위에서 설명한 예에서는 헤더
Expires가 동일한 값으로 두 번 전송되는 것을 확인할 수 있습니다. 이는 바람직하지 않습니다. 대상 서버가Expires헤더를 한 번만 전달하도록 하면 문제를 해결할 수 있습니다. - 바람직하고 중복 헤더를 허용하려면 CwC 속성 사용 옵션 2로 이동합니다.
CwC
옵션 2 CwC 속성 사용
Apigee는 클라이언트 애플리케이션과 대상 서버가 Apigee Edge의 API 프록시에 중복 헤더를 전송할 수 있도록 하는 CwC 속성
HTTPHeader.<HeaderName>을 제공합니다.
| CwC 속성 | 값 |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
예를 들어 메시지 프로세서에서 다음 속성을 설정하여 Expires 헤더에 중복 항목
과 여러 값을 허용할 수 있습니다.
HTTPHeader.Expires=allowDuplicates, multiValued
- 프라이빗 클라우드 사용자인 경우 중복 헤더 사용을 위한
메시지 프로세서 구성 안내 가이드에 따라 요청에 중복 헤더가 포함되어 있더라도 Apigee Edge에서
502 Bad Gateway오류가 발생하지 않도록 속성을 구성할 수 있습니다. - 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, ENV 및 PORT#는 실제 값으로 대체됩니다.
- 메시지 프로세서 시스템 로그
/opt/apigee/var/log/edge-message-processor/logs/system.log