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

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

Симптом

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

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

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • ошибка: response headers size exceeding 25,600
    • error.class : com.apigee.errors.http.server.BadGateway

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

  5. Вы увидите ошибку в ответе об ошибке, отправленном клиенту, отправленном Apigee Edge, как показано ниже:

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

  6. Обратите внимание на значения ошибки из трассировки. Приведенный выше пример трассировки показывает:
    • Ошибка: 502 Bad Gateway .
    • Содержимое ошибки: {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
  7. Перейдите к этапу AX (записанные аналитические данные) в трассировке и щелкните его, чтобы просмотреть соответствующие сведения.

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

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

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

НГИНКС

Чтобы диагностировать ошибку с помощью журналов доступа 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.TooBigHeaders в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему не выполняются с 502 .
  4. Если вы обнаружите какие-либо ошибки 502 с кодом X-Apigee-fault-code , соответствующим значению protocol.http.TooBigHeaders , определите значение X-Apigee-fault-source.

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

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

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

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

Диагностика

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

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

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

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

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

    "faultstring":"response headers size exceeding 25,600"

    В приведенном выше сообщении об ошибке обратите внимание на faultstring , что ответ содержит заголовки, общий размер которых превышает допустимый предел .

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

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

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

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

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

      curl -v https://TARGET_SERVER_HOST/test
      
      * About to connect() to 10.1.0.10 port 9000 (#0)
      *   Trying 10.1.0.10...
      * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
      > GET /test HTTP/1.1
      > User-Agent: curl/7.29.0
      > Host: 10.1.0.10:9000
      > Accept: */*
      <
      < HTTP/1.1 200 OK
      < Accept-Ranges: bytes
      < Content-Length: 0
      < Content-Type: text/plain; charset=utf-8
      < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
      < Testheader1: XVlBzgba—-<snipped>---THctcuAx
      < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP
      < Date: Fri, 23 Jul 2021 09:51:22 GMT
      <
      * Connection #0 to host 10.1.0.10 left intact
      

      В приведенном выше примере Testheader1 и Testheader2 имеют более высокие размеры, что и является причиной этой ошибки, поскольку они превышают допустимый предел в Apigee Edge .

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

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

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

    1. Проверьте журналы процессора сообщений:

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

    2. Выполните поиск, чтобы узнать, возникли ли какие-либо ошибки 502 в течение определенного периода времени (если проблема возникла в прошлом) или есть ли какие-либо запросы, которые по-прежнему завершаются с ошибкой 502 . Вы можете использовать следующую строку поиска:
      grep -ri "response headers size exceeding"
      
    3. Вы найдете строки из system.log , подобные следующим. Размер заголовков ответов может отличаться в вашем случае:
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1
      messageid:r23ijb1b-1  NIOThread@1 ERROR HTTP.CLIENT -
      HTTPClient$Context$3.onException() :  ClientChannel[Connected:
      Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1
      bytesRead=0 bytesWritten=207 age=640ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600
      
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest
      rev:1 messageid:r23ijb1b-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
    4. Как только процессор сообщений получает ответ от внутреннего/целевого сервера и обнаруживает, что общий размер заголовков превышает 25 КБ, он останавливается и выдает ошибку:

      response headers size exceeding 25,600

      Это означает, что общий размер заголовка превышает 25 КБ, и Apigee выдает ошибку, когда размер начинает превышать предел в 25 КБ с кодом ошибки в качестве protocol.http.TooBigHeaders

Разрешение

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

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

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

КвК

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

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

Пределы

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

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

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

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

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

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

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

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

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

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

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