503 서비스를 사용할 수 없음 - 백엔드 서버에 의한 조기 종료

<ph type="x-smartling-placeholder"></ph> 현재 Apigee Edge 문서를 보고 있습니다.
Apigee X 문서.
정보

증상

클라이언트 애플리케이션이 HTTP 응답 상태 503를 메시지와 함께 가져옵니다. API 프록시 호출 후 Service Unavailable입니다.

오류 메시지

클라이언트 애플리케이션이 다음과 같은 응답 코드를 받습니다.

HTTP/1.1 503 Service Unavailable

또한 다음과 같은 오류 메시지가 표시될 수 있습니다.

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
       }
    }
}

가능한 원인

원인 설명 다음에 관한 문제 해결 안내
대상 서버가 연결을 조기 종료함 메시지 프로세서가 가만히 있는 동안 대상 서버가 연결을 조기 종료함 요청 페이로드를 전송합니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자

일반적인 진단 단계

실패한 요청의 메시지 ID 확인

추적 도구

Trace 도구를 사용하여 실패한 요청의 메시지 ID를 확인하려면 다음 안내를 따르세요.

  1. 문제가 계속 발생하면 trace 세션을 호출합니다.
  2. API를 호출하여 문제를 재현합니다. - 503 Service Unavailable 오류 코드: messaging.adaptors.http.flow.ServiceUnavailable.
  3. 실패한 요청 중 하나를 선택합니다.
  4. AX 단계로 이동하여 메시지 ID를 확인합니다. (X-Apigee.Message-ID)를 표시합니다. 단계 세부정보 섹션을 참조하세요.

    단계 세부정보 섹션의 메시지 ID

NGINX 액세스 로그

NGINX 액세스 로그를 사용하여 실패한 요청의 메시지 ID를 확인하려면 다음 안내를 따르세요.

NGINX 액세스 로그를 참조하여 503 오류의 메시지 ID를 확인할 수도 있습니다. 이 기능은 문제가 이전에 발생했거나 간헐적인 경우 특히 유용합니다. UI에서 트레이스를 캡처할 수 없습니다. NGINX 액세스 로그에서 이 정보를 확인하려면 다음 단계를 따르세요.

  1. NGINX 액세스 로그를 확인합니다(/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log).
  2. 특정 기간 동안 특정 API 프록시에 503 오류가 있는지 검색합니다. (과거에 문제가 발생한 경우) 또는 여전히 503로 실패하는 요청이 있는지 확인합니다.
  3. X-Apigee-fault-codemessaging.adaptors.http.flow.ServiceUnavailable503 오류가 있으면 다음 예와 같이 하나 이상의 이러한 요청에 대한 메시지 ID를 기록해 두세요.

    503 오류를 보여주는 샘플 항목

    상태 코드, 메시지 ID, 오류 소스, 오류 코드를 보여주는 샘플 항목

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

진단

  1. 퍼블릭 클라우드 또는 프라이빗 클라우드 사용자인 경우: <ph type="x-smartling-placeholder">
      </ph>
    1. Trace 도구 사용 (일반적인 진단 단계 참조) 그런 다음 Analytics Data Recorded(기록된 애널리틱스 데이터) 창에서 다음 두 항목이 모두 설정되어 있는지 확인합니다. <ph type="x-smartling-placeholder">
        </ph>
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. Trace 도구 사용 (일반적인 진단 단계 참조) 다음 두 가지 사항이 모두 Error 창에 설정되어 있는지 확인합니다. TARGET_REQ_FLOW state 속성
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. 자세한 내용을 보려면 tcpdump 사용으로 이동하세요.
  2. Private Cloud 사용자인 경우: <ph type="x-smartling-placeholder">
      </ph>
    • <ph type="x-smartling-placeholder"></ph> 실패한 요청의 메시지 ID를 확인합니다.
    • 메시지 프로세서 로그에서 메시지 ID 검색 (/opt/apigee/var/log/edge-message-processor/logs/system.log)
    • 다음 예외 중 하나가 표시됩니다.

      예외 1: java.io.IOException: ClientOutputChannel 채널에 쓰는 동안 파이프가 깨짐

      2021-01-30 15:31:14,693 org:anotherorg env:prod api:myproxy
      rev:1 messageid:myorg-opdk-test-1-30312-13747-1  NIOThread@1
      INFO  HTTP.SERVICE - ExceptionHandler.handleException() :
      Exception java.io.IOException: Broken pipe occurred while writing to channel
      ClientOutputChannel(ClientChannel[Connected:
      Remote:IP:PORT Local:0.0.0.0:42828]@8380 useCount=1
      bytesRead=0 bytesWritten=76295 age=2012ms  lastIO=2ms  isOpen=false)
      

      또는

      예외 #2: onExceptionWrite 예외: {}
      java.io.IOException: 깨진 파이프

      2021-01-31 15:29:37,438 org:anotherorg env:prod api:503-test
      rev:1 messageid:leonyoung-opdk-test-1-18604-13978-1
      NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context$2.onException() :
      ClientChannel[Connected: Remote:IP:PORT
      Local:0.0.0.0:57880]@8569 useCount=1 bytesRead=0 bytesWritten=76295 age=3180ms  lastIO=2
      ms  isOpen=false.onExceptionWrite exception: {}
      java.io.IOException: Broken pipe
      
    • 이 두 가지 예외는 모두 메시지 프로세서가 요청이 전달되면 백엔드 서버입니다 따라서 메시지 프로세서에서 java.io.IOException: Broken pipe 예외가 발생합니다.
    • Remote:IP:PORT 는 확인된 백엔드 서버를 나타냅니다. IP 주소 및 포트 번호입니다.
    • 위 오류 메시지의 속성 bytesWritten=76295는 메시지 프로세서가 76295바이트의 페이로드를 백엔드로 보냈다는 것을 의미합니다. 종료되었을 수 있습니다.
    • 속성 bytesRead=0 는 메시지 프로세서가 백엔드 서버에서 모든 데이터 (응답)를 수신했는지 확인합니다.
    • 이 문제를 더 자세히 조사하려면 백엔드에서 tcpdump를 수집합니다. 서버 또는 메시지 프로세서를 사용하여 아래 설명에 따라 분석합니다.

tcpdump 사용

  1. 다음을 사용하여 백엔드 서버 또는 메시지 프로세서에서 tcpdump를 캡처합니다. 다음 명령어를 실행합니다.

    백엔드 서버에서 tcpdump를 수집하는 명령어:

    tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
    

    메시지 프로세서에서 tcpdump를 수집하는 명령어:

    tcpdump -i any -s 0 host BACKEND_HOSTNAME -w FILE_NAME
    
  2. 캡처된 tcpdump를 분석합니다.

    샘플 tcpdump 출력 (메시지 프로세서에서 수집):

    alt_text

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

    1. 4 패킷에서 메시지 프로세서가 POST 요청을 백엔드 서버입니다
    2. 패킷 5, 8, 9, 10에서 11를 반환하면 메시지 프로세서가 계속해서 요청 페이로드를 백엔드 서버입니다
    3. 67 패킷에서 백엔드 서버가 다음으로 응답했습니다. 메시지 프로세서에서 수신한 요청 페이로드의 일부에 대한 ACK입니다.
    4. 그러나 12 패킷에서 ACK로 응답하는 대신 수신 애플리케이션 데이터 패킷에 대한 응답으로 백엔드 서버는 대신 FIN ACK 연결을 닫을 수 있습니다.
    5. 백엔드 서버가 연결을 조기에 종료하고 있음을 명확하게 보여줍니다. 메시지 프로세서가 여전히 요청 페이로드를 전송하고 있었을 때 발생합니다.
    6. 그러면 메시지 프로세서가 IOException: Broken Pipe 오류가 발생하고 클라이언트에 503 반환

해상도

  1. 애플리케이션 및 네트워킹팀과 협력하여 문제를 분석하고 해결합니다. 백엔드 서버 측의 조기 연결 해제와 관련된 문제입니다.
  2. 백엔드 서버 애플리케이션이 타임아웃되거나 연결을 재설정하지 않는지 확인하세요. 이 전체 요청 페이로드를 받기 전에 재전송해야 합니다
  3. Apigee와 백엔드 서버 사이에 중간 네트워킹 장치 또는 레이어가 있는 경우 전체 요청 페이로드가 수신되기 전에 시간 초과되지 않도록 합니다.

문제가 계속되면 진단 정보를 수집해야 함으로 이동합니다.

진단 정보 수집 필요

위의 안내를 따른 후에도 문제가 지속되면 다음을 수집합니다. Apigee Edge 지원팀에 문의하세요.

퍼블릭 클라우드 사용자인 경우 다음 정보를 입력합니다.

  • 조직 이름
  • 환경 이름
  • API 프록시 이름
  • curl 명령어를 완료하여 503 오류를 재현합니다.
  • 503 Service Unavailable 오류가 있는 요청이 포함된 추적 파일
  • 503 오류가 현재 발생하지 않고 있다면 다음과 같이 기간을 제공합니다. 이전에 503 오류가 발생한 시간대 정보입니다.

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

  • 실패한 요청에 대해 발견된 전체 오류 메시지
  • 관찰 중인 조직, 환경 이름, API 프록시 이름 오류 503
  • API 프록시 번들
  • 503 Service Unavailable 오류가 있는 요청이 포함된 추적 파일
  • NGINX 액세스 로그
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  • 메시지 프로세서 로그
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • 503 오류 발생 시 시간대 정보가 포함된 기간
  • Tcpdumps는 메시지 프로세서와 백엔드 서버에 수집되고 오류가 발생했습니다.