503 Служба недоступна — преждевременное закрытие внутренним сервером

Вы просматриваете документацию Apigee Edge .
Перейдите в документацию Apigee
X.info

Симптом

После вызова API-прокси клиентское приложение получает HTTP-ответ со статусом 503 и сообщением Service Unavailable .

Сообщение об ошибке

Клиентское приложение получает следующий код ответа:

HTTP/1.1 503 Service Unavailable

Кроме того, вы можете увидеть следующее сообщение об ошибке:

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

Возможные причины

Причина Описание Инструкции по устранению неполадок, применимые для
Целевой сервер преждевременно закрывает соединение. Целевой сервер преждевременно разрывает соединение, пока обработчик сообщений еще отправляет полезную нагрузку запроса. Пользователи публичных и частных облачных сервисов на периферии сети

Общие этапы диагностики

Определите идентификатор сообщения (Message ID) запроса, завершившегося с ошибкой.

инструмент трассировки

Чтобы определить идентификатор сообщения, в котором произошел сбой запроса, используя инструмент трассировки:

  1. Если проблема сохраняется, включите сеанс трассировки для затронутого API.
  2. Выполните вызов API и воспроизведите проблему — ошибка 503 Service Unavailable с кодом ошибки messaging.adaptors.http.flow.ServiceUnavailable.
  3. Выберите один из запросов, завершившихся неудачей.
  4. Перейдите к этапу AX и определите идентификатор сообщения ( X-Apigee.Message-ID ) запроса, прокрутив вниз в разделе « Подробности этапа» , как показано на следующем рисунке.

    Message ID in Phase Details section

Журналы доступа NGINX

Чтобы определить идентификатор сообщения, содержащего ошибку при выполнении запроса, используя журналы доступа NGINX:

Также можно обратиться к журналам доступа NGINX, чтобы определить идентификатор сообщения для ошибок 503 Это особенно полезно, если проблема возникала ранее или если она носит периодический характер, и вы не можете получить трассировку в пользовательском интерфейсе. Выполните следующие шаги, чтобы получить эту информацию из журналов доступа NGINX:

  1. Проверьте журналы доступа NGINX: ( /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log )
  2. Выполните поиск, чтобы проверить наличие ошибок 503 для конкретного API-прокси за определенный период времени (если проблема возникала ранее) или наличие запросов, которые по-прежнему завершаются с ошибкой 503 .
  3. Если возникают ошибки 503 с кодом X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable , запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:

    Пример записи, демонстрирующей ошибку 503

    Sample entry showing status code, message ID, fault source, and fault code

Причина: Целевой сервер преждевременно закрывает соединение.

Диагноз

  1. Если вы являетесь пользователем публичного или частного облака :
    1. Используйте инструмент «Трассировка» (как описано в разделе «Общие шаги диагностики» ) и убедитесь, что в панели «Записанные аналитические данные» установлены оба следующих параметра:
      • X-Apigee.fault-code: messaging.adaptors.http.flow.ServiceUnavailable
      • X-Apigee.fault-source: target

      alt_text

    2. Используйте инструмент трассировки (как описано в разделе «Общие шаги диагностики ») и убедитесь, что в панели ошибок сразу после свойства состояния TARGET_REQ_FLOW установлены оба следующих параметра:
      • error.class: com.apigee.errors.http.server.ServiceUnavailableException
      • Причина ошибки: Broken pipe

      alt_text

    3. Для дальнейшего анализа перейдите к разделу «Использование tcpdump» .
  2. Если вы являетесь пользователем частного облака :
    • Определите идентификатор сообщения , в котором запрос завершился с ошибкой.
    • Найдите идентификатор сообщения в журнале обработчика сообщений ( /opt/apigee/var/log/edge-message-processor/logs/system.log ).
    • Вы увидите одно из следующих исключений:

      Исключение #1: java.io.IOException: Произошла ошибка "Broken pipe" при записи в канал 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: 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. В пакетах 6 и 7 серверная часть ответила подтверждением 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 возникали в прошлом.

Если вы являетесь пользователем частного облака , предоставьте следующую информацию:

  • Полное сообщение об ошибке, полученное для неудачных запросов.
  • Название организации, среды и имя 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 были собраны на процессорах сообщений и бэкэнд-сервере в момент возникновения ошибки.