Вы просматриваете документацию 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-ответ состоит из трех частей:
- Строка состояния (называемая строкой ответа в Apigee)
- (Набор HTTP-заголовков)
- [ Тело ]
Строка ответа состоит из трех частей: версия протокола , за которой следует числовой код состояния и связанная с ним текстовая фраза , как показано ниже:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
Когда ответ HTTP отправляется приложением целевого/внутреннего сервера, первая отправляемая строка представляет собой строку ответа , как описано выше. За этим следуют заголовки и тело ответа/полезная нагрузка. На следующем примере снимка экрана показан типичный запрос curl
, часть запроса и часть ответа (вместе со строкой ответа).
Понимание размера линии ответа
В примере, рассмотренном выше, начальная строка (первая строка) ответа, также называемая строкой ответа, выглядит следующим образом:
HTTP/1.1 200 OK
Эта строка ответа имеет размер
~15 bytes
поскольку содержит15 ASCII characters
. Поскольку это находится в пределах допустимого предела в Apigee Edge , ответ отправляется обратно клиенту без каких-либо ошибок со стороны Apigee Edge.- Аналогично, если вы посмотрите на
faultstring
в сообщении об ошибке , показанном выше, она содержит"response line size exceeding 2,048"
. Это указывает на то, что строка ответа в ответе HTTP, отправленном целевым/внутренним сервером, превысила 2048 байт.
Понимание большой линии ответа
В соответствии с определением строки состояния (называемой здесь строкой ответа ) и типичными HTTP-запросами и ответами, размер будет намного меньше, чем определенный предел по умолчанию в 2 КБ в Apigee Edge, поэтому мы можем не достичь предела. Однако вот несколько возможных сценариев, в которых вы можете превысить этот предел:
- Целевой/внутренний сервер не является системой HTTP. Возможно, он отвечает ответом, отличным от HTTP.
- На целевом/внутреннем сервере возникли проблемы, и он отправляет длинную строку ответа как часть ответа HTTP.
Подробнее об этом читайте в разделе Получение протокола ошибок.http.TooBigLine, «размер строки ответа превышает 2048 .
Вот возможные причины ошибки:
Причина | Описание | Инструкции по устранению неполадок применимы для |
---|---|---|
Размер строки ответа превышает допустимый предел | Размер строки ответа , отправленной целевым/внутренним сервером как часть ответа HTTP на Apigee Edge, превышает допустимый предел в Apigee Edge. | Пользователи Edge Public и Private Cloud |
Общие этапы диагностики
Для диагностики этой ошибки используйте один из следующих инструментов/методов:
API-мониторинг
Чтобы диагностировать ошибку с помощью мониторинга API:
- Войдите в пользовательский интерфейс Apigee Edge как пользователь с соответствующей ролью .
Переключитесь на организацию, в которой вы хотите разобраться в проблеме.
- Перейдите на страницу Анализ > Мониторинг API > Расследование .
- Выберите конкретный период времени, в течение которого вы наблюдали ошибки.
- Вы можете выбрать прокси- фильтр, чтобы сузить код неисправности.
- Постройте график зависимости кода неисправности от времени .
Выберите ячейку с кодом неисправности
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
.
- Подождите, пока произойдет ошибка
- Выберите один из неудачных запросов и проверьте трассировку.
- Перемещайтесь по различным этапам трассировки и найдите место, где произошел сбой.
Обычно вы обнаруживаете ошибку в сообщении об ошибке
flowinfo
сразу после этапа отправки запроса на целевой сервер, как показано ниже:Обратите внимание на значения ошибки из трассировки:
- ошибка:
response line exceeding 2,048
- error.class :
com.apigee.errors.http.server.BadGateway
Это указывает на то, что Apigee Edge (компонент процессора сообщений) выдает ошибку, как только получает ответ от внутреннего сервера, из-за того, что размер строки ответа превышает допустимый предел.
- ошибка:
Вы увидите сообщение об ошибке, отправленное клиенту на этапе «Ответ, отправленный клиенту» , как показано ниже:
- Обратите внимание на значения ошибки из трассировки:
- Ошибка:
502 Bad Gateway
. - Содержание ошибки:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- Ошибка:
Вы также можете перейти к этапу AX (записанные аналитические данные) в трассировке и щелкнуть по нему, чтобы просмотреть подробные сведения об ошибке.
( просмотреть увеличенное изображение )
Обратите внимание на ценность следующего:
Заголовки запросов Ценить X-Apigee-код неисправности protocol.http.TooBigLine
X-Apigee-источник-ошибки target
Содержание ошибки: Тело {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
НГИНКС
Чтобы диагностировать ошибку с помощью журналов доступа 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-код неисправности protocol.http.TooBigLine
X-Apigee-источник-ошибки target
Причина: Размер строки ответа превышает допустимый предел.
Диагностика
- Определите код ошибки и источник ошибки , наблюдаемой с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
- Если источник сбоя имеет значение
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 КБ, то есть содержит более 2 000 символов ASCII.Если вы используете какой-либо другой клиент, вы можете просмотреть журналы клиента и попытаться узнать размер строки ответа, отправляемой в Apigee Edge.
Журналы процессора сообщений
Для проверки с использованием журналов процессора сообщений:
Если вы являетесь пользователем частного облака , вы можете использовать журналы процессора сообщений, чтобы проверить, превысил ли размер строки ответа разрешенный предел в Apigee Edge .
- Определите идентификатор сообщения неудачного запроса с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе «Общие шаги диагностики» .
Найдите идентификатор сообщения в журнале процессора сообщений:
/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
http.TooBigline клиентским приложениям.
Разрешение
Исправить размер
Вариант № 1 [рекомендуется]: Исправьте приложение целевого/внутреннего сервера, чтобы оно не отправляло строки ответа, размер которых превышает допустимый предел.
- Проанализируйте причину, по которой конкретный клиент отправил строку ответа, размер которой превышает допустимый предел, определенный в Limits .
- Если это нежелательно, измените приложение целевого/внутреннего сервера так, чтобы оно отправляло строку ответа размером меньше разрешенного предела.
- Если это желательно и вы хотите отправить строку ответа размером больше разрешенного предела, перейдите к следующим параметрам.
КвК
Вариант 2. Используйте свойство CwC, чтобы увеличить лимит строки ответа.
Apigee предоставляет свойство CwC , которое позволяет увеличить предел размера строки ответа. Дополнительные сведения см. в разделе «Установка ограничения количества строк ответа на процессоре сообщений» .
Пределы
Apigee ожидает, что клиентское приложение и внутренний сервер не будут отправлять строки запроса/ответа, размеры которых превышают допустимый предел, как описано в разделе «Ограничение строки запроса/ответа» в Apigee Edge Limits .
- Если вы являетесь пользователем общедоступного облака , то максимальный предел размера строки запроса и ответа соответствует размеру строки запроса/ответа, указанному в Apigee Edge Limits .
- Если вы являетесь пользователем частного облака, возможно, вы изменили максимальный предел по умолчанию для размера строки запроса и ответа (хотя это не рекомендуется). Вы можете определить максимальный размер строки ответа, следуя инструкциям в разделе «Как проверить текущий предел» .
Как проверить текущий лимит?
В этом разделе объясняется, как проверить, что свойство HTTPResponse.line.limit
обновлено новым значением в процессорах сообщений.
- На компьютере с процессором сообщений найдите свойство
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 для частного облака, составляет 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