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

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

Симптом

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

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

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

HTTP/1.1 503 Service Unavailable

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

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

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

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

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

Определите идентификатор сообщения неудачного запроса.

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

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

  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 messages.adaptors.http.flow.ServiceUnavailable , запишите идентификатор сообщения для одного или нескольких таких запросов, как показано в следующем примере:

    Пример записи, показывающий ошибку 503

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

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

Диагностика

  1. Если вы являетесь пользователем публичного или частного облака :
    1. Используйте инструмент «Трассировка» (как описано в разделе «Общие шаги диагностики» ) и убедитесь, что на панели «Записанные аналитические данные» установлены оба следующих параметра:
      • X-Apigee.fault-код: 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: произошел разрыв канала при записи в канал 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. В пакетах 6 и 7 внутренний сервер ответил ACK на часть полезной нагрузки запроса, полученной от процессора сообщений.
    4. Однако в пакете 12 вместо ответа ACK на полученные пакеты данных приложения и последующего ответа с ответной полезной нагрузкой внутренний сервер вместо этого отвечает FIN ACK инициируя закрытие соединения.
    5. Это ясно показывает, что внутренний сервер преждевременно закрывает соединение, в то время как процессор сообщений все еще отправляет полезную нагрузку запроса.
    6. Это приводит к тому, что процессор сообщений записывает ошибку IOException: Broken Pipe и возвращает клиенту 503

Разрешение

  1. Работайте с одной или обеими командами приложений и сетевых служб, чтобы проанализировать и устранить проблему с преждевременными отключениями на стороне внутреннего сервера.
  2. Убедитесь, что приложение внутреннего сервера не истекло по тайм-ауту и ​​не сбрасывало соединение перед получением всей полезной нагрузки запроса.
  3. Если у вас есть какое-либо промежуточное сетевое устройство или уровень между Apigee и внутренним сервером, убедитесь, что у них не истекает время ожидания до получения всей полезной нагрузки запроса.

Если проблема не устранена, перейдите к разделу «Необходимо собрать диагностическую информацию» .

Необходимо собрать диагностическую информацию

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

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

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