502 잘못된 게이트웨이 - 소켓 중단

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

증상

클라이언트 애플리케이션은 Edge Micro Gateway의 API 호출에 대한 응답으로 502 Bad Gateway라는 HTTP 상태 코드와 ECONNRESET 코드를 수신합니다.

오류 메시지

클라이언트에 다음과 같은 응답 코드가 표시됩니다.

HTTP/1.1 502 Bad Gateway

응답에는 다음과 같은 오류 메시지가 포함됩니다.

{"message":"socket hang up","code":"ECONNRESET"}

가능한 원인

원인 설명 다음에 관한 문제 해결 안내
연결 유지 제한 시간이 잘못 구성됨 Edge Micro Gateway와 대상 서버 간에 연결 유지 제한 시간이 잘못 구성되었습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
대상 서버가 연결을 조기 종료함 Edge Micro Gateway가 요청 페이로드를 전송하는 동안 대상 서버가 연결을 조기에 종료합니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자

일반적인 진단 단계

  1. Edge Micro Gateway 로그를 확인합니다.
    /var/tmp/edgemicro-`hostname`-*.log
    
  2. 특정 기간 동안 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][]
    
  3. 로깅 수준을 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]
    
  4. [socket hang up][ECONNRESET] 오류 코드는 대상 서버에서 Edge Micro Gateway와의 연결이 종료되었음을 나타냅니다. 로그에서 이를 검색하여 실행 빈도를 확인할 수 있습니다.

원인: 연결 유지 제한 시간이 잘못 구성되었습니다.

진단

  1. 일반적인 진단 단계의 단계를 사용하여 [socket hang up][ECONNRESET] 오류가 발생했는지 확인합니다.
  2. 만약 그렇다면 아래에 설명된 대로 tcpdump의 도움을 받아 자세히 조사하세요.

tcpdump 사용

  1. 다음 명령어를 사용하여 Edge Microgateway 호스트 운영체제의 백엔드 서버 간에 tcpdump를 캡처합니다.
    tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
    
  2. 캡처된 tcpdump를 분석합니다.

    샘플 tcpdump 출력: ( 더 큰 이미지 보기)

    위의 tcpdump 샘플에서는 다음을 확인할 수 있습니다.

    1. 패킷 250288에서 클라이언트는 POST 요청을 보냅니다.
    2. 250371 패킷에서 서버는 200 OK로 응답합니다.
    3. 패킷 250559에서 클라이언트는 ACK.
    4. 패킷 250560에서 서버는 Continuation 메시지를 보냅니다.
    5. 패킷 250561에서 클라이언트는 ACK.
    6. 262436 패킷에서 서버는 연결 종료를 시작하는 FIN, ACK를 클라이언트에 전송합니다. 이전 패킷 (250561)으로부터 약 5초 후입니다.
    7. 패킷 262441에서 클라이언트는 다른 POST 요청을 보냅니다. 하지만 서버에서 이미 연결 종료를 시작했기 때문에 실패합니다. 이 명령어는 패킷 262441에서 RST로 응답합니다.

    이 예시에서는 동일한 연결이 한 번 이상 성공적으로 재사용되었지만, 마지막 요청에서는 클라이언트가 새 요청을 전송한 동시에 5초의 유휴 시간이 지난 후 서버가 연결 종료를 시작합니다. 따라서 백엔드 서버 연결 유지 제한 시간이 클라이언트에 설정된 값보다 짧거나 같을 가능성이 큽니다. 이를 검증하려면 Edge Micro Gateway와 백엔드 서버의 연결 유지 제한 시간 비교를 참조하세요.

연결 유지 제한 시간 비교

  1. Edge Micro Gateway에는 특정 연결 유지 제한 시간 속성이 없습니다. 실행 중인 운영체제에 따라 결정됩니다. 일반적인 예로는 Windows, Linux, Docker 컨테이너가 있습니다.
  2. 운영체제에서 맞춤설정될 수 있습니다. 시스템 관리자에게 문의하세요. 기본적으로 Linux 운영체제의 기본 연결 유지 제한 시간은 2시간입니다.
  3. 그런 다음 백엔드 서버에 구성된 연결 유지 제한 시간 속성을 확인합니다. 백엔드 서버가 10초 값으로 구성되어 있다고 가정해 보겠습니다.
  4. 위 예시와 같이 운영체제의 연결 유지 제한 시간 값이 백엔드 서버의 연결 유지 제한 시간 속성 값보다 크다고 확인되면 502 오류가 발생합니다.

해상도

연결 유지 제한 시간 속성이 백엔드 서버보다 Edge Micro Gateway가 실행 중인 운영체제의 속성보다 항상 더 낮은지 확인합니다.

  1. 백엔드 서버에 설정된 연결 유지 제한 시간 값을 결정합니다.
  2. 운영체제에 적용되는 단계에 따라 연결 유지 제한 시간 속성이 백엔드 서버에 설정된 값보다 낮도록 운영체제의 연결 유지 제한 시간 속성에 적절한 값을 구성합니다.

권장사항

다운스트림 구성요소의 경우 이러한 종류의 경합 상태 및 502 오류를 방지하기 위해 항상 업스트림 서버에 구성된 연결 유지 제한 시간 임곗값을 낮게 설정하는 것이 좋습니다. 각 다운스트림 홉은 각 업스트림 홉보다 낮아야 합니다. Edge Micro Gateway에서는 다음 가이드라인을 사용하는 것이 좋습니다.

  1. 클라이언트 애플리케이션 또는 부하 분산기의 연결 유지 제한 시간은 Edge Micro Gateway 연결 유지 제한 시간보다 작아야 합니다.

    Edge Micro Gateway에서 연결 유지 제한 시간을 구성하려면 ~/.edgemicro/org-env-config.yaml 파일에 keep_alive_timeout 값을 추가합니다.

    edgemicro:
      keep_alive_timeout: 65000
    
  2. Edge Microgateway 운영체제 연결 유지 제한 시간은 대상 서버 연결 유지 제한 시간보다 짧아야 합니다.
  3. Edge Micro Gateway의 앞이나 뒤에 다른 홉이 있는 경우 동일한 규칙을 적용해야 합니다. 업스트림과의 연결을 닫는 것을 항상 다운스트림 클라이언트의 책임으로 두어야 합니다.

원인: 대상 서버가 연결을 조기 종료함

진단

  1. 일반적인 진단 단계에 설명된 단계를 사용하여 [socket hang up][ECONNRESET] 오류가 발생했는지 확인합니다.
  2. 그런 경우 아래에 설명된 대로 tcpdump의 도움을 받아 자세히 조사합니다.

    위 예시에서 [targetRequest error][GET][][socket hang up][ECONNRESET] 오류 메시지는 Edge Micro Gateway가 백엔드 (대상) 서버로 요청을 전송하는 동안 이 오류가 발생했음을 나타냅니다. 즉, Edge Micro Gateway가 API 요청을 백엔드 서버로 전송하고 응답을 기다리고 있는 것입니다. 하지만 Edge Micro Gateway가 응답을 수신하기 전에 백엔드 서버에서 갑자기 연결을 종료했습니다.

  3. 백엔드 서버 로그를 확인하고 백엔드 서버에서 갑자기 연결을 종료하게 만들 수 있는 오류나 정보가 있는지 확인합니다. 오류나 정보를 발견하면 해결로 이동하여 백엔드 서버에서 문제를 적절하게 해결합니다.
  4. 백엔드 서버에서 오류나 정보를 찾지 못하면 Edge Micro Gateway 서버에서 tcpdump 출력을 수집합니다.
    tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
    
  5. 캡처된 tcpdump를 분석합니다.

    샘플 tcpdump 출력: ( 더 큰 이미지 보기)

    위의 tcpdump 샘플에서는 다음을 확인할 수 있습니다.

    1. 패킷 4에서 Edge Micro Gateway가 대상 서버로 GET 요청을 전송했습니다.
    2. 패킷 5에서 대상 서버는 ACK로 응답하여 요청을 확인했습니다.
    3. 하지만 패킷 6에서 대상 서버는 응답 페이로드로 응답하는 대신 연결 종료를 시작하는 FIN, ACK를 전송합니다.
    4. 패킷 7 이상에서는 연결이 상호 닫힙니다. 응답이 전송되기 전에 연결이 종료되었으므로 Edge Micro Gateway는 HTTP 502 오류를 클라이언트에 다시 반환합니다.
    5. 패킷 8, 2021-06-23T03:52:24.110Z 의 타임스탬프는 Edge Micro Gateway 로그에 오류가 로깅된 타임스탬프에 해당합니다. 로그 파일과 tcpdump의 타임스탬프는 오류를 실제 패킷과 연관시키는 데 사용할 수 있는 경우가 많습니다.

    해상도

    백엔드 서버에서 문제를 적절하게 수정합니다.

    문제가 지속되고 502 Bad Gateway Error 문제 해결에 도움이 필요하거나 Edge Micro Gateway 내의 문제로 의심되는 경우 진단 정보를 수집해야 함으로 이동하세요.

    진단 정보 수집 필요

    위의 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 다음 Apigee Edge 지원팀에 문의하세요.

    • 로그 파일: 기본 폴더는 /var/tmp이지만 기본 config.yaml 파일 (logging > dir parameter)에서 재정의될 수 있습니다. Apigee 지원팀에 로그 파일을 제공하기 전에 log > levelinfo로 변경하는 것이 좋습니다.
    • 구성 파일: Edge Microgateway의 기본 구성은 기본 Edge Microgateway 폴더인 $HOME/.edgemicro의 YAML 파일에 있습니다. default.yaml라는 기본 구성 파일이 있으며, ORG-ENV-config.yaml 환경별로 하나씩 있습니다. 영향을 받는 조직 및 환경에 이 파일 전체를 업로드하세요.