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:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
Przełącz się na organizację, w której chcesz zbadać problem.
- Otwórz stronę Analiza > Monitorowanie interfejsów API > Zbadaj.
- Wybierz przedział czasu, w którym zaobserwowano błędy.
- Możesz wybrać filtr Serwer proxy, aby zawęzić liczbę kodów błędów.
- Porównaj kod błędu z czasem.
Wybierz komórkę z kodem błędu
protocol.http.TooBigBody
, jak pokazano poniżej:Informacje o kodzie błędu
protocol.http.TooBigBody
wyświetlą się poniżej:Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
- W oknie Logi zwróć uwagę na te informacje:
- Kod stanu:
502
- Źródło błędu:
target
- Kod błędu:
protocol.http.TooBigBody
.
- Kod stanu:
- 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:
- 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
.
- Poczekaj na wystąpienie błędu
- Wybierz 1 z nieudanych żądań i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
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.
- błąd:
Błąd będzie widoczny na etapie Odpowiedź wysłana do klienta jak poniżej:
- 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"}}}
- błąd:
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
.
- Odpowiedź otrzymana z serwera docelowego:
Zwróć uwagę na treść w sekcji Treść odpowiedzi:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
Przejdź do fazy AX (rejestrowane dane Analytics) w logu czasu i kliknij ją, aby zobaczyć powiązane szczegóły.
- 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 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:
- 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
. 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.
- 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 z502
. - Jeśli znajdziesz błędy
502
z kodem X-Apigee-fault-code pasującym do wartościprotocol.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
- 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.
- 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. - Sprawdź Rozmiar ładunku odpowiedzi określony w kroku 1.
- Jeśli dozwolony rozmiar ładunku przekracza 10 MB, to jest przyczyną błędu.
- Jeśli dozwolony limit ładunku wynosi około 10 MB, możliwe, że ładunek odpowiedzi jest przekazywany w formacie skompresowanym. Przejdź do sekcji Przyczyna: po dekompresji rozmiar ładunku odpowiedzi przekracza dozwolony limit.
- Sprawdź, czy rozmiar ładunku odpowiedzi przekracza dozwolony limit 10 MB, sprawdzając rzeczywistą odpowiedź, wykonując te czynności:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego lub backendu, przejdź do sekcji Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego lub backendu, wykonaj te czynności:
- 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.
- 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.
- Sprawdź rozmiar ładunku przekazywanego w odpowiedzi, sprawdzając nagłówek Content-Length.
- 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
- 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.
- 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. - 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.
- 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:
- Jeśli masz zarejestrowany log czasu dla nieudanego żądania, zapoznaj się z krokami opisanymi w sekcjach Śledzenie i
- Określ wartość parametru target.received.content.length
- Sprawdź, czy żądanie klienta zawiera nagłówek Content-Encoding:
gzip
- 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:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego lub backendu, przejdź do sekcji Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego lub backendu, wykonaj te czynności:
- Sprawdź rozmiar ładunku przekazywanego w odpowiedzi wraz z nagłówkiem
Content-Encoding
wysłanym w odpowiedzi. - Jeśli okaże się, że nagłówek odpowiedzi
Content-Encoding
jest ustawiony nagzip
, 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 plikutestzippedfile.gz
w odpowiedzi jest mniejszy niż limit, ale rozmiar nieskompresowanego plikutestzippedfile
wynosił około 15 MB.
- Sprawdź rozmiar ładunku przekazywanego w odpowiedzi wraz z nagłówkiem
Logi procesora wiadomości
Przy użyciu dzienników procesora wiadomości:
- 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
. Sprawdzanie logów procesora wiadomości
/opt/apigee/var/log/edge-message-processor/logs/system.log
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 z502
. Możesz użyć tych ciągów wyszukiwania:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Znajdą się wiersze
system.log
podobne do tych poniżej (TotalRead
ichunkCount
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)
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
- Jeśli masz zarejestrowany log czasu dla nieudanego żądania, zapoznaj się z krokami opisanymi w sekcjach Śledzenie i
Rozdzielczość
Stały rozmiar
Opcja nr 1 [zalecana]. Napraw aplikację serwera docelowego, aby nie wysyłała ładunków przekraczających limit Apigee
- Przeanalizuj, dlaczego określony serwer docelowy wysyła odpowiedź lub rozmiar ładunku powyżej dozwolonego limitu określonego w limitach.
- 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.
- 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.
- Jeśli jesteś użytkownikiem chmury publicznej, maksymalny rozmiar ładunku żądań i odpowiedzi jest określony dla
Request/response size
w limitach Apigee Edge. - 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.
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
Przykładowy wynik tego polecenia wygląda tak:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
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 kolumniehttp.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