현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동 정보
증상
클라이언트 애플리케이션은 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 응답 에서 동일한 헤더로 2회 이상 전송된 것을 발견하면 502 Bad Gateway
및 오류 코드 protocol.http.DuplicateHeader
로 응답합니다.
이 오류가 발생할 수 있는 원인은 다음과 같습니다.
원인 | 설명 | 다음에 관한 문제 해결 안내 |
---|---|---|
응답에 중복된 헤더 | 백엔드 서버의 응답에 중복된 헤더가 있습니다. | Edge 퍼블릭 및 프라이빗 클라우드 사용자 |
일반적인 진단 단계
다음 도구/기술 중 하나를 사용하여 이 오류를 진단하세요.
API 모니터링
API 모니터링을 사용하여 오류를 진단하려면 다음 안내를 따르세요.
- 적절한 역할이 있는 사용자로 Apigee Edge UI에 로그인합니다.
문제를 조사하려는 조직으로 전환합니다.
- 분석 > API 모니터링 > 조사 페이지로 이동합니다.
- 오류를 관찰한 특정 기간을 선택합니다.
- 프록시 필터가 모두로 설정되어 있는지 확인합니다.
- 시간을 기준으로 결함 코드를 표시합니다.
아래와 같이 오류 코드가
protocol.http.DuplicateHeader
인 셀을 선택합니다.(큰 이미지 보기)
오류 코드
protocol.http.DuplicateHeader
에 관한 정보가 아래와 같이 표시됩니다.(큰 이미지 보기)
- 위의 예와 같이 Status Code(상태 코드)가
502
인지 확인합니다. - 로그 보기를 클릭하고 실패한 요청이 있는 행을 펼칩니다.
로그 창에서 다음 세부정보를 확인합니다.
- 상태 코드:
502
- 결함 소스:
target
- 오류 코드:
protocol.http.DuplicateHeader
.
- 상태 코드:
- 오류 소스는
target
이며 백엔드 서버의 응답에 중복 헤더가 포함되어 있음을 나타냅니다.
추적 도구
Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 트레이스 세션을 사용 설정하고 다음 중 하나를 사용 설정합니다.
502 Bad Gateway
오류가 발생할 때까지 기다립니다.- 문제를 재현할 수 있는 경우 API를 호출하고
502 Bad Gateway
오류를 재현합니다.
Show all Flow Infos(모든 흐름 정보 표시)가 사용 설정되어 있는지 확인합니다.
- 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
- trace의 여러 단계를 살펴보고 실패가 발생한 위치를 찾습니다.
일반적으로 이 오류는 아래와 같이 요청이 대상 서버로 전송 단계 후의 흐름에서 찾을 수 있습니다.
(큰 이미지 보기)
트레이스에서 오류 값을 기록해 둡니다.
위의 샘플 trace는 오류를
Duplicate Header "Expires"
로 보여줍니다. 요청이 백엔드 서버로 전송된 후 Apigee에서 오류가 발생했으므로 백엔드 서버가Expires
헤더를 두 번 이상 전송했음을 나타냅니다.- 추적에서 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.DuplicateHeader
X-Apigee-fault-source target
프록시 체인을 사용 중인지, 즉 대상 서버 또는 대상 엔드포인트가 Apigee에서 다른 프록시를 호출하고 있는지 확인합니다.
이를 확인하려면 Request sent to target 서버 단계로 돌아가세요. 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 값과 일치하는 X-Apigee-fault-code 가 포함된
502
오류가 있는 경우 X-Apigee-fault-code 의 값을 확인합니다.NGINX 액세스 로그의 샘플 502 오류:
NGINX 액세스 로그의 위 샘플 항목은 X- Apigee-fault-code 및 X-Apigee-fault-source에 대한 값이 다음과 같습니다.
응답 헤더 값 X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
원인: 응답에 중복 헤더
진단
- 일반적인 진단 단계에 설명된 대로 API 모니터링 또는 NGINX 액세스 로그를 사용하여 관찰된 오류의 오류 코드 및 오류 소스를 확인합니다.
- 오류 소스의 값이
target
이면 대상 서버에서 전송한 응답에 중복 헤더가 있음을 나타냅니다. 다음 방법 중 하나를 사용하여 응답의 일부로 두 번 이상 전송되는 실제 헤더를 확인할 수 있습니다.
오류 메시지
오류 메시지 사용:
Apigee Edge에서 받은 전체 오류 메시지에 액세스할 수 있는 경우
faultstring
를 참조하세요.faultstring
에는 두 번 이상 전송된 헤더 이름이 포함되어 있습니다.오류 메시지 샘플:
"faultstring":"Duplicate Header \"Expires\""
- 위의 오류 메시지에서
faultstring
에 표시된 대로Expires
헤더가 두 번 이상 전송된 것을 볼 수 있습니다.
실제 요청
실제 요청 사용:
- 대상 서버에 보낸 실제 요청에 액세스할 수 없는 경우 Trace 도구 사용 10.a단계와 10.b단계에서 해당
curl
명령어를 가져옵니다. 대상 서버 애플리케이션에 대한 실제 요청에 액세스할 수 있는 경우 다음 단계를 수행합니다.
대상 서버를 호출합니다.
이 예시에서 사용되는 대상 서버에 대한 샘플 요청:
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
헤더를 한 번만 전달하도록 하여 문제를 해결할 수 있습니다. - 중복 헤더를 허용하려면 옵션 #2 CwC 속성 사용으로 이동합니다.
CwC
옵션 #2 CwC 속성 사용
Apigee는 클라이언트 애플리케이션과 대상 서버가 Apigee Edge의 API 프록시에 중복 헤더를 전송할 수 있게 해주는 CwC 속성 HTTPHeader.<HeaderName>
를 제공합니다.
CwC 속성 | 값 |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
예를 들어 메시지 프로세서에서 다음 속성을 설정하여 중복 및 헤더 Expires
에 여러 값을 허용할 수 있습니다.
HTTPHeader.Expires=allowDuplicates, multiValued
- Private Cloud 사용자의 경우
중복 헤더를 사용하도록 메시지 프로세서 구성 안내 가이드에 따라 요청에 중복 헤더가 포함되어 있더라도 Apigee Edge에서
502 Bad Gateway
오류가 발생하지 않도록 속성을 구성할 수 있습니다. - 퍼블릭 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 요청에 대한 추적 파일
Private Cloud 사용자인 경우 다음 정보를 제공하세요.
- 실패한 요청에 대해 발견된 전체 오류 메시지
- 환경 이름
- API 프록시 번들
- API 요청에 대한 추적 파일
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