Apigee Edge 문서입니다.
Go to the
Apigee X documentation. info
증상
클라이언트 애플리케이션은 Edge Microgateway의 API 호출에 대한 응답으로
ECONNRESET 코드가 포함된 HTTP 상태 코드 502 Bad Gateway를 수신합니다.
오류 메시지
클라이언트에 다음 응답 코드가 표시됩니다.
HTTP/1.1 502 Bad Gateway
응답에 다음과 같은 오류 메시지가 포함됩니다.
{"message":"socket hang up","code":"ECONNRESET"}가능한 원인
| 원인 | 설명 | 다음에 관한 문제 해결 안내 |
|---|---|---|
| 잘못 구성된 연결 유지 제한 시간 | Edge Microgateway와 대상 서버 간에 연결 유지 제한 시간이 잘못 구성되었습니다. | Edge Public 및 Private Cloud 사용자 |
| 대상 서버에서 연결을 너무 일찍 종료함 | Edge Microgateway가 요청 페이로드를 전송하는 동안 대상 서버에서 연결을 너무 일찍 종료합니다. | Edge Public 및 Private Cloud 사용자 |
일반적인 진단 단계
- Edge Microgateway 로그를 확인합니다.
/var/tmp/edgemicro-`hostname`-*.log
- 특정 기간 (과거에 문제가 발생한 경우)에 코드
ECONNRESET가 포함된502오류가 있는지 또는502로 인해 여전히 실패하는 요청이 있는지 검색합니다.2021-06-23T03:52:24.110Z [error][0:8000][3][myorg][test] [emg_badtarget/flakey/hangup][][][6b089a00-d3d6-11eb-95aa-911f1ee6c684] [microgateway-core][][GET][502][socket hang up][ECONNRESET][]
- 로깅 수준이
warn또는info로 설정된 경우 두 번째 요소에 대상 서버 호스트 이름과 포트가 포함된[warn]메시지도 표시됩니다. 이 예에서는X.X.X.X:8080이며 나중에tcpdump를 캡처하는 데 사용할 수 있습니다.2021-06-23T03:52:24.109Z [warn][X.X.X.X:8080][3][myorg][test][emg_badtarget/flakey/hangup] [][][6b089a00-d3d6-11eb-95aa-911f1ee6c684][plugins-middleware] [targetRequest error][GET][][socket hang up][ECONNRESET][395]
- 오류 코드
[socket hang up][ECONNRESET]는 대상 서버 에서 Edge Microgateway와의 연결을 종료했음을 나타냅니다. 로그에서 검색하여 얼마나 자주 발생하는지 확인할 수 있습니다.
원인: 잘못 구성된 연결 유지 제한 시간
진단
- 일반적인 진단 단계의 단계를 사용하여
[socket hang up][ECONNRESET]오류가 발생했는지 확인합니다. 예인 경우 아래 설명된 대로
tcpdump를 사용하여 추가로 조사합니다.
tcpdump 사용하기
- 다음 명령어를 사용하여 Edge Microgateway 호스트 운영체제에서 Edge Microgateway와 백엔드 서버 간에
tcpdump를 캡처합니다.tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- 캡처된
tcpdump를 분석합니다.샘플 tcpdump 출력: ( 이미지 크게 보기)
위의 샘플
tcpdump에서 다음을 확인할 수 있습니다.- 패킷 250288에서 클라이언트가
POST요청을 보냅니다. - 패킷 250371에서 서버가
200 OK로 응답합니다. - 패킷 250559에서 클라이언트가
ACK.를 보냅니다. - 패킷 250560에서 서버가
Continuation메시지를 보냅니다. - 패킷 250561에서 클라이언트가
ACK.를 보냅니다. - 패킷 262436에서 서버가 연결 종료를 시작하는 클라이언트에
FIN, ACK를 보냅니다. 이 패킷은 이전 패킷 (250561) 후 약 5 초입니다. - 패킷 262441에서 클라이언트가 다른
POST요청을 보냅니다. 하지만 서버에서 이미 연결 종료를 시작했으므로 실패합니다. 패킷 262441에서RST로 응답합니다.
이 예에서는 동일한 연결이 한 번 이상 성공적으로 재사용되었지만 최종 요청에서 서버는 5초의 유휴 시간 후에 연결 종료를 시작합니다. 이는 클라이언트가 새 요청을 보낸 시간과 동일합니다. 이는 백엔드 서버 연결 유지 제한 시간이 클라이언트에 설정된 값보다 짧거나 같을 가능성이 높음을 나타냅니다. 이를 검증하려면 Edge Microgateway 및 백엔드 서버의 연결 유지 제한 시간 비교를 참고하세요.
- 패킷 250288에서 클라이언트가
연결 유지 제한 시간 비교
- Edge Microgateway에는 특정 연결 유지 제한 시간 속성이 없습니다. 실행 중인 운영체제에 따라 결정됩니다. 일반적인 예로는 Windows, Linux, Docker 컨테이너가 있습니다.
- 운영체제에서 맞춤설정할 수 있습니다. 시스템 관리자에게 문의하세요. 기본적으로 Linux 운영체제에는 기본 연결 유지 제한 시간이 2시간입니다.
- 다음으로 백엔드 서버에 구성된 연결 유지 제한 시간 속성을 확인합니다. 백엔드 서버가 10초 값으로 구성되어 있다고 가정해 보겠습니다.
- 위의 예와 같이 운영체제의 연결 유지 제한 시간 값이 백엔드 서버의 연결 유지 제한 시간 속성 값보다 높다고 판단되면
502오류의 원인이 됩니다.
해상도
Edge Microgateway가 실행 중인 운영체제의 연결 유지 제한 시간 속성이 백엔드 서버의 연결 유지 제한 시간 속성보다 항상 낮아야 합니다.
- 백엔드 서버에 설정된 연결 유지 제한 시간 값을 확인합니다.
- 운영체제에 적용되는 단계를 사용하여 연결 유지 제한 시간 속성이 백엔드 서버에 설정된 값보다 낮도록 운영체제에서 연결 유지 제한 시간 속성에 적절한 값을 구성합니다.
권장사항
이러한 종류의 경합 상태 및
502 오류를 방지하려면 다운스트림 구성요소의 연결 유지 제한 시간
임계값이 항상 업스트림 서버에 구성된 값보다 작아야 합니다. 각 다운스트림 홉은 각 업스트림 홉보다 낮아야 합니다. Edge
Microgateway에서는 다음 가이드라인을 사용하는 것이 좋습니다.
클라이언트 애플리케이션 또는 부하 분산기의 연결 유지 제한 시간은 Edge Microgateway 연결 유지 제한 시간보다 짧아야 합니다.
Edge Microgateway에서 연결 유지 제한 시간을 구성하려면
keep_alive_timeout값을~/.edgemicro/org-env-config.yaml파일에 추가합니다.edgemicro: keep_alive_timeout: 65000
- Edge Microgateway 운영체제 연결 유지 제한 시간은 대상 서버 연결 유지 제한 시간보다 짧아야 합니다.
- Edge Microgateway 앞이나 뒤에 다른 홉이 있는 경우 동일한 규칙이 적용되어야 합니다. 항상 다운스트림 클라이언트가 업스트림과의 연결을 종료하도록 해야 합니다.
원인: 대상 서버에서 연결을 너무 일찍 종료함
진단
- 일반적인 진단 단계에 설명된 단계를 사용하여
[socket hang up][ECONNRESET]오류가 발생했는지 확인합니다. - 예인 경우 아래 설명된 대로
tcpdump를 사용하여 추가로 조사합니다.위의 예에 있는 오류 메시지
[targetRequest error][GET][][socket hang up][ECONNRESET]는 Edge Microgateway 가 백엔드 (대상) 서버에 요청을 전송하는 동안 이 오류가 발생했음을 나타냅니다. 즉, Edge Microgateway가 백엔드 서버에 API 요청을 전송하고 응답을 기다리고 있었습니다. 하지만 백엔드 서버는 Edge Microgateway가 응답을 수신하기 전에 연결을 갑자기 종료했습니다. - 백엔드 서버 로그를 확인하고 백엔드 서버에서 연결을 갑자기 종료하게 된 오류 또는 정보가 있는지 확인합니다. 오류 또는 정보를 찾으면 해상도로 이동하여 백엔드 서버에서 문제를 적절하게 해결합니다.
- 백엔드 서버에서 오류 또는 정보를 찾을 수 없는 경우 Edge Microgateway 서버에서
tcpdump출력을 수집합니다.tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- 캡처된
tcpdump를 분석합니다.샘플 tcpdump 출력: ( 이미지 크게 보기)
위의 샘플
tcpdump에서 다음을 확인할 수 있습니다.- 패킷 4에서 Edge Microgateway가 대상
서버에
GET요청을 보냈습니다. - 패킷 5에서 대상 서버가 요청을 확인하기 위해
ACK로 응답했습니다. - 하지만 패킷 6에서 대상
서버는 응답 페이로드로 응답하는 대신
FIN, ACK연결 종료를 시작합니다. - 패킷 7 부터 연결이 상호 종료됩니다. 응답이 전송되기 전에 연결이
종료되었으므로 Edge Microgateway는 HTTP
502오류를 클라이언트에 다시 반환합니다. - 패킷 8의 타임스탬프
2021-06-23T03:52:24.110Z는 Edge Microgateway 로그에 오류가 로깅된 타임스탬프에 해당합니다. 로그 파일 및tcpdump의 타임스탬프는 오류를 실제 패킷과 상호 연결하는 데 자주 사용될 수 있습니다.
해상도
백엔드 서버에서 문제를 적절하게 해결합니다.
문제가 지속되고
502 Bad Gateway Error문제 해결에 도움이 필요하거나 Edge Microgateway 내에 문제가 있다고 생각되면 진단 정보를 수집해야 함으로 이동합니다.진단 정보 수집 필요
위 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 후 Apigee Edge 지원팀에 문의합니다.
- 로그 파일: 기본 폴더는
/var/tmp이지만 기본config.yaml파일 (logging > dir parameter)에서 재정의될 수 있습니다. Apigee 지원팀에 로그 파일을 제공하기 전에log > level을info으로 변경하는 것이 좋습니다. - 구성 파일: Edge Microgateway의 기본 구성은 기본 Edge Microgateway 폴더
$HOME/.edgemicro의 YAML 파일에 있습니다. `default.yaml`이라는 기본 구성 파일default.yaml과 각 환경 `ORG-ENV-config.yaml`에 대한 구성 파일이 있습니다.ORG-ENV-config.yaml영향을 받는 조직 및 환경의 경우 이 파일 을 전체로 업로드하세요.
- 패킷 4에서 Edge Microgateway가 대상
서버에