502 Bad Gateway - TooBigLine

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

Symptom

Клиентское приложение получает код статуса 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. [ Body ]

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

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

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

Размер строки ответа

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

    HTTP/1.1 200 OK

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

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

Как анализировать длинные строки ответа

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

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

Подробнее об этом можно прочитать в статье Возникает ошибка protocol.http.TooBigLine, "response line size exceeding 2,048.

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

Причина Описание Инструкции по устранению неполадок, применимые к
Размер строки ответа превышает допустимое значение Размер строки Response-Line, отправленной целевым/внутренним сервером в составе HTTP-ответа Apigee Edge, превышает допустимый лимит в Apigee Edge. Пользователи общедоступного и частного облака Edge

Распространенные этапы диагностики

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

Мониторинг API

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

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

  3. Перейдите на страницу Анализ > Мониторинг API > Исследование.
  4. Выберите период времени, в течение которого вы наблюдали ошибки.
  5. Чтобы сузить область поиска кода ошибки, выберите фильтр Прокси.
  6. Постройте график Код ошибки по оси Y и Время по оси X.
  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 Error сразу после этапа Request sent to target server, как показано ниже:

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

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

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

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

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

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

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

    Запишите следующие значения:

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

nginx

Чтобы диагностировать ошибку с помощью журналов доступа 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-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

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

диагностика;

  1. Определите код ошибки и источник ошибки, используя мониторинг API, инструмент трассировки или журналы доступа NGINX, как описано в разделе Распространенные шаги диагностики.
  2. Если в поле Fault Source (Источник ошибки) указано значение 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 КБ, то есть содержит более 2000 символов ASCII.

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

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

    Чтобы проверить данные с помощью журналов Message Processor, выполните следующие действия:

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

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

      /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 .

Разрешение

Фиксированный размер

Вариант 1 (рекомендуется). Измените целевое или серверное приложение, чтобы оно не отправляло строки ответа, размер которых превышает допустимый предел.

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

CwC

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

Apigee предоставляет свойство CwC, которое позволяет увеличить лимит размера строки ответа. Подробнее о том, как задать ограничение на строку ответа в Message Processor…

Ограничения

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

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

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

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

  1. На компьютере Message Processor найдите свойство 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 для Private Cloud задано ограничение на размер строки ответа в 2 КБ.

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

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

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

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

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

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

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

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

  • Системные журналы Message Processor /opt/apigee/var/log/edge-message-processor/logs/system.log