414 Request-URI Too Long (URI запроса слишком длинный) – TooBigLine

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

Symptom

Клиентское приложение получает код статуса HTTP 414 Request-URI Too Long с кодом ошибки protocol.http.TooBigLine в качестве ответа на вызовы API.

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

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

HTTP/1.1 414 Request-URI Too Long

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

{
   "fault":{
      "faultstring":"request line size exceeding 7,168",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Обратите внимание, что в приведенном выше сообщении об ошибке faultstring содержит ограничение, разрешенное для строки запроса в Apigee Edge, которое составляет 7168 bytes (7 КБ).

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

Эта ошибка возникает, если размер строки запроса, отправленной клиентским приложением в Apigee Edge в составе HTTP-запроса, превышает допустимый лимит в Apigee Edge.

Прежде чем мы рассмотрим возможные причины этой ошибки, давайте разберемся, что такое строка запроса и как проверить ее размер.

Понимание строки запроса

Типичный HTTP-запрос состоит из трех частей:

  1. Request-Line
  2. ( Набор HTTP-заголовков)
  3. [ Body ]

Строка запроса состоит из трех частей, как показано ниже.

Request-Line = <Method> <Request-URI> <HTTP-Version>

Когда клиентское приложение отправляет HTTP-запрос на сервер, первая строка, которая передается на сервер, содержит строку запроса, описанную выше. Затем следуют заголовки и тело/полезная нагрузка запроса.

На приведенном ниже скриншоте показан типичный запрос curl, часть Request (вместе с Request-Line) и часть Response.

Как определить размер строки запроса

  1. В рассмотренном выше примере строка start (первая строка) в запросе, также называемая Request-Line, выглядит следующим образом:
    GET /test/ HTTP/1.1

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

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

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

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

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

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

Мониторинг API

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

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

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

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

  7. Информация о коде ошибки protocol.http.TooBigline будет показана, как на изображении ниже.

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

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

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

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

    • Код статуса: 414.
    • Источник ошибки: apigee
    • Код ошибки: protocol.http.TooBigLine.
    • Длина запроса(в байтах): 7244 (> 7KB)
  10. Если в поле Источник ошибки указано значение apigee или MP, в поле Код ошибки – значение protocol.http.TooBigLine, а в поле Длина запроса – значение больше 7 КБ, это означает, что URI запроса HTTP-запроса от клиента превышает допустимый лимит в Apigee.

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

nginx

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

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

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

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

  3. Выполните поиск, чтобы узнать, возникали ли ошибки 414 за определенный период (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 414.
  4. Если вы обнаружите ошибки 414, в которых 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 policy

    Обратите внимание на длину запроса: 7244 (7244 КБ превышает допустимое значение).

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

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

  1. Определите код ошибки, источник ошибки и размер длины запроса для ошибки, обнаруженной с помощью мониторинга API, инструмента трассировки или журналов доступа NGINX, как описано в разделе Распространенные этапы диагностики.
  2. Если в поле Fault Source указано значение apigee или MP, это означает, что размер запроса, отправленного клиентским приложением в Apigee, превышает допустимый лимит в Apigee Edge.
  3. Вы можете проверить, превышает ли размер строки запроса допустимое значение 7 КБ, одним из следующих способов:

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

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

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

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

    "faultstring":"request line size exceeding 7,168"

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

    Чтобы проверить запрос:

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

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

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

      curl http://<hostalias>/testtoobigline?_qparam=000000000000000000……..000000<trimmed> -k -X POST
      

      В приведенном выше примере значение параметра запроса qparam превышает 7 КБ, то есть содержит более 7000 символов ASCII.

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

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

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

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

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

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

    2. Выполните поиск, чтобы узнать, были ли 414 ошибки за определенный период времени (если проблема возникла в прошлом) или есть ли запросы, которые по-прежнему завершаются с ошибкой 414. Вы можете использовать следующие поисковые запросы:
      grep -ri "exceeding"
      
      grep -ri "RequestURITooLong"
      
    3. Вы увидите строки из system.log, похожие на следующие:
      2021-07-12 08:53:31,461  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() : Request:null, uri:null,
      message Id:null, exception:com.apigee.errors.http.user.RequestURITooLong{
      code = protocol.http.TooBigLine, message = request line size exceeding 7,168,
      associated contexts = []}, context:Context@366f4217
      input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.195.90:8443
      Local:192.168.67.23:34256]@301912 useCount=1 bytesRead=0 bytesWritten=45849
      age=2254670ms lastIO=0ms isOpen=true)

      Текст message = request line size exceeding 7,168 в приведенном выше сообщении об ошибке указывает на то, что размер URI запроса превышает 7 КБ. Поэтому Apigee Edge выдает исключение com.apigee.errors.http.user.RequestURITooLong и возвращает клиентским приложениям код статуса 414 с кодом ошибки protocol.http.TooBigline .

Разрешение

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

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

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

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

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. Если вам нужно отправить URI больше, чем разрешено, перейдите к следующему варианту.

CwC

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

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

Ограничения

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

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

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

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

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

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

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

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

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

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

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

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

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