431 Слишком большие поля заголовка запроса — TooBigHeaders

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

Симптом

В ответ на вызовы API клиентское приложение получает HTTP-статус 431 Request Header Fields Too Large с кодом ошибки protocol.http.TooBigHeaders .

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

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

HTTP/1.1 431 Request Header Fields Too Large

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

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

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

Эта ошибка возникает, если общий размер всех заголовков запроса, отправляемых клиентским приложением в Apigee Edge в рамках HTTP-запроса, превышает допустимый предел в Apigee Edge согласно RFC 6585, раздел 5: 431 Слишком большой размер полей заголовка запроса .

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

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

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

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

Мониторинг API

Для диагностики ошибки с помощью мониторинга API:

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

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

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

  7. Ниже вы увидите информацию о коде ошибки protocol.http.TooBigHeaders :

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

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

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

  9. В окне «Журналы» обратите внимание на следующие сведения:

    • Код состояния: 431
    • Источник неисправности: apigee
    • Код ошибки: protocol.http.TooBigHeaders .
    • Длина запроса (байты): 32150 (> 25 KB)
  10. Если в поле Fault Source указано значение apigee или MP , в поле Fault Code — значение protocol.http.TooBigHeaders , а Request Length превышает 25 КБ, это означает, что общий размер всех заголовков запроса, отправленных клиентским приложением в рамках HTTP-запроса, превышает допустимый лимит в Apigee .

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

NGINX

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

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

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

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

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

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

    Заголовки ответа Ценить
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source MP

    Обратите внимание на длину запроса: 40159 (40 КБ больше 25 КБ, допустимого предела для заголовков запросов в Apigee Edge).

    В приведенной выше записи журнала X-Apigee-fault-source имеет значение apigee или MP , X-Apigee-fault-code имеет значение protocol.http.TooBigHeaders , а Request Length составляет 40 КБ, что превышает допустимый лимит в Apigee — 25 КБ. Это явно указывает на то, что общий размер всех заголовков запроса, отправленных клиентским приложением в рамках HTTP-запроса, превысил допустимый лимит в 25 КБ в Apigee Edge.

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

Диагноз

  1. Определите код ошибки , источник ошибки и размер запроса (Request-Length) для обнаруженной ошибки, используя мониторинг API или журналы доступа NGINX, как описано в разделе «Общие шаги диагностики» .
  2. Если в поле Fault Source указано значение apigee или MP , в поле Fault Code — значение protocol.http.TooBigHeaders , а Request Length превышает 25 КБ, это означает, что размер запроса, отправленного клиентским приложением в Apigee, превышает допустимый предел в Apigee Edge .
  3. Проверить, превысил ли размер заголовков запроса допустимый лимит в 25 КБ, можно одним из следующих способов:

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

    Для проверки используйте сообщение об ошибке:

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

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

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

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

    Для проверки с использованием фактического запроса:

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

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

      Пример запроса:

      curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
      

      В приведенном выше случае общий размер заголовков header0 , header1 , header2 и header3 превышает 25 КБ, то есть содержит более 25 КБ символов ASCII (байтов).

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

    Журналы обработчика сообщений

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

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

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

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

    2. Выполните поиск, чтобы проверить наличие ошибок 431 за определенный период времени (если проблема возникала в прошлом) или наличие запросов, которые по-прежнему завершаются с ошибкой 431 Вы можете использовать следующие поисковые запросы.
      grep -ri "exceeding"
      
      grep -ri "RequestHeadersTooLarge"
      
    3. В файле system.log вы найдете строки, похожие на следующие:
      2021-07-27 08:30:28,419  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() :
      Request:GET, uri:/test/, message Id:null,
      exception:com.apigee.errors.http.user.RequestHeadersTooLarge{
      code = protocol.http.TooBigHeaders, message = request headers size
      exceeding 25,600, associated contexts = []}, context:Context@9c5903
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130
      useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms  lastIO=0ms
      isOpen=true)

      Текстовое message = request headers size exceeding 25,600 в приведенном выше сообщении об ошибке указывает на то, что общий размер заголовков запроса превышает 25 КБ. Поэтому Apigee Edge генерирует исключение com.apigee.errors.http.user.RequestHeadersTooLarge и возвращает код состояния 431 с кодом ошибки protocol.http.TooBigHeaders клиентским приложениям.

Разрешение

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

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

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

    В приведенном выше примере проблему можно решить, передав параметр long header values ​​в составе тела/полезной нагрузки запроса:

    curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
    
  3. Если это необходимо и вы хотите отправить больше заголовков, чем разрешено, перейдите к следующему варианту.

CwC

Вариант №2: Используйте свойство CwC для увеличения лимита строк запроса.

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

Пределы

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

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

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

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

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

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

Спецификация

Apigee Edge ожидает, что клиентское приложение не будет отправлять заголовки большого размера в рамках запроса. В случае, если запрос содержит заголовки, общий размер которых превышает указанный лимит, Apigee выдает ошибку 431 Request Header Fields Too Large в соответствии со следующими спецификациями RFC:

Спецификация
RFC 6585, раздел 5: 431 Слишком большие поля заголовка запроса

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

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

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

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

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

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

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