502 Nieprawidłowa bramka – TooBigBody

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.TooBigBody .

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":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

Możliwe przyczyny

Ten błąd występuje, jeśli rozmiar ładunku wysyłany przez serwer docelowy/backend do Apigee Edge w ramach odpowiedzi HTTP jest większy niż dozwolony limit w Apigee Edge.

Oto możliwe przyczyny błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
Rozmiar ładunku odpowiedzi jest większy niż dozwolony limit Rozmiar ładunku wysyłany przez serwer docelowy/backend w ramach odpowiedzi HTTP do Apigee przekracza dozwolony limit w Apigee. Użytkownicy chmury publicznej i prywatnej usługi Edge
Rozmiar ładunku odpowiedzi przekracza dozwolony limit po dekompresji Rozmiar ładunku wysyłany w formacie skompresowanym przez serwer docelowy/backend w ramach odpowiedzi HTTP na Apigee przekracza dozwolony limit po zdekompresowaniu przez Apigee. 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.TooBigBody, jak pokazano poniżej:

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

  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.TooBigBody.
  11. Jeśli źródło błędu ma wartość target, a kod błędu ma wartość protocol.http.TooBigBody, oznacza to, że odpowiedź HTTP z serwera docelowego/ serwera backendu ma ładunek odpowiedzi większy niż dozwolony limit w Apigee Edge.

Trace

Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:

  1. Włącz sesję śledzenia, a potem:
    • Poczekaj na wystąpienie błędu 502 Bad Gateway lub
    • 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. Przejdź do etapu Błąd tuż po etapie Odebranie odpowiedzi z serwera docelowego, jak pokazano poniżej:

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

    • błąd: Body buffer overflow
    • error.class: com.apigee.errors.http.server.BadGateway

    Oznacza to, że Apigee Edge (komponent procesora wiadomości) zgłasza błąd, gdy tylko otrzyma odpowiedź z serwera backendu z powodu przekroczenia limitu ładunku.

  5. Błąd będzie widoczny na etapie Odpowiedź wysłana do klienta jak poniżej:

  6. Zapisz wartości błędu z logu czasu. Powyższy przykładowy log czasu pokazuje:
    • błąd: 502 Bad Gateway
    • Treść błędu: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. Przejdź do etapu Odpowiedź otrzymana z serwera docelowego, postępując zgodnie z instrukcjami poniżej w przypadku różnych scenariuszy:

    Nieskompresowany

    Scenariusz 1. Ładunek odpowiedzi został wysłany w nieskompresowanej formie

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

    • Odpowiedź otrzymana z serwera docelowego: 200 OK
    • Content-Length (Długość treści) (z sekcji Nagłówki odpowiedzi): ok. 11 MB

    Skompresowany

    Scenariusz 2. Żądanie ładunku wysłane w formie skompresowanej

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

    • Odpowiedź otrzymana z serwera docelowego: 200 OK
    • Content-Encoding: jeśli widzisz ten nagłówek w sekcji Nagłówki odpowiedzi, zwróć uwagę na wartość. W tym przykładzie wartość to gzip.
  8. Zwróć uwagę na treść w sekcji Treść odpowiedzi:

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. Przejdź do fazy AX (rejestrowane dane Analytics) w logu czasu i kliknij ją, aby zobaczyć powiązane szczegóły.

  10. Przewiń w dół w sekcji Szczegóły fazy do sekcji Odczyt zmiennych i ustal wartości target.received.content.length, które oznaczają:
    • Rzeczywisty rozmiar ładunku odpowiedzi wysyłanego w formacie nieskompresowanym i
    • Rozmiar ładunku odpowiedzi po dekompresji przez Apigee, gdy ładunek jest wysyłany w formacie skompresowanym. Wartość ta będzie zawsze taka sama jak wartość dozwolonego limitu (10 MB) w tym scenariuszu.

    Nieskompresowany

    Scenariusz 1. Ładunek odpowiedzi został wysłany w nieskompresowanej formie

    Zwróć uwagę na wartość target.received.content.length:

    Nagłówki żądania Wartość
    target.received.content.length Ok. 11 MB

    Skompresowany

    Scenariusz 2. Żądanie ładunku wysłane w formie skompresowanej

    Zwróć uwagę na wartość target.received.content.length:

    Nagłówki żądań Wartość
    target.received.content.length Około 10 MB
  11. W tabeli poniżej wyjaśniono, dlaczego Apigee zwraca błąd 502 w tych 2 scenariuszach, na podstawie wartości target.received.content.length:

    Scenariusz Wartość target.received.content.length Przyczyna niepowodzenia
    Ładunek odpowiedzi w formacie nieskompresowanym Ok. 11 MB Rozmiar > dozwolony limit 10 MB
    Ładunek odpowiedzi w formacie skompresowanym Około 10 MB

    Przekroczono limit rozmiaru podczas dekompresji

NGINX

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

  1. Jeśli jesteś użytkownikiem Private Cloud, możesz używać logów dostępu NGINX do określania kluczowych informacji 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ąpił w przeszłości) lub czy są nadal jakieś żądania, które kończą się niepowodzeniem z 502.
  4. Jeśli znajdziesz błędy 502 z kodem X-Apigee-fault-code pasującym do wartości protocol.http.TooBigBody, sprawdź wartość źródła błędów X-Apigee-fault-code .

    Przykładowy błąd 502 z dziennika dostępu NGINX:

    Powyższy przykładowy wpis z logu dostępu NGINX ma następujące wartości kodów X-Apigee- fault-code i X-Apigee-fault-source:

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

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

Diagnostyka

  1. Określ kod błędu, źródło błędu i rozmiar ładunku odpowiedzi dla błędu zaobserwowanego przy użyciu monitorowania interfejsu API, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w sekcji Typowe kroki diagnostyki dla scenariusza 1.
  2. Jeśli źródło błędu ma wartość target, oznacza to, że rozmiar ładunku odpowiedzi wysłanego przez serwer docelowy/backendowy do Apigee jest większy niż dozwolony limit w Apigee Edge.
  3. Sprawdź Rozmiar ładunku odpowiedzi określony w kroku 1.
  4. Sprawdź, czy rozmiar ładunku odpowiedzi przekracza dozwolony limit 10 MB, sprawdzając rzeczywistą odpowiedź, wykonując te czynności:
    1. Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego lub backendu, przejdź do sekcji Rozwiązanie.
    2. Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego lub backendu, wykonaj te czynności:
      1. Jeśli jesteś użytkownikiem chmury publicznej/chmury prywatnej, wyślij żądanie bezpośrednio do serwera backendu z samego serwera backendu lub dowolnej innej maszyny, z której możesz je wysyłać do serwera backendu.
      2. Jeśli jesteś użytkownikiem Private Cloud, możesz też wysłać żądanie do serwera backendu z jednego z podmiotów przetwarzających wiadomości.
      3. Sprawdź rozmiar ładunku przekazywanego w odpowiedzi, sprawdzając nagłówek Content-Length.
      4. Jeśli okaże się, że rozmiar ładunku przekracza dozwolony limit w Apigee Edge, to jest przyczyną problemu.

    Przykładowa odpowiedź z serwera backendu:

    curl -v https://BACKENDSERVER-HOSTNAME/testfile
    
    * About to connect() to 10.14.0.10 port 9000 (#0)
    *   Trying 10.14.0.10...
    * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0)
    > GET /testfile HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: 10.14.0.10:9000
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Length: 11534336
    < Content-Type: application/octet-stream
    < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
    < Date: Wed, 30 Jun 2021 09:22:41 GMT
    <
    ----snipped----
    <Response Body>
    

    W powyższym przykładzie widać, że przyczyną tego błędu jest Content-Length: 11534336 (which is ~11 MB), ponieważ przekracza on dozwolony limit w Apigee Edge.

Rozdzielczość

Zobacz Rozwiązanie.

Przyczyna: po dekompresji rozmiar ładunku odpowiedzi przekracza dozwolony limit

Jeśli ładunek odpowiedzi jest wysyłany w formacie skompresowanym, a nagłówek odpowiedzi Content-Encoding jest ustawiony na gzip, Apigee dekompresuje ładunek odpowiedzi. Jeśli w trakcie procesu dekompresji Apigee ustali, że rozmiar ładunku przekracza limit dozwolony w Apigee Edge, zatrzyma dalszą dekompresję i natychmiast odpowie, wysyłając 502 Bad Gateway i kod błędu protocol.http.TooBigBody.

Diagnostyka

  1. Określ kod błędu,źródło błędu i rozmiar ładunku odpowiedzi dla błędu zaobserwowanego przy użyciu logów API Monitoring, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w sekcji Typowe kroki diagnostyki dla scenariusza nr 2.
  2. Jeśli źródło błędu ma wartość target, oznacza to, że rozmiar ładunku odpowiedzi wysłanego przez aplikację docelową lub backendu do Apigee jest większy niż dozwolony limit w Apigee Edge.
  3. Sprawdź Rozmiar ładunku odpowiedzi określony w kroku 1.
    • Jeśli dozwolony rozmiar ładunku przekracza 10 MB, to właśnie jest przyczyną błędu.
    • Jeśli dozwolony limit ładunku wynosi około 10 MB, może się zdarzyć, że ładunek odpowiedzi jest przekazywany w formacie skompresowanym. W tym przypadku sprawdź rozmiar skompresowanego ładunku odpowiedzi po nieskompresowaniu.
  4. Za pomocą jednej z tych metod możesz sprawdzić, czy odpowiedź z środowiska docelowego lub backendu została wysłana w formacie skompresowanym, a rozmiar nieskompresowany przekracza dozwolony limit:

    Trace

    Korzystanie z narzędzia do śledzenia:

    1. Jeśli masz zarejestrowany log czasu dla nieudanego żądania, zapoznaj się z krokami opisanymi w sekcjach Śledzenie i
      1. Określ wartość parametru target.received.content.length
      2. Sprawdź, czy żądanie klienta zawiera nagłówek Content-Encoding: gzip
    2. Jeśli wartość parametru target.received.content.length mieści się w zakresie dozwolonym 10 MB i ma nagłówek odpowiedzi target.received.content.length , to jest przyczyną tego błędu.

    Rzeczywista prośba

    Użycie rzeczywistego żądania:

    1. Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego lub backendu, przejdź do sekcji Rozwiązanie.
    2. Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego lub backendu, wykonaj te czynności:
      1. Sprawdź rozmiar ładunku przekazywanego w odpowiedzi wraz z nagłówkiem Content-Encoding wysłanym w odpowiedzi.
      2. Jeśli okaże się, że nagłówek odpowiedzi Content-Encoding jest ustawiony na gzip, a rozmiar ładunku po skompresowaniu przekracza limit dozwolony w Apigee Edge, to jest przyczyną tego błędu.

        Przykładowa odpowiedź otrzymana z serwera backendu:

        curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
        
        * About to connect() to 10.1.0.10 port 9000 (#0)
        *   Trying 10.1.0.10...
        * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
        > GET /testzippedfile.gz HTTP/1.1
        > User-Agent: curl/7.29.0
        > Host: 10.1.0.10:9000
        > Accept: */*
        >
        < HTTP/1.1 200 OK
        < Accept-Ranges: bytes
        < Content-Encoding: gzip
        < Content-Type: application/x-gzip
        < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
        < Testheader: test
        < Date: Wed, 07 Jul 2021 10:14:16 GMT
        < Transfer-Encoding: chunked
        <
        ----snipped----
        <Response Body>
        

        W powyższym przypadku wysyłany jest nagłówek Content-Encoding: gzip, a rozmiar pliku testzippedfile.gz w odpowiedzi jest mniejszy niż limit, ale rozmiar nieskompresowanego pliku testzippedfile wynosił około 15 MB.

    Logi procesora wiadomości

    Przy użyciu dzienników procesora wiadomości:

    1. Jeśli jesteś użytkownikiem Private Cloud, możesz użyć logów procesora wiadomości, aby określić kluczowe informacje o błędach HTTP 502.
    2. Sprawdzanie logów procesora wiadomości

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

    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. Możesz użyć tych ciągów wyszukiwania:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. Znajdą się wiersze system.log podobne do tych poniżej (TotalRead i chunkCount mogą się różnić w Twoim przypadku):
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.SERVICE -
      TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large.
      TotalRead 10489856 chunkCount 2571
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :
      ClientInputChannel(ClientChannel[Connected:
      Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155
      useCount=1 bytesRead=0 bytesWritten=182 age=23ms  lastIO=0ms
      isOpen=true).onExceptionRead exception: {}
      com.apigee.errors.http.server.BadGateway: Body buffer overflow
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR
      ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() :
      AbstractResponseListener.onError(HTTPResponse@77cbd7c4,
      Body buffer overflow)
      
    5. Gdy tylko w trakcie dekompresji procesor wiadomości ustali, że łączna liczba odczytanych bajtów przekroczy 10 MB, zatrzymuje się i drukuje następujący wiersz:

      Message is too large. TotalRead 10489856 chunkCount 2571

      Wskazuje on, że rozmiar ładunku odpowiedzi przekracza 10 MB, a Apigee zgłasza błąd, gdy rozmiar zacznie przekraczać limit 10 MB z kodem błędu protocol.http.TooBigBody

Rozdzielczość

Stały rozmiar

Opcja nr 1 [zalecana]. Napraw aplikację serwera docelowego, aby nie wysyłała ładunków przekraczających limit Apigee

  1. Przeanalizuj, dlaczego określony serwer docelowy wysyła odpowiedź lub rozmiar ładunku powyżej dozwolonego limitu określonego w limitach.
  2. Jeśli nie jest to pożądane, zmodyfikuj aplikację serwera docelowego tak, aby przesyłała odpowiedź lub ładunek o rozmiarze mniejszym niż dozwolony limit.
  3. Jeśli chcesz to zrobić i chcesz wysłać odpowiedź lub ładunek więcej niż dozwolony limit, przejdź do następnych opcji.

Podpisany wzorzec adresu URL

Opcja 2 [zalecana]: użyj wzorca podpisanych adresów URL w objaśnieniu Java w Apigee

W przypadku ładunków większych niż 10 MB Apigee zaleca użycie wzorca podpisanego adresu URL w Apigee JavaCallout. Przedstawiliśmy to na przykładzie narzędzia Edge Callout: Signed URL Generator na GitHubie.

transmisje

Opcja 3. Korzystanie z transmisji

Jeśli serwer proxy interfejsu API musi obsługiwać bardzo duże żądania lub odpowiedzi, możesz włączyć strumieniowe przesyłanie danych w Apigee.

CwC

Opcja 4. Użyj właściwości CwC, aby zwiększyć limit bufora

Tej opcji należy używać tylko wtedy, gdy nie można korzystać z żadnej z zalecanych opcji, ponieważ po zwiększeniu rozmiaru domyślnego mogą wystąpić problemy z wydajnością.

Apigee udostępnia właściwość CwC, która umożliwia zwiększenie limitu ładunku żądań i odpowiedzi. Szczegółowe informacje znajdziesz w artykule Ustawianie limitu rozmiaru wiadomości w routerze lub procesorze wiadomości.

Ograniczenia

Apigee oczekuje, że aplikacja kliencka i serwer backendu nie będą wysyłać ładunków większych niż dozwolony limit określony dla Request/response size w limitach Apigee Edge.

  1. Jeśli jesteś użytkownikiem chmury publicznej, maksymalny rozmiar ładunku żądań i odpowiedzi jest określony dla Request/response size w limitach Apigee Edge.
  2. Jeśli jesteś użytkownikiem Private Cloud , możesz zmienić domyślny maksymalny limit rozmiaru ładunku żądań i odpowiedzi (chociaż nie jest to zalecane). Aby określić maksymalny rozmiar ładunku żądania, wykonaj instrukcje z artykułu Jak sprawdzić bieżący limit.

Jak sprawdzić aktualny limit?

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

  1. Na komputerze procesora wiadomości wyszukaj właściwość HTTPResponse.body.buffer.limit w katalogu /opt/apigee/edge-message- processor/conf i sprawdź, jaka wartość została ustawiona, jak pokazano poniżej:

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. Przykładowy wynik tego polecenia wygląda tak:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
    
  3. W przykładowych danych wyjściowych powyżej można zauważyć, że właściwość HTTPResponse.body.buffer.limit została ustawiona z wartością 10m w kolumnie http.properties.

    Oznacza to, że limit rozmiaru ładunku żądania skonfigurowanego w Apigee dla Private Cloud wynosi 10 MB.

Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Musisz zebrać informacje diagnostyczne.

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
  • Pełne dane wyjściowe odpowiedzi z serwera docelowego lub backendu wraz z rozmiarem ładunku

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
  • Kompletne polecenie curl użyte do odtworzenia błędu 502
  • Pełne dane wyjściowe odpowiedzi z serwera docelowego lub backendu wraz z rozmiarem ładunku
  • 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