502 Nieprawidłowa bramka – TooBigBody

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

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

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

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

Możliwe przyczyny

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

Oto możliwe przyczyny tego błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
Rozmiar ładunku odpowiedzi przekracza dozwolony limit Rozmiar ładunku wysłanego przez serwer docelowy lub serwer backendu w ramach odpowiedzi HTTP do Apigee przekracza dozwolony limit w Apigee. Użytkownicy publicznej i prywatnej chmury Edge
Rozmiar ładunku odpowiedzi po dekompresji przekracza dopuszczalny limit Rozmiar ładunku wysłanego w skompresowanym formacie przez serwer docelowy lub backendowy w ramach odpowiedzi HTTP do Apigee jest większy niż dozwolony limit po dekompresji przez Apigee. Użytkownicy publicznej i prywatnej chmury Edge

Typowe etapy diagnostyki

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 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 interfejsu API > Zbadaj.
  4. Wybierz konkretny przedział czasowy, w którym wystąpiły błędy.
  5. Aby zawęzić zakres kodu błędu, możesz wybrać filtr Proxy.
  6. Wykreśl kod błędu na osi czasu.
  7. Wybierz komórkę z kodem błędu protocol.http.TooBigBody, jak pokazano poniżej:

  8. Zobaczysz informacje o kodzie błęduprotocol.http.TooBigBody, jak pokazano poniżej:

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

  10. W oknie Dzienniki zanotuj 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 rozmiar ładunku odpowiedzi HTTP z serwera docelowego lub serwera backendu jest większy niż dozwolony limit w Apigee Edge.

Śledzenie

Aby zdiagnozować błąd za pomocą narzędzia Trace:

  1. Włącz śledzenie sesji i wybierz jedną z tych opcji:
    • Poczekaj na wystąpienie błędu 502 Bad Gateway lub
    • Jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz 502 Bad Gateway błąd.
  2. Wybierz jedno z nieudanych żądań i sprawdź ślad.
  3. Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
  4. Przejdź do fazy Błąd tuż po fazie Odpowiedź otrzymana z serwera docelowego, jak pokazano poniżej:

    Zanotuj wartości błędu z trace’u:

    • Błąd: Body buffer overflow
    • error.class: 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 ładunku przekracza dozwolony limit.

  5. Błąd będzie widoczny w fazie Odpowiedź wysłana do klienta, jak pokazano poniżej:

  6. Zapisz wartości błędu z trace’u. 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 fazy Odpowiedź otrzymana z serwera docelowego, jak pokazano poniżej w różnych scenariuszach:

    Nieskompresowany

    Scenariusz 1. Odpowiedź wysłana w postaci nieskompresowanej

    Zanotuj wartości błędu z trace’u:

    • Odpowiedź otrzymana z serwera docelowego: 200 OK
    • Content-Length (w sekcji Nagłówki odpowiedzi): ~11 MB

    Skompresowano

    Scenariusz 2. Treść żądania wysłana w formie skompresowanej

    Zanotuj wartości błędu z trace’u:

    • Odpowiedź otrzymana z serwera docelowego: 200 OK
    • Content-Encoding: jeśli widzisz ten nagłówek w sekcji Nagłówki odpowiedzi, zanotuj jego wartość. Na przykład w tym przykładzie wartość to gzip.
  8. Zwróć uwagę na Body w sekcji Response Content (Treść odpowiedzi):

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. W śladzie przejdź do fazy AX (Analytics Data Recorded) i kliknij ją, aby wyświetlić powiązane szczegóły.

  10. W sekcji Szczegóły fazy przewiń w dół do sekcji Odczytane zmienne i określ wartości target.received.content.length, które wskazują:
    • rzeczywisty rozmiar ładunku odpowiedzi, gdy jest on wysyłany w formacie nieskompresowanym,
    • Rozmiar ładunku odpowiedzi po dekompresji przez Apigee, gdy ładunek jest wysyłany w skompresowanym formacie. W tym przypadku będzie ona zawsze taka sama jak wartość dozwolonego limitu (10 MB).

    Nieskompresowany

    Scenariusz 1. Odpowiedź wysłana w postaci nieskompresowanej

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

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

    Skompresowano

    Scenariusz 2. Treść żądania wysłana w formie skompresowanej

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

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

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

    Przekroczono limit rozmiaru po rozpakowaniu

NGINX

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

  1. Jeśli jesteś użytkownikiem chmury prywatnej, możesz używać dzienników dostępu NGINX do określania kluczowych informacji 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, ENVPORT# są zastępowane rzeczywistymi wartościami.

  3. Sprawdź, czy w określonym czasie wystąpiły jakieś 502błędy (jeśli problem pojawił się w przeszłości) lub czy nadal występują błędy w przypadku niektórych żądań502.
  4. Jeśli znajdziesz błędy 502, w których X-Apigee-fault-code odpowiada wartości protocol.http.TooBigBody, określ wartość X-Apigee-fault-source.

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

    Powyższy przykładowy wpis z dziennika dostępu NGINX zawiera te wartości dla X-Apigee-fault-codeX-Apigee-fault-source:

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

Przyczyna: rozmiar ładunku odpowiedzi przekracza dopuszczalny limit.

Diagnostyka

  1. Określ kod błędu,źródło błędurozmiar ładunku odpowiedzi w przypadku zaobserwowanego błędu, korzystając z monitorowania interfejsu API, narzędzia Trace lub logów dostępu NGINX, jak opisano w typowych krokach diagnostycznych w scenariuszu 1.
  2. Jeśli Źródło błędu ma wartość target, oznacza to, że rozmiar ładunku odpowiedzi wysłanej przez serwer docelowy lub serwer backendu 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 jest większy niż dopuszczalny limit 10 MB. W tym celu wykonaj 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 lub prywatnej, wyślij żądanie bezpośrednio do serwera backendu z samego serwera backendu lub z dowolnego innego urządzenia, z którego możesz wysłać żądanie do serwera backendu.
      2. Jeśli jesteś użytkownikiem chmury prywatnej, możesz też wysłać żądanie do serwera backendu z jednego z procesorów wiadomości.
      3. Sprawdź rozmiar ładunku przekazanego 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 to 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 dopuszczalny limit w Apigee Edge.

Rozdzielczość

Zapoznaj się z sekcją Rozwiązanie.

Przyczyna: rozmiar ładunku odpowiedzi po dekompresji przekracza dozwolony limit.

Jeśli ładunek odpowiedzi jest wysyłany w skompresowanym formacie, a nagłówek odpowiedzi Content-Encoding ma wartość gzip, , Apigee dekompresuje ładunek odpowiedzi. Jeśli podczas dekompresji Apigee stwierdzi, że rozmiar ładunku jest większy niż dozwolony limit w Apigee Edge, zatrzyma dalszą dekompresję i natychmiast odpowie kodem stanu 502 Bad Gateway i kodem błędu protocol.http.TooBigBody.

Diagnostyka

  1. Określ kod błędu, źródło błędurozmiar ładunku odpowiedzi w przypadku zaobserwowanego błędu, korzystając z monitorowania interfejsu API, narzędzia do śledzenia lub logów dostępu NGINX, zgodnie z opisem w typowych krokach diagnostycznych w scenariuszu 2.
  2. Jeśli Fault Source ma wartość target, oznacza to, że rozmiar ładunku odpowiedzi wysłanego przez aplikację docelową lub backendową do Apigee jest większy niż dozwolony limit w Apigee Edge.
  3. Sprawdź rozmiar ładunku odpowiedzi określony w kroku 1.
    • Jeśli rozmiar ładunku przekracza dozwolony limit 10 MB, to jest to przyczyną błędu.
    • Jeśli rozmiar ładunku wynosi około 10 MB, czyli jest bliski dozwolonemu limitowi, ładunek odpowiedzi może być przekazywany w formacie skompresowanym. W takim przypadku sprawdź nieskompresowany rozmiar skompresowanego ładunku odpowiedzi.
  4. Możesz sprawdzić, czy odpowiedź z usługi docelowej lub backendu została wysłana w formacie skompresowanym, a rozmiar nieskompresowany był większy niż dopuszczalny limit, korzystając z jednej z tych metod:

    Śledzenie

    Korzystanie z narzędzia Ślad:

    1. Jeśli udało Ci się zarejestrować ślad nieudanego żądania, wykonaj czynności opisane w sekcjach Ślad
      1. Określ wartość parametru target.received.content.length.
      2. Sprawdź, czy żądanie od klienta zawierało nagłówek Content-Encoding: gzip .
    2. Jeśli wartość target.received.content.length jest zbliżona do dopuszczalnego limitu 10 MB, a nagłówek odpowiedzi to Content-Encoding: gzip, to jest to przyczyna tego błędu.

    Rzeczywista prośba

    Używanie rzeczywistej prośby:

    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 przekazanego w odpowiedzi wraz z nagłówkiem Content-Encoding wysłanym w odpowiedzi.
      2. Jeśli nagłówek odpowiedzi Content-Encoding ma wartość gzip, a nieskompresowany rozmiar ładunku przekracza dozwolony limit w Apigee Edge, to jest to przyczyna 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 tym przypadku wysyłany jest nagłówek Content-Encoding: gzip, a rozmiar pliku testzippedfile.gz w odpowiedzi jest mniejszy niż limit, jednak rozmiar rozpakowanego pliku testzippedfile wynosił około 15 MB.

    Dzienniki procesora komunikatów

    Korzystanie z dzienników procesora komunikatów:

    1. Jeśli jesteś użytkownikiem chmury prywatnej, możesz użyć logów procesora komunikatów, aby określić kluczowe informacje o błędach HTTP 502.
    2. Sprawdzanie dzienników procesora komunikatów

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

    3. Sprawdź, czy w określonym czasie wystąpiły jakieś 502błędy (jeśli problem pojawił się w przeszłości) lub czy nadal występują nieudane żądania z kodem 502. Możesz użyć tych ciągów wyszukiwania:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. W pliku znajdziesz wiersze z system.log podobne do tych poniżej (TotalReadchunkCount 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. Podczas dekompresji, gdy tylko procesor wiadomości stwierdzi, że łączna liczba odczytanych bajtów jest większa niż 10 MB, zatrzymuje się i wyświetla ten wiersz:

      Message is too large. TotalRead 10489856 chunkCount 2571

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

Rozdzielczość

Ustalanie rozmiaru

Opcja 1. [Zalecana]: popraw aplikację serwera docelowego, aby nie wysyłała rozmiaru ładunku przekraczającego limit Apigee

  1. Przeanalizuj powód, dla którego konkretny serwer docelowy wysyła odpowiedź lub rozmiar ładunku przekraczający dopuszczalny limit określony w sekcji Limity.
  2. Jeśli nie jest to pożądane, zmień aplikację serwera docelowego tak, aby wysyłała odpowiedź lub rozmiar ładunku mniejszy niż dozwolony limit.
  3. Jeśli chcesz wysłać odpowiedź lub ładunek przekraczający dopuszczalny limit, przejdź do następnych opcji.

Wzorzec podpisanego adresu URL

Opcja 2 [zalecana]: użyj wzorca podpisanych adresów URL w ramach wywołania JavaCallout w Apigee

W przypadku ładunków większych niż 10 MB Apigee zaleca używanie wzorca podpisanych adresów URL w ramach wywołania JavaCallout w Apigee. Ilustruje to przykład Edge Callout: Signed URL Generator na GitHubie.

Streaming

Opcja 3. Korzystanie ze streamingu

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

CwC

Opcja 4. Użyj usługi CwC, aby zwiększyć limit bufora

Tej opcji należy używać tylko wtedy, gdy nie możesz skorzystać z żadnej z zalecanych opcji, ponieważ zwiększenie domyślnego rozmiaru może spowodować problemy z wydajnością.

Apigee udostępnia właściwość CwC, która pozwala zwiększyć limit rozmiaru ładunku żądania i odpowiedzi. Szczegółowe informacje znajdziesz w artykule Ustawianie limitu rozmiaru wiadomości na routerze lub procesorze komunikatów.

Limity

Apigee oczekuje, że aplikacja kliencka i serwer backendu nie będą wysyłać ładunków o rozmiarach większych niż dozwolony limit, zgodnie z dokumentacją dotyczącą Request/response size limitach Apigee Edge.

  1. Jeśli jesteś użytkownikiem chmury publicznej, maksymalny limit rozmiaru ładunku żądania i odpowiedzi jest taki, jak podano w przypadku Request/response size limitach Apigee Edge.
  2. Jeśli jesteś użytkownikiem chmury prywatnej , możesz mieć zmodyfikowany domyślny limit maksymalny rozmiaru ładunku żądania i odpowiedzi (chociaż nie jest to zalecane). Maksymalny limit rozmiaru ładunku żądania możesz określić, postępując zgodnie z instrukcjami w artykule Jak sprawdzić obecny limit.

Jak sprawdzić bieżący limit?

W tej sekcji dowiesz się, jak sprawdzić, czy właściwość HTTPResponse.body.buffer.limit została zaktualizowana o nową wartość w procesorach wiadomości.

  1. Na komputerze procesora komunikatów 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 powyższego polecenia wygląda tak:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
  3. W przykładzie danych wyjściowych powyżej zwróć uwagę, że właściwość HTTPResponse.body.buffer.limit ma wartość 10mhttp.properties.

    Oznacza to, że limit rozmiaru ładunku żądania skonfigurowany w Apigee dla chmury prywatnej wynosi 10 MB.

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją Informacje diagnostyczne, które musisz zebrać.

musi zbierać informacje diagnostyczne;

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

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

  • Pełny komunikat o błędzie dotyczący żądań, które nie zostały zrealizowane
  • 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
  • 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, ENVPORT# są zastępowane rzeczywistymi wartościami.

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