502 Плохой шлюз - TooBigLine

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

Симптом

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

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

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

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

Эта ошибка возникает, если размер строки ответа , отправленный целевым/внутренним сервером в Apigee Edge как часть ответа HTTP, превышает максимально допустимый предел в Apigee Edge .

Прежде чем мы рассмотрим возможные причины этой ошибки, давайте разберемся, что означает строка ответа и как проверить ее размер.

Понимание линии ответа

Типичный HTTP-ответ состоит из трех частей:

  1. Строка состояния (называемая строкой ответа в Apigee)
  2. (Набор HTTP-заголовков)
  3. [ Тело ]

Строка ответа состоит из трех частей: версия протокола , за которой следует числовой код состояния и связанная с ним текстовая фраза , как показано ниже:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

Когда ответ HTTP отправляется приложением целевого/внутреннего сервера, первая отправляемая строка представляет собой строку ответа , как описано выше. За этим следуют заголовки и тело ответа/полезная нагрузка. На следующем примере снимка экрана показан типичный запрос curl , часть запроса и часть ответа (вместе со строкой ответа).

Понимание размера линии ответа

  1. В примере, рассмотренном выше, начальная строка (первая строка) ответа, также называемая строкой ответа, выглядит следующим образом:

    HTTP/1.1 200 OK

    Эта строка ответа имеет размер ~15 bytes поскольку содержит 15 ASCII characters . Поскольку это находится в пределах допустимого предела в Apigee Edge , ответ отправляется обратно клиенту без каких-либо ошибок со стороны Apigee Edge.

  2. Аналогично, если вы посмотрите на faultstring в сообщении об ошибке , показанном выше, она содержит "response line size exceeding 2,048" . Это указывает на то, что строка ответа в ответе HTTP, отправленном целевым/внутренним сервером, превысила 2048 байт.

Понимание большой линии ответа

В соответствии с определением строки состояния (называемой здесь строкой ответа ) и типичными HTTP-запросами и ответами, размер будет намного меньше, чем определенный предел по умолчанию в 2 КБ в Apigee Edge, поэтому мы можем не достичь предела. Однако вот несколько возможных сценариев, в которых вы можете превысить этот предел:

  1. Целевой/внутренний сервер не является системой HTTP. Возможно, он отвечает ответом, отличным от HTTP.
  2. На целевом/внутреннем сервере возникли проблемы, и он отправляет длинную строку ответа как часть ответа HTTP.

Подробнее об этом читайте в разделе Получение протокола ошибок.http.TooBigLine, «размер строки ответа превышает 2048 .

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

Причина Описание Инструкции по устранению неполадок применимы для
Размер строки ответа превышает допустимый предел Размер строки ответа , отправленной целевым/внутренним сервером как часть ответа HTTP на Apigee Edge, превышает допустимый предел в Apigee Edge. Пользователи Edge Public и Private Cloud

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

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

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

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

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

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

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

  8. Вы увидите информацию о коде неисправности protocol.http.TooBigLine , как показано ниже:

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

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

  10. В окне «Журналы» обратите внимание на следующие детали:
    • Код состояния: 502
    • Источник неисправности: target
    • Код ошибки: protocol.http.TooBigLine .
  11. Если источник сбоя имеет значение target , а код сбоя имеет значение protocol.http.TooBigLine , это означает, что ответ HTTP от целевого/внутреннего сервера имеет размер строки ответа, превышающий максимально допустимый предел в Apigee Edge .

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

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

    Обратите внимание на значения ошибки из трассировки:

    • ошибка: response line exceeding 2,048
    • error.class : com.apigee.errors.http.server.BadGateway

    Это указывает на то, что Apigee Edge (компонент процессора сообщений) выдает ошибку, как только получает ответ от внутреннего сервера, из-за того, что размер строки ответа превышает допустимый предел.

  5. Вы увидите сообщение об ошибке, отправленное клиенту на этапе «Ответ, отправленный клиенту» , как показано ниже:

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

  6. Обратите внимание на значения ошибки из трассировки:
    • Ошибка: 502 Bad Gateway .
    • Содержание ошибки: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. Вы также можете перейти к этапу AX (записанные аналитические данные) в трассировке и щелкнуть по нему, чтобы просмотреть подробные сведения об ошибке.

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

    Обратите внимание на ценность следующего:

    Заголовки запросов Ценить
    X-Apigee-код неисправности protocol.http.TooBigLine
    X-Apigee-источник-ошибки target
    Содержание ошибки: Тело {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

НГИНКС

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

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

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

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

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

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

    Заголовки ответов Ценить
    X-Apigee-код неисправности protocol.http.TooBigLine
    X-Apigee-источник-ошибки target

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

Диагностика

  1. Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Если источник сбоя имеет значение target , это означает, что размер строки ответа, отправленный приложением целевого/внутреннего сервера в Apigee, превышает допустимый предел в Apigee Edge .
  3. Вы можете проверить, что размер строки ответа превысил разрешенный предел в 2 КБ, используя один из следующих методов:

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

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

    Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, обратитесь к faultstring .

    Пример сообщения об ошибке:

    "faultstring":"response line size exceeding 2,048"

    Приведенная выше faultstring указывает на то, что размер строки ответа превысил допустимый предел в 2 КБ.

    Фактический запрос

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

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

    1. Проверьте размер линии ответа
    2. Если вы обнаружите, что размер URI превышает допустимый предел в Apigee Edge , то это и есть причина проблемы.

      Пример ответа от целевого/внутреннего сервера:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0

      В приведенном выше случае строка ответа HTTP/1.1 200 1111…<trimmed>...11111111 имеет размер более 2 КБ, то есть содержит более 2 000 символов ASCII.

      Если вы используете какой-либо другой клиент, вы можете просмотреть журналы клиента и попытаться узнать размер строки ответа, отправляемой в Apigee Edge.

    Журналы процессора сообщений

    Для проверки с использованием журналов процессора сообщений:

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

    1. Определите идентификатор сообщения неудачного запроса с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
    2. Найдите идентификатор сообщения в журнале процессора сообщений:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. Вы найдете строки из system.log , подобные следующим:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)

      Текстовое message = response line size exceeding 2,048 в приведенном выше сообщении об ошибке, указывает на то, что размер строки ответа превышает 2 КБ. Поэтому Apigee Edge выдает исключение и возвращает код состояния 502 с кодом ошибки protocol.http.TooBigline http.TooBigline клиентским приложениям.

Разрешение

Исправить размер

Вариант № 1 [рекомендуется]: Исправьте приложение целевого/внутреннего сервера, чтобы оно не отправляло строки ответа, размер которых превышает допустимый предел.

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

КвК

Вариант 2. Используйте свойство CwC, чтобы увеличить лимит строки ответа.

Apigee предоставляет свойство CwC , которое позволяет увеличить предел размера строки ответа. Дополнительные сведения см. в разделе «Установка ограничения количества строк ответа на процессоре сообщений» .

Пределы

Apigee ожидает, что клиентское приложение и внутренний сервер не будут отправлять строки запроса/ответа, размеры которых превышают допустимый предел, как описано в разделе «Ограничение строки запроса/ответа» в Apigee Edge Limits .

  1. Если вы являетесь пользователем общедоступного облака , то максимальный предел размера строки запроса и ответа соответствует размеру строки запроса/ответа, указанному в Apigee Edge Limits .
  2. Если вы являетесь пользователем частного облака, возможно, вы изменили максимальный предел по умолчанию для размера строки запроса и ответа (хотя это не рекомендуется). Вы можете определить максимальный размер строки ответа, следуя инструкциям в разделе «Как проверить текущий предел» .

Как проверить текущий лимит?

В этом разделе объясняется, как проверить, что свойство HTTPResponse.line.limit обновлено новым значением в процессорах сообщений.

  1. На компьютере с процессором сообщений найдите свойство HTTPResponse.line.limit в каталоге /opt/apigee/edge-message-processor/conf и проверьте, какое значение было установлено, как показано ниже:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. Пример результата выполнения приведенной выше команды выглядит следующим образом:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
  3. Обратите внимание, что в приведенном выше примере для свойства HTTPResponse.line.limit установлено значение 2k в http.properties .

    Это означает, что ограничение размера строки ответа, настроенное в Apigee для частного облака, составляет 2 КБ.

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

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

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

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

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

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

  • Полное сообщение об ошибке, наблюдаемое для неудачных запросов
  • Название организации
  • Имя среды
  • Пакет API-прокси
  • Файл трассировки неудачных запросов API
  • Полная команда curl , используемая для воспроизведения ошибки 502
  • Журналы доступа 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