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

Apigee Edge 문서입니다.
Go to the Apigee X 문서로 이동합니다.
info

증상

클라이언트 애플리케이션은 API 프록시 호출 후 메시지 Service Unavailable와 함께 HTTP 응답 상태 503을 받습니다.

오류 메시지

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

HTTP/1.1 503 Service Unavailable

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

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

가능한 원인

원인 설명 다음에 관한 문제 해결 안내
대상 서버가 연결을 너무 일찍 닫음 메시지 프로세서가 요청 페이로드를 계속 전송하는 동안 대상 서버가 연결을 너무 일찍 종료합니다. Edge Public 및 Private Cloud 사용자

일반적인 진단 단계

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

trace 도구

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

  1. 문제가 아직 활성 상태인 경우 영향을 받는 API의 trace 세션을 사용 설정합니다.
  2. API를 호출하고 오류 코드 messaging.adaptors.http.flow.ServiceUnavailable.와 함께 503 Service Unavailable 문제를 재현합니다.
  3. 실패한 요청 중 하나를 선택합니다.
  4. AX 단계로 이동하고 다음 그림과 같이 단계 세부정보 섹션에서 아래로 스크롤하여 요청의 메시지 ID (X-Apigee.Message-ID)를 확인합니다.

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

NGINX 액세스 로그

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

NGINX 액세스 로그를 참조하여 503 오류의 메시지 ID를 확인할 수도 있습니다. 이 방법은 문제가 이전에 발생한 적이 있거나 간헐적으로 발생하여 UI에서 trace를 캡처할 수 없는 경우에 특히 유용합니다. 다음 단계에 따라 NGINX 액세스 로그에서 이 정보를 확인합니다.

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

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

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

원인: 대상 서버가 연결을 너무 일찍 닫음

진단

  1. Public Cloud 또는 Private Cloud 사용자라면 다음 단계를 따르세요.
    1. trace 도구 (일반적인 진단 단계에 설명됨)를 사용하고 기록된 분석 데이터 창에 다음이 모두 설정되어 있는지 확인합니다.
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. trace 도구 (일반적인 진단 단계에 설명됨)를 사용하고 오류 창에 TARGET_REQ_FLOW 상태 속성 바로 뒤에 다음이 모두 설정되어 있는지 확인합니다.
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • error.cause: Broken pipe

      alt_text

    3. 자세한 내용은 tcpdump 사용으로 이동합니다.
  2. Private Cloud 사용자라면 다음 단계를 따르세요.
    • 실패한 요청의 메시지 ID를 확인합니다.
    • 메시지 프로세서 로그 (/opt/apigee/var/log/edge-message-processor/logs/system.log)에서 메시지 ID를 검색합니다.
    • 다음 예외 중 하나가 표시됩니다.

      예외 1: java.io.IOException: Broken pipe occurred while writing to channel 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 exception: {}
      java.io.IOException: Broken pipe

      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 지원팀에 문의하세요.

Public Cloud 사용자인 경우 다음 정보를 제공하세요.

  • 조직 이름
  • 환경 이름
  • API 프록시 이름
  • 503 오류를 재현하는 전체 curl 명령어
  • 503 Service Unavailable 오류가 있는 요청이 포함된 trace 파일
  • 503 오류가 현재 발생하지 않는 경우 이전에 503 오류가 발생한 시간대 정보가 포함된 기간을 제공합니다.

Private Cloud 사용자인 경우 다음 정보를 제공하세요.

  • 실패한 요청에 대해 관찰된 전체 오류 메시지
  • `503 오류가 관찰되는 조직, 환경 이름, API 프록시 이름
  • API 프록시 번들
  • 503 Service Unavailable 오류가 있는 요청이 포함된 trace 파일
  • 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 오류가 발생했을 때 메시지 프로세서 및 백엔드 서버에서 수집된