502 Nieprawidłowa bramka – TooBigLine

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Krótki opis problemu

W odpowiedzi na wywołania interfejsu API aplikacja kliencka otrzymuje kod stanu HTTP 502 Bad Gateway z kodem błędu protocol.http.TooBigLine .

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 502 Bad Gateway

Oprócz tego może pojawić się 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 wysyłany przez serwer docelowy/backend do Apigee Edge w ramach odpowiedzi HTTP jest większy niż maksymalny dozwolony limit w Apigee Edge.

Zanim zajmiemy się możliwymi przyczynami tego błędu, dowiedz się, co oznacza wiersz odpowiedzi i jak sprawdzić jego rozmiar.

Omówienie wiersza odpowiedzi

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

  1. Status-Line (nazwany w Apigee jako Response-Line)
  2. ( Zestaw nagłówków HTTP )
  3. [ Treść ]

Wiersz odpowiedzi składa się z 3 części: wersji protokołu, po których następują numeryczny kod stanu i powiązane z nim wyrażenie tekstowe, jak pokazano poniżej:

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

Gdy aplikacja serwera docelowego lub backendu wysyła odpowiedź HTTP, pierwszy wysłany wiersz reprezentuje wiersz odpowiedzi, jak opisano powyżej. Po nim znajdują się nagłówki oraz treść/ładunek odpowiedzi.Poniższy przykładowy zrzut ekranu przedstawia typowe żądanie curl, część Request oraz część Response (wraz z wierszem odpowiedzi).

Informacje o rozmiarze wiersza odpowiedzi

  1. W przykładzie powyżej 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ż ta liczba mieści się w dozwolonym limicie w Apigee Edge, odpowiedź jest odsyłana do klienta bez błędów przez Apigee Edge.

  2. Podobnie jeśli spojrzysz na element faultstring w komunikacie o błędzie widocznym powyżej, zawiera on "response line size exceeding 2,048". Oznacza to,że wartość wiersza odpowiedzi w odpowiedzi HTTP wysłanej przez serwer docelowy/backend przekracza 2048 bajtów.

Interpretacja dużej linii odpowiedzi

Zgodnie z definicją Status-Line (Linia odpowiedzi nazywana tutaj Response-Line) oraz typowymi żądaniami i odpowiedziami HTTP rozmiar jest znacznie mniejszy niż zdefiniowany domyślny limit 2 K w Apigee Edge, więc możemy nie osiągnąć tego limitu. Oto jednak kilka możliwych scenariuszy, w których ten limit może zostać przekroczony:

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

Więcej informacji na ten temat znajdziesz w artykule o uzyskiwaniu protokołu błędu.http.TooBigLine, „rozmiar wiersza odpowiedzi powyżej 2048.

Oto możliwe przyczyny błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
Rozmiar wiersza odpowiedzi jest większy niż dozwolony limit Rozmiar wiersza odpowiedzi wysyłanego przez serwer docelowy/backend w ramach odpowiedzi HTTP do Apigee Edge jest większy niż dozwolony limit w Apigee Edge Użytkownicy chmury publicznej i prywatnej usługi Edge

Najczęstsze kroki diagnostyki

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

Monitorowanie interfejsów API

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

  1. Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
  2. Przełącz się na organizację, w której chcesz zbadać problem.

  3. Otwórz stronę Analiza > Monitorowanie interfejsów API > Zbadaj.
  4. Wybierz przedział czasu, w którym zaobserwowano błędy.
  5. Możesz wybrać filtr Serwer proxy, aby zawęzić liczbę kodów błędów.
  6. Porównaj kod błędu z czasem.
  7. Wybierz komórkę z kodem błędu protocol.http.TooBigLine, jak pokazano poniżej:

    ( wyświetl większy obraz)

  8. Informacje o kodzie błędu protocol.http.TooBigLine wyświetlą się poniżej:

    ( wyświetl większy obraz)

  9. Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.

  10. W oknie Logi zwróć uwagę na te informacje:
    • Kod stanu: 502
    • Źródło błędu: target
    • Kod błędu: protocol.http.TooBigLine.
  11. Jeśli źródło błędu ma wartość target, a kod błędu ma wartość protocol.http.TooBigLine, oznacza to, że rozmiar wiersza odpowiedzi z serwera docelowego/ serwera backendu ma wartość większą niż maksymalny dozwolony limit w Apigee Edge.

Narzędzie do śledzenia

  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, wykonaj wywołanie interfejsu API i odtwórz błąd 502 Bad Gateway.
  2. Wybierz 1 z nieudanych żądań i sprawdź log czasu.
  3. Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
  4. Błąd występuje zwykle w sekcji Błąd flowinfo tuż po etapie Żądanie wysłane do serwera docelowego, jak pokazano poniżej:

    Zapisz wartości błędu ze logu czasu:

    • błąd: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    Oznacza to, że Apigee Edge (komponent Message Processor) zgłasza błąd, gdy tylko otrzyma odpowiedź z serwera backendu z powodu przekroczenia limitu wiersza odpowiedzi.

  5. Komunikat o błędzie wysłany do klienta zobaczyłby się poniżej na etapie Odpowiedź wysłana do klienta:

    ( wyświetl większy obraz)

  6. Zapisz wartości błędu ze logu czasu:
    • 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ść w logu czasu do fazy AX (rejestrowane dane Analytics) i kliknąć ją, aby zobaczyć szczegóły błędu.

    ( wyświetl większy obraz)

    Zwróć uwagę na te kwestie:

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

NGINX

Aby zdiagnozować błąd przy użyciu logów dostępu NGINX:

  1. Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów dostępu NGINX, aby określić kluczowe informacje o błędach HTTP 502.
  2. Sprawdź logi dostępu do 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 występują jakieś błędy 502 w danym okresie (jeśli problem występował w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z 502.
  4. Jeśli znajdziesz błędy 502 z kodem X-Apigee-fault-code pasującym do wartości X-Apigee-fault-code , sprawdź wartość źródła błędów X-Apigee-fault-code .

    Powyższy przykładowy wpis z logu dostępu NGINX ma następujące wartości kodu 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 jest większy niż dozwolony limit

Diagnostyka

  1. Znajdź kod błędu i źródło błędu dla błędu zaobserwowanego przy użyciu interfejsu API Monitoring, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w częstych krokach diagnostyki.
  2. Jeśli źródło błędów ma wartość target, oznacza to, że rozmiar wiersza odpowiedzi wysyłany przez aplikację serwera docelowego/backendowego do Apigee jest większy niż dozwolony limit w Apigee Edge.
  3. Aby sprawdzić, czy rozmiar wiersza odpowiedzi przekracza dozwolony limit 2 KB, użyj jednej z tych metod:

    Komunikat o błędzie

    Aby przeprowadzić weryfikację przy użyciu komunikatu o błędzie:

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

    Przykładowy komunikat o błędzie:

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

    Powyższy faultstring oznacza, że rozmiar wiersza odpowiedzi przekracza dozwolony limit 2 KB.

    Rzeczywista prośba

    Aby sprawdzić poprawność za pomocą rzeczywistego żądania:

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

    1. Sprawdź rozmiar wiersza odpowiedzi
    2. Jeśli zauważysz, że rozmiar identyfikatora URI przekracza dozwolony limit w Apigee Edge, to jest przyczyną problemu.

      Przykładowa odpowiedź z serwera docelowego lub backendu:

      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 powyższym przypadku wiersz odpowiedzi HTTP/1.1 200 1111…<trimmed>...11111111 jest większy niż 2 KB, czyli zawiera więcej niż 2 znaki ASCII.

      Jeśli używasz innego klienta, możesz przejrzeć dzienniki klienta i spróbować ustalić rozmiar wiersza odpowiedzi wysyłanego do Apigee Edge.

    Logi procesora wiadomości

    Aby sprawdzić poprawność danych za pomocą dzienników procesora wiadomości:

    Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów procesora wiadomości, aby sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit w Apigee Edge.

    1. Ustal identyfikator wiadomości niezrealizowanego żądania za pomocą monitorowania interfejsu API, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w częstych krokach diagnostyki.
    2. Wyszukaj identyfikator wiadomości w dzienniku procesora wiadomości:

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

    3. Zobaczysz wiersze ze źródła 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 oznacza, że rozmiar wiersza odpowiedzi przekracza 2 KB. Dlatego Apigee Edge zgłasza wyjątek i zwraca kodowi stanu 502 z kodem błędu protocol.http.TooBigline aplikacjom klienckim.

Rozdzielczość

Stały rozmiar

Opcja nr 1 [zalecana]: napraw aplikację serwera docelowego/backendu, aby nie wysyłała wierszy odpowiedzi o rozmiarze większym niż dozwolony limit

  1. Przeanalizuj, dlaczego dany klient wysł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/backendowego tak, aby wysyłała wiersz odpowiedzi o rozmiarze mniejszym niż dozwolony limit.
  3. Jeśli to pożądane i chcesz wysł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 linii odpowiedzi

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

Ograniczenia

Apigee oczekuje, że aplikacja kliencka i serwer backendu nie wysyłają wierszy żądań ani odpowiedzi, których rozmiar przekracza dozwolony limit określony w sekcji Limit wierszy żądań/odpowiedzi w sekcji Limity brzegowe Apigee.

  1. Jeśli jesteś użytkownikiem chmury publicznej, to maksymalny rozmiar wiersza żądań i odpowiedzi jest zgodny z rozmiarem żądania/wiersza odpowiedzi w limitach Apigee Edge.
  2. Jeśli jesteś użytkownikiem Private Cloud , możesz zmienić domyślny maksymalny limit rozmiaru żądań i wiersza odpowiedzi (chociaż nie jest to zalecane). Maksymalny limit rozmiaru wiersza odpowiedzi możesz określić, wykonując instrukcje opisane w artykule Jak sprawdzić bieżący limit.

Jak sprawdzić aktualny limit?

Ta sekcja wyjaśnia, jak sprawdzić, czy właściwość HTTPResponse.line.limit została zaktualizowana o nową wartość w procesorach wiadomości.

  1. Na komputerze procesora wiadomości 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 tego polecenia:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
    
  3. W przykładowych danych wyjściowych powyżej można zauważyć, że właściwość HTTPResponse.line.limit została ustawiona z wartością 2k w języku http.properties.

    Oznacza to, że limit rozmiaru wiersza odpowiedzi skonfigurowanego w Apigee dla Private Cloud to 2 KB.

Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Wymagane jest zbieranie informacji diagnostycznych.

Musisz zebrać informacje diagnostyczne

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 serwera proxy interfejsu API
  • Kompletne polecenie curl użyte do odtworzenia błędu 502
  • Plik śledzenia żądań interfejsu API

Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:

  • Zaobserwowany pełny komunikat o błędzie dotyczący nieudanych żądań
  • Nazwa organizacji
  • Nazwa środowiska
  • Pakiet proxy API
  • Plik śledzenia nieudanych żądań do interfejsu API
  • Wykonaj 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.

  • Dzienniki systemowe procesora wiadomości /opt/apigee/var/log/edge-message-processor/logs/system.log