502 Плохой шлюз — ResponseWithBody

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

Симптом

Клиентское приложение получает код состояния HTTP 502 Bad Gateway с кодом ошибки protocol.http.ResponseWithBody в качестве ответа на вызовы API.

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

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

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

Эта ошибка возникает, если HTTP-ответ от внутреннего сервера к Apigee Edge имеет значение 204 No Content или 205 Reset Content , но содержит тело ответа и/или один или несколько следующих заголовков:

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

В соответствии со спецификациями RFC 7231, раздел 6.3.5: 204 «Нет содержимого» и RFC 7231, раздел 6.3.6: 205 «Сбросить содержимое» , ожидается, что никакой дополнительный контент не должен отправляться как часть тела полезной нагрузки ответа с кодом состояния 204 No Content или 205 Reset Content исходным сервером. Заголовки ответа, такие как Content-Length , Content-Encoding или Transfer-Encoding указывают размер, тип или формат полезных данных ответа.

Таким образом, Apigee Edge возвращает код состояния 502 Bad Gateway с кодом ошибки protocol.http.ResponseWithBody клиенту при следующих обстоятельствах:

Код состояния с внутреннего сервера
Ответ от внутреннего сервера содержит 204 Нет содержания 205 Сбросить содержимое
Тело ответа ОШИБКА ОШИБКА

Заголовок Content-Length

(установлено ненулевое значение)

ОШИБКА ОШИБКА

Content-Encoding

(установлено поддерживаемое кодирование в Apigee Edge )

ОШИБКА НЕТ ОШИБКИ
Transfer-Encoding ОШИБКА ОШИБКА

Вот возможные причины этой ошибки:

Причина Описание Инструкции по устранению неполадок применимы для
Тело ответа или заголовки с ответом 204 от внутреннего сервера. Внутренний сервер отправляет ответ 204 No Content или 205 Reset Content с телом ответа и/или одним или несколькими заголовками Content-Type , Content-Encoding или Transfer-Encoding . Пользователи Edge Public и Private Cloud

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

Для диагностики этой ошибки используйте один из следующих инструментов/методов:

API-мониторинг

Чтобы диагностировать ошибку с помощью мониторинга API:

  1. Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
  2. Переключитесь на организацию, в которой вы хотите разобраться в проблеме.

  3. Перейдите на страницу Анализ > Мониторинг API > Расследование .
  4. Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
  5. Постройте график зависимости кода неисправности от времени .
  6. Выберите ячейку с кодом ошибки protocol.http.ResponseWithBody , как показано ниже:

    ( просмотреть увеличенное изображение )

  7. Вы увидите информацию о коде ошибки protocol.http.ResponseWithBody , как показано ниже:

    ( просмотреть увеличенное изображение )

  8. Нажмите «Просмотреть журналы» и разверните строку с невыполненным запросом.

    ( просмотреть увеличенное изображение )

  9. В окне «Журналы» обратите внимание на следующие детали:
    • Код состояния: 502
    • Источник неисправности: target
    • Код ошибки: protocol.http.ResponseWithBody .
  10. Если источник сбоя имеет target значение, а код сбоя имеет значение protocol.http.ResponseWithBody , это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния 204 No Content или 205 Reset Content с телом ответа и/или один из заголовков, упомянутых в разделе «Возможные причины» .

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

Чтобы диагностировать ошибку с помощью инструмента трассировки:

  1. Включите сеанс трассировки и выполните одно из следующих действий:
    1. Подождите, пока произойдет ошибка 502 Bad Gateway . или
    2. Если вы можете воспроизвести проблему, выполните вызов API и воспроизведите ошибку 502 Bad Gateway .
  2. Убедитесь, что параметр «Показать все FlowInfos» включен:

  3. Выберите один из неудачных запросов и проверьте трассировку.
  4. Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
  5. Обычно вы обнаруживаете ошибку в сообщении об ошибке flowinfo сразу после этапа отправки запроса на целевой сервер, как показано ниже:

    Сценарий №1

    Сценарий № 1: Внутренний сервер отвечает кодом состояния 204 No Content , содержащего тело ответа и/или один из заголовков, перечисленных в разделе «Возможные причины» .

    Обратите внимание на следующие значения из трассировки:

    • ошибка: Received 204 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway

    Сценарий №2

    Сценарий № 2: Внутренний сервер отвечает кодом состояния 204 No Content , содержащего тело ответа и/или один из заголовков, перечисленных в разделе «Возможные причины» .

    Обратите внимание на следующие значения из трассировки:

    • ошибка: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. Перейдите к этапу AX (записанные аналитические данные) в трассировке и щелкните его.
  7. Прокрутите вниз до раздела «Сведения о фазе , заголовки ошибок» и определите значения X-Apigee-fault-code и X-Apigee-fault-source, как показано ниже:

    ( просмотреть увеличенное изображение )

  8. Обратите внимание, что значениями X-Apigee-fault-code и X-Apigee-fault-source are protocol.http.ResponseWithBody и target соответственно. Это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния 204 No Content или 205 Reset Content вместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины .
    Ошибка Ценить
    X-Apigee-код неисправности protocol.http.ResponseWithBody
    X-Apigee-источник-ошибки target

НГИНКС

Чтобы диагностировать ошибку с помощью журналов доступа NGINX:

  1. Если вы являетесь пользователем частного облака , вы можете использовать журналы доступа NGINX для определения ключевой информации о HTTP 502 Bad Gateway .
  2. Проверьте журналы доступа NGINX:

    /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log

    Где: ORG , ENV и PORT# заменяются фактическими значениями.

  3. Выполните поиск, чтобы узнать, есть ли какие-либо ошибки 502 с кодом ошибки protocol.http.ResponseWithBody в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему завершаются с ошибкой 502 .
  4. Если вы обнаружите какие-либо ошибки 502 с кодом X-Apigee-fault-code , соответствующим значению protocol.http.ResponseWithBody , определите значение X-Apigee-fault-source .

    Пример ошибки 502 из журнала доступа NGINX:

    Приведенный выше пример записи из журнала доступа NGINX имеет следующие значения для X-Apigee-fault-code и X-Apigee-fault-source :

    Заголовки ответов Ценить
    X-Apigee-код неисправности protocol.http.ResponseWithBody
    X-Apigee-источник-ошибки target
  5. Обратите внимание, что значениями X-Apigee-fault-code и X-Apigee-fault-source являются protocol.http.ResponseWithBody и target соответственно. Это указывает на то, что ошибка произошла из-за того, что внутренний сервер отправил код состояния 204 No Content или 205 Reset Content вместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины .

Причина: тело ответа или заголовки с ответом 204 от внутреннего сервера.

Диагностика

  1. Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Если код ошибкиprotocol.http.ResponseWithBody , а источник ошибки имеет значение target , то это означает, что внутренний сервер ответил кодом состояния 204 No Content или 205 Reset Content с телом ответа и/или одним из упомянутых заголовков. в разделе Возможные причины .
  3. Чтобы проверить, действительно ли внутренний сервер отправил тело полезных данных ответа и/или один или несколько заголовков, упомянутых в разделе «Возможные причины» , вы можете выполнить следующие шаги:

    1. Если вы являетесь пользователем общедоступного облака и можете ли вы сделать тот же запрос API к внутреннему серверу непосредственно из любой из ваших систем.

    2. Если вы являетесь пользователем частного облака , то вы можете сделать тот же API-запрос к внутреннему серверу непосредственно от одного из процессоров сообщений, связанных с конкретной организацией и средой, где наблюдается сбой.
    3. Просмотрите ответ, полученный от внутреннего сервера, и убедитесь, что он содержит тело полезных данных ответа и/или один или несколько вышеупомянутых заголовков. Если да, то это причина этой ошибки.

      Образец №1

      Пример № 1: Ответ внутреннего сервера 204 с заголовком Content-Encoding

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      В этом примере внутренний сервер ответил кодом состояния 204 No Content и Content-Encoding: gzip

      Образец №2

      Пример № 2: Ответ внутреннего сервера 204 с заголовком Content-Length

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      В этом примере внутренний сервер ответил кодом состояния 204 No Content и Content-Length: 48

      Образец №3

      Пример № 3: Ответ внутреннего сервера 205 с телом ответа

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      В этом примере внутренний сервер ответил кодом состояния 205 Reset Content с телом ответа This is a sample Response.

    4. Во всех приведенных выше примерах внутренний сервер отправлял код состояния 204 No Content или 205 Reset Content вместе с телом ответа и/или одним из заголовков, упомянутых в разделе Возможные причины .
    5. Поэтому Apigee Edge отправил код состояния 502 Bad Gateway с кодом ошибки protocol.http.ResponseWithBody .

Разрешение

Убедитесь, что внутренний сервер всегда соответствует спецификации RFC 7231, раздел 6.3.6: 205 Reset Content при отправке ответа 204 No Content или 205 Reset Content в Apigee Edge. То есть внутренний сервер НЕ ДОЛЖЕН отправлять следующее как часть ответа 204 No Content или 205 Reset Content :

  1. Тело полезной нагрузки ответа
  2. И любой из следующих заголовков:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Спецификация

Apigee Edge отвечает кодом состояния 502 Bad Gateway и кодом ошибки protocol.http.ResponseWithBody если внутренний сервер отправляет ответ 204 No Content или 205 Reset Content , но не соответствует следующим спецификациям RFC:

Спецификация
RFC 7231, раздел 6.3.5: 204 Нет содержимого
RFC 7231, раздел 6.3.6: 205 Сбросить содержимое

Ключевые моменты, на которые следует обратить внимание

Рекомендуемое решение — исправить внутренний сервер, чтобы он отправлял код состояния 204 No Content и 205 Reset Content без тела ответа и любых заголовков — Content-Length , Content-Encoding и Transfer-Encoding и придерживаться спецификаций RFC 7231. раздел 6.3.5: 204 No Content и RFC 7231, раздел 6.3.6: 205 Reset Content .

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

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

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

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

  • Название организации
  • Имя среды
  • Имя API-прокси
  • Полная команда curl , используемая для воспроизведения ошибки 502
  • Файл трассировки запросов API

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

  • Полное сообщение об ошибке, наблюдаемое для неудачных запросов
  • Имя среды
  • Пакет API-прокси
  • Файл трассировки запросов API
  • Журналы доступа NGINX /opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log

    Где: ORG , ENV и PORT# заменяются фактическими значениями.

  • Системные журналы процессора сообщений /opt/apigee/var/log/edge-message-processor/logs/system.log