414 Identyfikator URI żądania jest za długi – TooBigLine

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Krótki opis problemu

Aplikacja kliencka otrzymuje kod stanu HTTP 414 Request-URI Too Long z kodem błędu protocol.http.TooBigLine w odpowiedzi na wywołania interfejsu API.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 414 Request-URI Too Long

Może też pojawić się ten komunikat o błędzie:

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

Zwróć uwagę, że faultstring w powyższym komunikacie o błędzie zawiera limit dozwolony dla wiersza żądania w Apigee Edge, który wynosi 7168 bytes (7 KB).

Możliwe przyczyny

Ten błąd występuje, jeśli rozmiar wiersza żądania wysłanego przez aplikację kliencką do Apigee Edge w ramach żądania HTTP jest większy niż dozwolony limit w Apigee Edge.

Zanim przyjrzymy się możliwym przyczynom tego błędu, wyjaśnijmy, co oznacza wiersz żądania i jak sprawdzić jego rozmiar.

Informacje o wierszu żądania

Typowe żądanie HTTP składa się z 3 części:

  1. Wiersz żądania
  2. ( Zestaw nagłówków HTTP )
  3. [ Treść ]

Wiersz żądania składa się z 3 części, jak pokazano poniżej.

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

Gdy aplikacja kliencka wysyła żądanie HTTP do serwera, pierwszy wiersz, który trafia do serwera, zawiera wiersz żądania opisany powyżej. Następnie przesyłane są nagłówki i treść żądania.

Poniższy przykładowy zrzut ekranu przedstawia typowe curl żądanie, część Request (wraz z wierszem żądania) i część Response.

Informacje o rozmiarze wiersza żądania

  1. W omówionym powyżej przykładzie wiersz początkowy (pierwszy wiersz) w żądaniu, nazywany też wierszem żądania, wygląda tak:
    GET /test/ HTTP/1.1

    Rozmiar wiersza żądania wynosi ~19 bytes ponieważ zawiera 19 ASCII characters. Ponieważ mieści się on w dozwolonym limicie w Apigee Edge, żądanie jest przetwarzane bez błędów i otrzymujesz odpowiedź.

  2. Podobnie, jeśli przyjrzysz się faultstring w komunikacie o błędzie pokazanym powyżej, zobaczysz tam tekst "request line size exceeding 7,168". Oznacza to,że wiersz żądania w żądaniu HTTP wysłanym przez klienta przekroczył 7168 bajtów.

Oto możliwe przyczyny tego błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów, których dotyczy
Rozmiar ładunku żądania jest większy niż dozwolony limit Rozmiar identyfikatora URI żądania wysłanego przez aplikację kliencką w ramach żądania HTTP do Apigee Edge jest większy niż dozwolony limit w Apigee Edge. Użytkownicy publicznej i prywatnej chmury Edge

Typowe czynności diagnostyczne

Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub metod:

Monitorowanie interfejsu API

Aby zdiagnozować błąd za pomocą monitorowania interfejsu API:

  1. Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
  2. Przejdź do organizacji, w której chcesz zbadać problem.

  3. Otwórz stronę Analyze > API Monitoring > Investigate (Analiza > Monitorowanie interfejsu API > Zbadaj).
  4. Wybierz konkretny przedział czasu, w którym wystąpiły błędy.
  5. Wykreśl kod błędu względem czasu.
  6. Wybierz komórkę z kodem błędu protocol.http.TooBigLine i kodem stanu 414, jak pokazano poniżej:

    ( powiększ obraz)

  7. Zobaczysz informacje o kodzie błędu protocol.http.TooBigline jak pokazano poniżej:

    ( powiększ obraz)

  8. Kliknij View logs (Wyświetl logi) i rozwiń wiersz nieudanego żądania:

    ( powiększ obraz)

  9. W oknie Logs (Logi) zanotuj te informacje:

    • Status Code (Kod stanu): 414
    • Fault Source (Źródło błędu): apigee
    • Fault Code (Kod błędu): protocol.http.TooBigLine.
    • Request Length(bytes) (Długość żądania (w bajtach)):7244 (> 7KB)
  10. Jeśli Fault Source (Źródło błędu) ma wartość apigee lub MP, Fault Code (Kod błędu) ma wartość protocol.http.TooBigLine, a Request-Length (Długość żądania) jest większa niż 7 KB, oznacza to, że żądanie HTTP od klienta ma identyfikator URI żądania większy niż dozwolony limit w Apigee.

Narzędzie Trace

NGINX

Aby zdiagnozować błąd za pomocą logów dostępu NGINX:

  1. Jeśli jesteś użytkownikiem prywatnej chmury, możesz użyć logów dostępu NGINX, aby określić kluczowe informacje o błędach HTTP 414.
  2. Sprawdź logi dostępu NGINX:

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

    Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.

  3. Sprawdź, czy w określonym czasie (jeśli problem wystąpił w przeszłości) nie ma błędów 414 lub czy nadal występują żądania, które kończą się niepowodzeniem z powodu błędu 414.
  4. Jeśli znajdziesz błędy 414 z X-Apigee-fault-code pasującym do wartości protocol.http.TooBigLine, określ wartość X-Apigee-fault-source.

    Powyższy przykładowy wpis z logu dostępu NGINX ma te wartości dla X-Apigee-fault-code i X-Apigee-fault-source:

    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source policy

    Zwróć uwagę na długość żądania: 7244 (7,244 KB > dozwolony limit)

Przyczyna: rozmiar ładunku żądania jest większy niż dozwolony limit

Diagnostyka

  1. Określ kod błędu, źródło błędu i rozmiar długości żądania w przypadku błędu zaobserwowanego za pomocą monitorowania interfejsu API, narzędzia Trace lub logów dostępu NGINX, jak opisano w sekcji Typowe czynności diagnostyczne.
  2. Jeśli Fault Source (Źródło błędu) ma wartość apigee lub MP, oznacza to, że rozmiar żądania wysłanego przez aplikację kliencką do Apigee jest większy niż dozwolony limit w Apigee Edge.
  3. Możesz sprawdzić, czy rozmiar wiersza żądania przekroczył dozwolony limit 7 KB, za pomocą jednej z tych metod:

    Komunikat o błędzie

    Aby sprawdzić, czy komunikat o błędzie jest prawidłowy:

    Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, to sprawdź faultstring. Wartość faultstring wskazuje, że rozmiar wiersza żądania przekroczył dozwolony limit 7 KB.

    Przykładowy komunikat o błędzie:

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

    Rzeczywiste żądanie

    Aby sprawdzić, czy rzeczywiste żądanie jest prawidłowe:

    Jeśli masz dostęp do rzeczywistego żądania wysłanego przez aplikację kliencką, wykonaj te czynności:

    1. Sprawdź rozmiar identyfikatora URI przekazanego w żądaniu.
    2. Jeśli okaże się, że rozmiar identyfikatora URI jest większy niż dozwolony limit w Apigee Edge, to jest to przyczyna problemu.

      Przykładowe żądanie:

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

      W powyższym przypadku wartość parametru zapytania qparam jest większa niż 7 KB, czyli zawiera więcej niż 7 tys. znaków ASCII.

      Jeśli używasz innego klienta, możesz sprawdzić jego logi i spróbować określić rozmiar wiersza żądania wysyłanego do Apigee Edge.

    Logi procesora komunikatów

    Aby sprawdzić, czy logi procesora komunikatów są prawidłowe:

    Jeśli jesteś użytkownikiem prywatnej chmury, możesz użyć logów procesora komunikatów, aby sprawdzić, czy rozmiar wiersza żądania przekroczył dozwolony limit w Apigee Edge.

    1. Sprawdź logi procesora komunikatów:

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

    2. Sprawdź, czy w określonym czasie (jeśli problem wystąpił w przeszłości) nie ma błędów 414 lub czy nadal występują żądania, które kończą się niepowodzeniem z powodu błędu 414. Możesz użyć tych ciągów wyszukiwania.
      grep -ri "exceeding"
      
      grep -ri "RequestURITooLong"
      
    3. Znajdziesz wiersze z system.log podobne do tych:
      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)

      Tekst message = request line size exceeding 7,168 w powyższym komunikacie o błędzie wskazuje, że rozmiar identyfikatora URI żądania jest większy niż 7 KB. Dlatego Apigee Edge zgłasza wyjątek com.apigee.errors.http.user.RequestURITooLong i zwraca 414 kod stanu z kodem błędu protocol.http.TooBigline do aplikacji klienckich.

Rozwiązanie

Napraw rozmiar

Opcja 1 [zalecana]: zmień aplikację kliencką, aby nie wysyłała identyfikatora URI żądania o rozmiarze większym niż dozwolony limit

  1. Przeanalizuj przyczynę, dla której konkretny klient wysyła identyfikator URI żądania o rozmiarze większym niż dozwolony limit określony w sekcji Limity.
  2. Jeśli nie jest to pożądane, zmodyfikuj aplikację kliencką, aby wysyłała identyfikator URI żądania o rozmiarze mniejszym niż dozwolony limit.

    W omówionym powyżej przykładzie możesz rozwiązać problem, przekazując długi parametr zapytania jako część treści żądania zamiast jako część adresu URL żądania, jak pokazano poniżej:

    curl https://<host>/testtoobigline -k -X GET -d '{_qparam=000000000000000000<trimmed>}' -v
    
  3. Jeśli jest to pożądane i chcesz wysłać identyfikator URI o rozmiarze większym niż dozwolony limit, przejdź do następnych opcji.

CwC

Opcja 2 : użyj właściwości CwC, aby zwiększyć limit wiersza żądania

Apigee udostępnia właściwość CwC, która umożliwia zwiększenie limitu rozmiaru wiersza żądania. Więcej informacji znajdziesz w artykule Ustawianie limitu wiersza żądania w procesorze komunikatów

Limity

Apigee oczekuje, że aplikacja kliencka i serwer backendu nie będą wysyłać wierszy żądania ani odpowiedzi o rozmiarach większych niż dozwolony limit, jak opisano w sekcji Limit wiersza żądania/odpowiedzi w artykule Limity Apigee Edge.

  1. Jeśli jesteś użytkownikiem chmury publicznej, maksymalny limit rozmiaru wiersza żądania i odpowiedzi jest zgodny z limitem rozmiaru wiersza żądania/odpowiedzi w artykule Limity Apigee Edge.
  2. Jeśli jesteś użytkownikiem prywatnej chmury , możesz zmodyfikować domyślny maksymalny limit rozmiaru wiersza żądania i odpowiedzi (chociaż nie jest to zalecane). Maksymalny limit rozmiaru wiersza żądania możesz określić, wykonując instrukcje opisane w sekcji Jak sprawdzić bieżący limit.

Jak sprawdzić bieżący limit?

W tej sekcji dowiesz się, jak sprawdzić, czy właściwość HTTPRequest.line.limit została zaktualizowana o nową wartość w procesorach komunikatów.

  1. Na maszynie procesora komunikatów wyszukaj właściwość HTTPRequest.line.limit w katalogu /opt/apigee/edge-message-processor/conf i sprawdź, jaka wartość została ustawiona, jak pokazano poniżej:
    grep -ri "HTTPRequest.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. Przykładowy wynik powyższego polecenia:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.line.limit=7k
  3. W powyższych danych wyjściowych zwróć uwagę, że właściwość HTTPRequest.line.limit została ustawiona na wartość 7k w pliku http.properties.

    Oznacza to, że limit rozmiaru wiersza żądania skonfigurowany w Apigee dla prywatnej chmury wynosi 7 KB.

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, przejdź do sekcji Informacje diagnostyczne, które musisz zebrać.

Informacje diagnostyczne, które musisz zebrać

Zbierz te informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge:

Jeśli jesteś użytkownikiem chmury publicznej, podaj te informacje:

  • Nazwa organizacji
  • Nazwa środowiska
  • Nazwa proxy interfejsu API
  • Pełne polecenie curl użyte do odtworzenia błędu 414
  • Plik śledzenia żądań do interfejsu API

Jeśli jesteś użytkownikiem prywatnej chmury, podaj te informacje:

  • Pełny komunikat o błędzie zaobserwowany w przypadku nieudanych żądań
  • Nazwa organizacji
  • Nazwa środowiska
  • Pakiet proxy interfejsu API
  • Plik śledzenia nieudanych żądań do interfejsu API
  • Pełne polecenie curl użyte do odtworzenia błędu 414
  • Logi dostępu NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    Gdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.

  • Logi systemowe procesora komunikatów /opt/apigee/var/log/edge-message-processor/logs/system.log