502 Nieprawidłowa bramka – TooBigLine

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

Krótki opis problemu

Aplikacja kliencka otrzymuje kod stanu HTTP 502 Bad Gateway 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 502 Bad Gateway

Możesz też zobaczyć ten komunikat o błędzie:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

Możliwe przyczyny

Ten błąd występuje, jeśli rozmiar wiersza odpowiedzi wysłanego przez serwer docelowy lub backendowy do Apigee Edge w ramach odpowiedzi HTTP jest większy niż maksymalny dozwolony limit w Apigee Edge.

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

Co to jest wiersz odpowiedzi?

Typowa odpowiedź HTTP składa się z 3 części:

  1. Wiersz stanu (w Apigee nazywany wierszem odpowiedzi)
  2. ( Zestaw nagłówków HTTP )
  3. [ Treść ]

Wiersz odpowiedzi składa się z 3 części: wersji protokołu, liczbowego kodu stanu i powiązanego z nim wyrażenia tekstowego, jak pokazano poniżej:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

Gdy aplikacja serwera docelowego lub backendowego wysyła odpowiedź HTTP, pierwszy wysłany wiersz reprezentuje wiersz odpowiedzi opisany powyżej. Następują po nim nagłówki i treść odpowiedzi lub ładunek.Poniższy przykładowy zrzut ekranu przedstawia typowe curl żądanie, część Request (Żądanie) i część Response (Odpowiedź) (wraz z wierszem odpowiedzi).

Co to jest rozmiar wiersza odpowiedzi?

  1. W omówionym powyżej przykładzie wiersz start (pierwszy wiersz) w odpowiedzi, nazywany też wierszem odpowiedzi , wygląda tak:

    HTTP/1.1 200 OK

    Ten wiersz odpowiedzi ma rozmiar ~15 bytes, ponieważ zawiera 15 ASCII characters. Ponieważ mieści się on w dozwolonym limicie w Apigee Edge, odpowiedź jest wysyłana z powrotem do klienta bez żadnych błędów przez Apigee Edge.

  2. Podobnie, jeśli przyjrzysz się faultstring w komunikacie o błędzie pokazanym powyżej, zobaczysz tam tekst "response line size exceeding 2,048". Oznacza to,że wiersz odpowiedzi w odpowiedzi HTTP wysłanej przez serwer docelowy lub backendowy przekroczył 2048 bajtów.

Co to jest duży wiersz odpowiedzi?

Zgodnie z definicją wiersza stanu (nazywanego tutaj wierszem odpowiedzi) oraz typowymi żądaniami i odpowiedziami HTTP jego rozmiar jest znacznie mniejszy niż zdefiniowany domyślny limit 2 KB w Apigee Edge, więc nie powinien go przekraczać. Oto jednak kilka możliwych scenariuszy, w których możesz przekroczyć ten limit:

  1. Serwer docelowy lub backendowy nie jest systemem HTTP. Może odpowiadać odpowiedzią inną niż HTTP odpowiedź.
  2. Serwer docelowy lub backendowy ma problemy i wysyła długi wiersz odpowiedzi w ramach odpowiedzi HTTP.

Więcej informacji znajdziesz w artykule Getting error protocol.http.TooBigLine, "response line size exceeding 2,048.

Oto możliwe przyczyny tego błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów, które mają zastosowanie do
Rozmiar wiersza odpowiedzi przekracza dozwolony limit Rozmiar wiersza odpowiedzi wysłanego przez serwer docelowy lub backendowy w ramach odpowiedzi HTTP do Apigee Edge jest większy niż dozwolony limit w Apigee Edge. Użytkownicy chmury publicznej i prywatnej Edge

Typowe czynności diagnostyczne

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

Monitorowanie interfejsów API

Aby zdiagnozować błąd za pomocą monitorowania interfejsów 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 (Analiza) > API Monitoring (Monitorowanie interfejsów API) > Investigate (Zbadaj).
  4. Wybierz konkretny przedział czasu, w którym wystąpiły błędy.
  5. Aby zawęzić kod błędu, możesz wybrać filtr Proxy.
  6. Wykreśl Fault Code (Kod błędu) na osi Time (Czas).
  7. Wybierz komórkę z kodem błędu protocol.http.TooBigLine jak pokazano poniżej:

    ( powiększ obraz)

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

    ( powiększ obraz)

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

  10. W oknie Logs (Logi) zanotuj te informacje:
    • Status Code (Kod stanu): 502
    • Fault Source (Źródło błędu): target
    • Fault Code (Kod błędu): protocol.http.TooBigLine.
  11. Jeśli Fault Source (Źródło błędu) ma wartość target, a Fault Code (Kod błędu) ma wartość protocol.http.TooBigLine, oznacza to, że odpowiedź HTTP z serwera docelowego lub backendowego ma wiersz odpowiedzi o rozmiarze większym niż maksymalny dozwolony limit w Apigee Edge.

Narzędzie Trace

  1. Włącz sesję śledzenia i wykonaj jedną z tych czynności:
    1. Poczekaj na wystąpienie błędu 502 Bad Gateway lub
    2. jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz błąd 502 Bad Gateway.
  2. Wybierz jedno z nieudanych żądań i sprawdź ślad.
  3. Przejdź przez różne etapy śledzenia i znajdź miejsce, w którym wystąpił błąd.
  4. Zwykle błąd znajdziesz w sekcji flowinfo Error (Błąd) tuż po etapie Request sent to target server (Żądanie wysłane do serwera docelowego) jak pokazano poniżej:

    Zanotuj wartości błędu ze śladu:

    • error (błąd): response line exceeding 2,048 (wiersz odpowiedzi przekracza 2048)
    • error.class (klasa błędu): com.apigee.errors.http.server.BadGateway

    Oznacza to, że Apigee Edge (komponent procesora komunikatów) zgłasza błąd, gdy tylko otrzyma odpowiedź z serwera backendu, ponieważ rozmiar wiersza odpowiedzi przekracza dozwolony limit.

  5. Komunikat o błędzie wysłany do klienta zobaczysz na etapie Response Sent to Client (Odpowiedź wysłana do klienta) jak pokazano poniżej:

    ( powiększ obraz)

  6. Zanotuj wartości błędu ze śladu:
    • Error (Błąd): 502 Bad Gateway.
    • Treść błędu: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. Możesz też przejść do etapu AX (Analytics Data Recorded) (Zarejestrowane dane analityczne) w śladzie i kliknąć go, aby zobaczyć szczegóły błędu.

    ( powiększ obraz)

    Zanotuj wartość tych elementów:

    Nagłówki żądania Wartość
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    Error Content : Body {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

NGINX

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

  1. Jeśli jesteś użytkownikiem chmury prywatnej, możesz użyć logów dostępu NGINX, aby określić kluczowe informacje o błędach HTTP 502.
  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) występują błędy 502 lub czy nadal występują żądania, które kończą się niepowodzeniem z kodem 502.
  4. Jeśli znajdziesz błędy 502 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 target

Przyczyna: rozmiar wiersza odpowiedzi przekracza dozwolony limit

Diagnostyka

  1. Określ Fault Code (Kod błędu) i Fault Source (Źródło błędu) zaobserwowanego błędu za pomocą monitorowania interfejsów API, narzędzia Trace lub logów dostępu NGINX zgodnie z opisem w sekcji Typowe czynności diagnostyczne.
  2. Jeśli Fault Source (Źródło błędu) ma wartość target, oznacza to, że rozmiar wiersza odpowiedzi wysłanego przez aplikację serwera docelowego lub backendowego do Apigee jest większy niż dozwolony limit w Apigee Edge.
  3. Możesz sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit 2 KB, za pomocą jednej z tych metod:

    Komunikat o błędzie

    Aby sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit, użyj komunikatu o błędzie:

    Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, sprawdź faultstring.

    Przykładowy komunikat o błędzie:

    "faultstring":"response line size exceeding 2,048"

    Powyższy faultstring wskazuje, że rozmiar wiersza odpowiedzi przekroczył dozwolony limit 2 KB.

    Rzeczywiste żądanie

    Aby sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit, użyj rzeczywistego żądania:

    Jeśli masz dostęp do rzeczywistego żądania wysłanego do aplikacji serwera docelowego lub backendowego, wykonaj te czynności:

    1. Sprawdź rozmiar wiersza odpowiedzi.
    2. Jeśli okaże się, że rozmiar URI przekracza dozwolony limit w Apigee Edge, to jest to przyczyna problemu.

      Przykładowa odpowiedź z serwera docelowego lub backendowego:

      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

      W tym przypadku wiersz odpowiedzi HTTP/1.1 200 1111…<trimmed>...11111111 jest większy niż 2 KB, czyli zawiera więcej niż 2 tys. znaków ASCII.

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

    Logi procesora komunikatów

    Aby sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit, użyj logów procesora komunikatów:

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

    1. Określ identyfikator wiadomości nieudanego żądania za pomocą monitorowania interfejsów API, narzędzia Trace, lub logów dostępu NGINX zgodnie z opisem w sekcji Typowe czynności diagnostyczne.
    2. Wyszukaj identyfikator wiadomości w logu procesora komunikatów:

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

    3. Znajdziesz wiersze z system.log podobne do tych:

      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)

      Tekst message = response line size exceeding 2,048 w powyższym komunikacie o błędzie wskazuje, że rozmiar wiersza odpowiedzi przekracza 2 KB. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu 502 z kodem błędu protocol.http.TooBigline do aplikacji klienckich.

Rozwiązanie

Naprawianie rozmiaru

Opcja 1 [zalecana]: zmień aplikację serwera docelowego lub backendowego, aby nie wysyłała wierszy odpowiedzi o rozmiarze większym niż dozwolony limit

  1. Przeanalizuj przyczynę, dla której konkretny klient wysyła wiersz odpowiedzi o rozmiarze większym niż dozwolony limit określony w sekcji Limity.
  2. Jeśli nie jest to pożądane, zmodyfikuj aplikację serwera docelowego lub backendowego, aby wysyłała wiersz odpowiedzi o rozmiarze mniejszym niż dozwolony limit.
  3. Jeśli jest to pożądane i chcesz wysyłać wiersz odpowiedzi 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 odpowiedzi

Apigee udostępnia właściwość CwC , która pozwala zwiększyć limit rozmiaru wiersza odpowiedzi. Więcej informacji znajdziesz w artykule Ustawianie limitu wiersza odpowiedzi w procesorze komunikatów.

Limity

Apigee oczekuje, że aplikacja kliencka i serwer backendowy nie będą wysyłać wierszy żądań ani odpowiedzi o rozmiarach większych niż dozwolony limit, zgodnie z opisem w sekcji Limit wiersza żądania lub odpowiedzi w artykule Limity Apigee Edge.

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

Jak sprawdzić aktualny limit?

W tej sekcji wyjaśniamy, jak sprawdzić, czy właściwość HTTPResponse.line.limit została zaktualizowana o nową wartość w Message Processor.

  1. Na komputerze procesora komunikatów wyszukaj właściwość HTTPResponse.line.limit w katalogu /opt/apigee/edge-message-processor/conf i sprawdź, jaka wartość została ustawiona, jak pokazano poniżej:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. Przykładowy wynik powyższego polecenia wygląda tak:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
  3. W powyższym przykładzie zwróć uwagę, że właściwość HTTPResponse.line.limit została ustawiona na wartość 2k w pliku http.properties.

    Oznacza to, że limit rozmiaru wiersza odpowiedzi skonfigurowany w Apigee dla chmury prywatnej wynosi 2 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 potem 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 502
  • Plik śledzenia żądań do interfejsu API

Jeśli jesteś użytkownikiem chmury prywatnej, 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 502
  • 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