Вы просматриваете документацию по 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-ответ состоит из трех частей:
- Строка статуса (в Apigee называется Строкой ответа)
- ( Набор HTTP-заголовков)
- [ Body ]
Строка ответа состоит из трех частей: версии протокола, числового кода статуса и связанной с ним текстовой фразы, как показано ниже:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
Когда целевое или серверное приложение отправляет HTTP-ответ, первая строка представляет собой строку ответа, как описано выше. Затем следуют заголовки и текст ответа.На скриншоте ниже показан типичный запрос curl, а также разделы Request и Response (вместе с Response-Line).
Размер строки ответа
В примере, рассмотренном выше, строка start (первая строка) в ответе, также называемая строкой ответа, выглядит следующим образом:
HTTP/1.1 200 OK
Размер этой строки ответа –
~15 bytes, поскольку она содержит15 ASCII characters. Поскольку это значение находится в пределах допустимого лимита в Apigee Edge, ответ отправляется клиенту без ошибок со стороны Apigee Edge.- Аналогично, если вы посмотрите на
faultstringв сообщении об ошибке, показанном выше, то увидите, что оно содержит"response line size exceeding 2,048". Это означает, что строка ответа в HTTP-ответе, отправленном целевым или внутренним сервером, превысила 2048 байт.
Как анализировать длинные строки ответа
Согласно определению Status-Line (здесь – Response-Line) и типичным HTTP-запросам и ответам, размер будет намного меньше заданного по умолчанию ограничения в 2 КБ в Apigee Edge, поэтому мы можем не достичь этого ограничения. Однако в некоторых случаях вы можете превысить это ограничение:
- Целевой/внутренний сервер не является системой HTTP. Возможно, он отвечает не HTTP-ответом.
- У целевого или внутреннего сервера возникли проблемы, и он отправляет длинную строку ответа в составе HTTP-ответа.
Подробнее об этом можно прочитать в статье Возникает ошибка protocol.http.TooBigLine, "response line size exceeding 2,048.
Возможные причины ошибки:
| Причина | Описание | Инструкции по устранению неполадок, применимые к |
|---|---|---|
| Размер строки ответа превышает допустимое значение | Размер строки Response-Line, отправленной целевым/внутренним сервером в составе HTTP-ответа Apigee Edge, превышает допустимый лимит в Apigee Edge. | Пользователи общедоступного и частного облака Edge |
Распространенные этапы диагностики
Чтобы диагностировать эту ошибку, используйте один из следующих инструментов или методов:
Мониторинг API
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в интерфейс Apigee Edge как пользователь с подходящей ролью.
Перейдите к организации, в которой хотите изучить проблему.
- Перейдите на страницу Анализ > Мониторинг API > Исследование.
- Выберите период времени, в течение которого вы наблюдали ошибки.
- Чтобы сузить область поиска кода ошибки, выберите фильтр Прокси.
- Постройте график Код ошибки по оси Y и Время по оси X.
Выберите ячейку с кодом ошибки
protocol.http.TooBigLine, как показано ниже.( посмотреть изображение в полном размере)
Вы увидите информацию о коде ошибки
protocol.http.TooBigLine, как показано ниже.( посмотреть изображение в полном размере)
Нажмите Посмотреть журналы и разверните строку с неудачным запросом.
- В окне Журналы обратите внимание на следующие сведения:
- Код статуса:
502. - Источник ошибки:
target - Код ошибки:
protocol.http.TooBigLine.
- Код статуса:
- Если в поле Источник ошибки указано значение
target, а в поле Код ошибки –protocol.http.TooBigLine, это означает, что размер строки ответа HTTP от целевого или внутреннего сервера превышает максимально допустимое ограничение в Apigee Edge.
Инструмент "Трассировка"
- Включите сеанс трассировки и один из следующих вариантов:
- Дождитесь появления ошибки
502 Bad Gateway. или - Если вам удастся воспроизвести проблему, выполните вызов API и воспроизведите ошибку
502 Bad Gateway.
- Дождитесь появления ошибки
- Выберите один из неудачных запросов и изучите трассировку.
- Перемещайтесь по разным этапам трассировки и находите, где произошла ошибка.
Обычно ошибка находится в разделе
flowinfoError сразу после этапа Request sent to target server, как показано ниже:
Запишите значения ошибок из трассировки:
- Ошибка:
response line exceeding 2,048 - error.class:
com.apigee.errors.http.server.BadGateway
Это означает, что Apigee Edge (компонент Message Processor) выдает ошибку, как только получает ответ от внутреннего сервера, поскольку размер строки ответа превышает допустимое значение.
- Ошибка:
Сообщение об ошибке, отправленное клиенту, будет показано на этапе Ответ, отправленный клиенту, как показано ниже.
( посмотреть изображение в полном размере)
- Запишите значения ошибки из трассировки:
- Ошибка:
502 Bad Gateway. - Контент с ошибкой:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- Ошибка:
Вы также можете перейти к фазе AX (запись данных Аналитики) в трассировке и нажать на нее, чтобы посмотреть сведения об ошибке.
( посмотреть изображение в полном размере)
Запишите следующие значения:
Заголовки запроса Значение X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source targetКонтент ошибки : тело {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
nginx
Чтобы диагностировать ошибку с помощью журналов доступа NGINX:
- Если вы используете частное облако, то можете использовать журналы доступа NGINX, чтобы определить ключевую информацию об ошибках HTTP
502. Проверьте журналы доступа NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logГде: ORG, ENV и PORT# заменяются фактическими значениями.
- Выполните поиск, чтобы узнать, возникали ли ошибки
502за определенный период (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой502. Если вы обнаружите ошибки
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.TooBigLineX-Apigee-fault-source target
Причина: размер строки ответа превышает допустимое значение.
диагностика;
- Определите код ошибки и источник ошибки, используя мониторинг API, инструмент трассировки или журналы доступа NGINX, как описано в разделе Распространенные шаги диагностики.
- Если в поле Fault Source (Источник ошибки) указано значение
target, это означает, что размер строки ответа, отправленной целевым/внутренним серверным приложением в Apigee, превышает допустимый лимит в Apigee Edge. Вы можете проверить, превышает ли размер строки ответа допустимое значение 2 КБ, одним из следующих способов:
Сообщение об ошибке
Чтобы проверить данные с помощью сообщения об ошибке:
Если у вас есть доступ к полному сообщению об ошибке, полученному от Apigee Edge, ознакомьтесь с разделом
faultstring.Пример сообщения об ошибке
"faultstring":"response line size exceeding 2,048"
Указанный выше код
faultstringозначает, что размер строки ответа превысил допустимый лимит в 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, с помощью журналов обработчика сообщений.
- Определите идентификатор сообщения для запроса, который не удалось выполнить, с помощью API Monitoring, инструмента трассировки или журналов доступа NGINX, как описано в разделе Общие шаги диагностики.
Найдите идентификатор сообщения в журнале Message Processor:
/opt/apigee/var/log/edge-message-processor/logs/system.logВы увидите строки из
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 (рекомендуется). Измените целевое или серверное приложение, чтобы оно не отправляло строки ответа, размер которых превышает допустимый предел.
- Проанализируйте причину, по которой определенный клиент отправил строку ответа, размер которой превышает допустимый лимит, указанный в разделе Лимиты.
- Если это нежелательно, измените целевое/внутреннее серверное приложение так, чтобы оно отправляло строку ответа размером меньше допустимого.
- Если вам нужно отправить строку ответа большего размера, чем разрешено, перейдите к следующему варианту.
CwC
Вариант 2. Используйте свойство CwC, чтобы увеличить лимит строки ответа
Apigee предоставляет свойство CwC, которое позволяет увеличить лимит размера строки ответа. Подробнее о том, как задать ограничение на строку ответа в Message Processor…
Ограничения
Apigee ожидает, что клиентское приложение и сервер не будут отправлять строки запроса/ответа, размер которых превышает допустимый лимит, указанный в разделе Лимит на строку запроса/ответа статьи Лимиты Apigee Edge.
- Если вы используете общедоступное облако, максимальный размер строки запроса и ответа соответствует значению, указанному в разделе Размер строки запроса/ответа статьи Ограничения Apigee Edge.
- Если вы используете частное облако , то могли изменить максимальный размер строки запроса и ответа (хотя это не рекомендуется). Чтобы узнать, какой максимальный размер строки ответа установлен в настоящее время, следуйте инструкциям в разделе Как проверить текущий лимит.
Как проверить текущий лимит?
В этом разделе рассказывается, как проверить, что в процессорах сообщений для ресурса HTTPResponse.line.limit задано новое значение.
- На компьютере Message Processor найдите свойство
HTTPResponse.line.limitв каталоге/opt/apigee/edge-message-processor/confи проверьте, какое значение задано, как показано ниже:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- Пример результата выполнения команды:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
В приведенном выше примере выходных данных обратите внимание, что свойству
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