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:
- 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 interfejsu API > Zbadaj.
- Wybierz konkretny przedział czasowy, w którym wystąpiły błędy.
- Aby zawęzić zakres kodu błędu, możesz wybrać filtr Proxy.
- Wykreśl kod błędu na osi czasu.
Wybierz komórkę z kodem błędu
protocol.http.TooBigBody, jak pokazano poniżej:
Zobaczysz informacje o kodzie błędu
protocol.http.TooBigBody, jak pokazano poniżej:
Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
- W oknie Dzienniki zanotuj 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 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:
- Włącz śledzenie sesji i wybierz jedną z tych opcji:
- Poczekaj na wystąpienie błędu
502 Bad Gatewaylub - Jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz
502 Bad Gatewaybłąd.
- Poczekaj na wystąpienie błędu
- Wybierz jedno z nieudanych żądań i sprawdź ślad.
- Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
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.
- Błąd:
Błąd będzie widoczny w fazie Odpowiedź wysłana do klienta, jak pokazano poniżej:
- 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"}}}
- Błąd:
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.
- Odpowiedź otrzymana z serwera docelowego:
Zwróć uwagę na Body w sekcji Response Content (Treść odpowiedzi):
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}W śladzie przejdź do fazy AX (Analytics Data Recorded) i kliknij ją, aby wyświetlić powiązane szczegóły.
- 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 W tabeli poniżej wyjaśniamy, dlaczego Apigee zwraca błąd
502w 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:
- 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. 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.
- 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. - Jeśli znajdziesz błędy
502, w których X-Apigee-fault-code odpowiada wartościprotocol.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-code i X-Apigee-fault-source:
Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.TooBigBodyX-Apigee-fault-source target
Przyczyna: rozmiar ładunku odpowiedzi przekracza dopuszczalny limit.
Diagnostyka
- Określ kod błędu,źródło błędu i rozmiar ł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.
- 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. - 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 jest zbliżony do dozwolonego limitu 10 MB, może się zdarzyć, że ładunek odpowiedzi zostanie przekazany w formacie skompresowanym. Wejdź na Przyczyna: rozmiar ładunku odpowiedzi po dekompresji przekracza dozwolony limit.
- Sprawdź, czy rozmiar ładunku odpowiedzi jest większy niż dopuszczalny limit 10 MB. W tym celu wykonaj 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 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.
- Jeśli jesteś użytkownikiem chmury prywatnej, możesz też wysłać żądanie do serwera backendu z jednego z procesorów wiadomości.
- Sprawdź rozmiar ładunku przekazanego w odpowiedzi, sprawdzając nagłówek Content-Length.
- 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
- Określ kod błędu, źródło błędu i rozmiar ł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.
- 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. - 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.
- 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:
- Jeśli udało Ci się zarejestrować ślad nieudanego żądania, wykonaj czynności opisane w sekcjach Ślad i
- Określ wartość parametru target.received.content.length.
- Sprawdź, czy żądanie od klienta zawierało nagłówek Content-Encoding:
gzip.
- 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:
- 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 przekazanego w odpowiedzi wraz z nagłówkiem
Content-Encodingwysłanym w odpowiedzi. - Jeśli nagłówek odpowiedzi
Content-Encodingma 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 plikutestzippedfile.gzw odpowiedzi jest mniejszy niż limit, jednak rozmiar rozpakowanego plikutestzippedfilewynosił około 15 MB.
- Sprawdź rozmiar ładunku przekazanego w odpowiedzi wraz z nagłówkiem
Dzienniki procesora komunikatów
Korzystanie z dzienników procesora komunikatów:
- 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. Sprawdzanie dzienników procesora komunikatów
/opt/apigee/var/log/edge-message-processor/logs/system.logSprawdź, 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 kodem502. Możesz użyć tych ciągów wyszukiwania:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- W pliku znajdziesz wiersze z
system.logpodobne do tych poniżej (TotalReadichunkCountmogą 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)
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 2571Oznacza 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.
- Jeśli udało Ci się zarejestrować ślad nieudanego żądania, wykonaj czynności opisane w sekcjach Ślad i
Rozdzielczość
Ustalanie rozmiaru
Opcja 1. [Zalecana]: popraw aplikację serwera docelowego, aby nie wysyłała rozmiaru ładunku przekraczającego limit Apigee
- Przeanalizuj powód, dla którego konkretny serwer docelowy wysyła odpowiedź lub rozmiar ładunku przekraczający dopuszczalny limit określony w sekcji Limity.
- Jeśli nie jest to pożądane, zmień aplikację serwera docelowego tak, aby wysyłała odpowiedź lub rozmiar ładunku mniejszy niż dozwolony limit.
- 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 w
limitach Apigee Edge.
- Jeśli jesteś użytkownikiem chmury publicznej, maksymalny limit rozmiaru ładunku żądania i odpowiedzi jest taki, jak podano w przypadku
Request/response sizew limitach Apigee Edge. - 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.
Na komputerze procesora komunikatów wyszukaj właściwość
HTTPResponse.body.buffer.limitw katalogu/opt/apigee/edge-message- processor/confi 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 powyższego polecenia wygląda tak:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
W przykładzie danych wyjściowych powyżej zwróć uwagę, że właściwość
HTTPResponse.body.buffer.limitma wartość10mwhttp.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_logGdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Dzienniki systemowe procesora komunikatów
/opt/apigee/var/log/edge-message-processor/logs/system.log