Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
Krótki opis problemu
Aplikacja kliencka otrzymuje kod stanu HTTP 502 Bad Gateway
z kodem błędu
protocol.http.TooBigBody
jako odpowiedź na wywołania interfejsu API.
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 502 Bad Gateway
Możesz też zobaczyć następujący 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 części odpowiedzi HTTP przekracza dozwolony limit w Apigee Edge.
Oto możliwe przyczyny tego błędu:
Przyczyna | Opis | Instrukcje rozwiązywania problemów dotyczące |
---|---|---|
Rozmiar ładunku odpowiedzi jest większy niż dozwolony limit | Wielkość ładunku wysyłanego przez serwer docelowy/serwer backendu w ramach odpowiedzi HTTP do Apigee to przekracza limit dozwolony w Apigee. | Użytkownicy chmury publicznej i prywatnej Edge |
Rozmiar ładunku odpowiedzi przekracza dozwolony limit po dekompresja | Rozmiar ładunku wysłany w formacie skompresowanym przez serwer docelowy/backend jako część HTTP odpowiedź na Apigee przekracza dozwolony limit podczas dekompresowania przez Apigee. | Użytkownicy chmury publicznej i prywatnej Edge |
Typowe kroki diagnostyki
Użyj jednego z tych narzędzi lub metod, aby zdiagnozować ten błąd:
Monitorowanie interfejsów API
Aby zdiagnozować błąd za pomocą monitorowania interfejsów API:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z uprawnieniami odpowiednią rolę.
Przełącz się na organizację, w której chcesz zbadać problem.
- Przejdź do przycisku Analiza > Monitorowanie interfejsów API > Zbadaj stronę.
- Wybierz okres, w którym zaobserwowano błędy.
- Aby zawęzić kod błędu, możesz wybrać filtr Serwer proxy.
- Porównaj Kod błędu z czasem.
Wybierz komórkę, która ma kod błędu
protocol.http.TooBigBody
jako poniżej:Pojawi się informacja o kodzie błędu
protocol.http.TooBigBody
jak pokazano 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ści
target
i Kod błędu ma wartośćprotocol.http.TooBigBody
, co oznacza, że protokół HTTP odpowiedź z serwera docelowego/ serwera backendu ma rozmiar ładunku odpowiedzi większy niż dozwolony limit w Apigee Edge.
Śledzenie
Aby zdiagnozować błąd za pomocą narzędzia śledzenia:
- Włącz sesję śledzenia i:
- Poczekaj, aż wystąpi błąd
502 Bad Gateway
lub - Jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz te dane.
502 Bad Gateway
błąd.
- Poczekaj, aż wystąpi błąd
- Wybierz jedno z nieudanych żądań i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsca, w których wystąpił błąd.
Przejdź do etapu Error (Błąd) tuż po odpowiedzi otrzymanej z celu fazę serwera, jak poniżej:
Zanotuj wartości błędu z śladu:
- 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 natychmiast po otrzymuje odpowiedź od serwera backendu, ponieważ rozmiar ładunku przekracza dozwolone .
- błąd:
Niepowodzenie pojawi się na etapie Odpowiedź wysłana do klienta tak jak poniżej:
- Zanotuj wartości błędu z śladu. 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, jak pokazano poniżej w przypadku różnych scenariuszy:
Nieskompresowany
Scenariusz 1. Ładunek odpowiedzi wysłany w formie nieskompresowanej
Zanotuj wartości błędu z śladu:
- Odebrano odpowiedź z serwera docelowego:
200 OK
- Content-Length (z sekcji Nagłówki odpowiedzi): ~11 MB
Skompresowany
Scenariusz 2. Żądanie ładunku wysłane w formie skompresowanej
Zanotuj wartości błędu z śladu:
- Odebrano odpowiedź z serwera docelowego:
200 OK
- Content-Encoding: jeśli widzisz ten nagłówek w nagłówkach odpowiedzi.
zanotuj wartość. Na przykład w tym przykładzie wartość to
gzip
- Odebrano odpowiedź 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 (zarejestrowane dane Analytics) w śledzeniu i kliknij ją. , aby zobaczyć powiązane informacje.
- Przewiń stronę Szczegóły etapu w dół do sekcji Odczyt zmiennych i określ
wartości
target.received.content.length
, które oznaczają:- .
- Rzeczywisty rozmiar ładunku odpowiedzi wysłanego w nieskompresowanym formacie
- Rozmiar ładunku odpowiedzi po dekompresji przez Apigee, gdy ładunek jest wysyłane w formacie skompresowanym. Będzie ona zawsze taka sama jak wartość dozwolonych (10 MB) w tym scenariuszu.
Nieskompresowany
Scenariusz 1. Ładunek odpowiedzi wysłany w formie nieskompresowanej
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 Ok. 10 MB W tabeli poniżej wyjaśniamy, dlaczego Apigee zwraca błąd
502
w 2 scenariusze oparte na wartości target.received.content.length:Scenariusz Wartość target.received.content.length Przyczyna niepowodzenia Ładunek odpowiedzi w nieskompresowanym formacie Ok. 11 MB Rozmiar > dozwolony limit to 10 MB Ładunek odpowiedzi w formacie skompresowanym Ok. 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żyć logów dostępu NGINX, aby określić
Kluczowe informacje o błędach HTTP
502
. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Gdzie: wartości ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Wyszukaj błędy (
502
), jeśli w danym okresie wystąpił problem w przeszłości) lub jeśli jakieś żądania nadal kończą się niepowodzeniem502
- Jeśli znajdziesz błędy
502
w dopasowaniu X-Apigee-fault-code wartośćprotocol.http.TooBigBody
, a następnie ustal wartość X-Apigee-fault-source.Przykładowy błąd 502 z dziennika dostępu NGINX:
Powyższy przykładowy wpis z logu dostępu NGINX zawiera następujące wartości dla X-Apigee- kod błędu 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łąd zaobserwowany przy użyciu monitorowania interfejsów API, narzędzia Trace lub logów dostępu NGINX, jak wyjaśniono w Typowe kroki diagnostyki w scenariuszu nr 1.
- Jeśli źródło błędu ma wartość
target
, oznacza to, że odpowiedź rozmiar ładunku wysłanego przez serwer docelowy/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 > Limit 10 MB, to jest przyczyną błędu.
- Jeśli rozmiar ładunku wynosi maksymalnie 10 MB, możliwe, że odpowiedź jest przekazywany w formacie skompresowanym. Przejdź do Przyczyna: rozmiar ładunku odpowiedzi po dekompresji przekracza dozwolony limit.
- Sprawdź, czy rozmiar ładunku odpowiedzi jest rzeczywiście > Dozwolony limit 10 MB:
wykonaj te czynności:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego/backendu, i wybierz Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego/backendu,
wykonaj te czynności:
- Jeśli jesteś użytkownikiem chmury publicznej lub chmury prywatnej, poproś o nie bezpośrednio do do serwera backendu lub z innego komputera, mogą wysyłać żądania do serwera backendu.
- Jeśli jesteś użytkownikiem Private Cloud, możesz również wysłać prośbę do serwera backendu jednego z procesorów wiadomości.
- Aby sprawdzić rozmiar ładunku przekazywanego w odpowiedzi, sprawdź pole Nagłówek Content-Length.
- Jeśli okaże się, że rozmiar ładunku jest większy niż dozwolony limit w Apigee Edge, to jest przyczyną Google Cloud.
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)
, bo przekracza dozwolony limit w Apigee Edge.
Rozdzielczość
Zobacz Rozwiązanie.
Przyczyna: rozmiar ładunku odpowiedzi przekracza dozwolony limit po dekompresja
Jeśli ładunek odpowiedzi jest wysyłany w formacie skompresowanym i nagłówek odpowiedzi
Content-Encoding
ma wartość gzip,
Apigee dekompresuje odpowiedź
ładunek. Jeśli podczas procesu dekompresji Apigee stwierdzi, że rozmiar ładunku jest większy
przekracza dozwolony limit w Apigee Edge, a następnie zatrzymuje się dalej.
dekompresji i natychmiast reaguje
z kodem 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 dla błąd zaobserwowany przy użyciu monitorowania interfejsów API, narzędzia Trace Tool lub logów dostępu NGINX, jak wyjaśniono w Typowe kroki diagnostyki w scenariuszu nr 2.
- Jeśli Źródło błędu ma wartość
target
, oznacza to, że rozmiar ładunku odpowiedzi wysłanego przez aplikację docelową/backend do Apigee jest większy niż Dozwolony limit w Apigee Edge: . - Sprawdź Rozmiar ładunku odpowiedzi określony w kroku 1.
- Jeśli rozmiar ładunku > dozwolony limit 10 MB, to on jest przyczyną błędu.
- Jeśli rozmiar ładunku wynosi około 10 MB, możliwe, że ładunek odpowiedzi przekazywane w formacie skompresowanym. W takim przypadku sprawdź rozmiar skompresowanego pliku ładunku odpowiedzi.
- Możesz sprawdzić, czy odpowiedź ze środowiska docelowego/backendu została wysłana w formacie skompresowanym i
rozmiar nieskompresowanego był większy niż dozwolony limit w przypadku jednego z tych elementów
metody:
Śledzenie
Za pomocą narzędzia Trace (Śledzenie):
- Jeśli masz zarejestrowany ślad dla nieudanego żądania, zapoznaj się z krokami opisanymi w
Trace i
- Określ wartość parametru target.received.content.length.
- Sprawdź, czy żądanie klienta zawierało
Kodowanie treści: nagłówek
gzip
- Jeśli wartość target.received.content.length wynosi około 10 MB dozwolonych
i nagłówka odpowiedzi Content-Encoding:
gzip
. przyczyny tego błędu.
Rzeczywiste żądanie
Na podstawie rzeczywistego żądania:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego/backendu, i wybierz Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego/backendu,
wykonaj te czynności:
- Sprawdź rozmiar ładunku przekazywanego w odpowiedzi razem z
Nagłówek
Content-Encoding
został wysłany w odpowiedzi. - Jeśli zauważysz, że nagłówek odpowiedzi
Content-Encoding
jest ustawiony nagzip
, a rozmiar ładunku nieskompresowanego jest większy niż dozwolone jest ograniczenie w Apigee Edge, to jest przyczyną ten błąd.Przykładowa odpowiedź odebrana 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
oraz rozmiar plikutestzippedfile.gz
w odpowiedzi jest mniejszy niż limit, jednak rozmiar nieskompresowanego plikutestzippedfile
wynosił Ok. 15 MB.
- Sprawdź rozmiar ładunku przekazywanego w odpowiedzi razem z
Nagłówek
Logi procesora wiadomości
Przy użyciu dzienników procesora wiadomości:
- Jeśli jesteś użytkownikiem Private Cloud, możesz używać logów procesora wiadomości do:
określenie najważniejszych informacji o błędach HTTP
502
. Sprawdzanie logów procesora wiadomości
/opt/apigee/var/log/edge-message-processor/logs/system.log
Wyszukaj błędy (
502
) w danym okresie (jeśli problem wystąpił w przeszłości) lub jeśli masz jakieś żądania, które nadal kończą się niepowodzeniem502
Możesz użyć następujących ciągów wyszukiwania:grep -ri "chunkCount"
grep -ri "BadGateway: Body buffer overflow"
- Znajdziesz tam wiersze z domeny
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)
W trakcie procesu dekompresji, gdy tylko procesor wiadomości określi łączna liczba bajtów odczytanych wynosi > 10 MB, zatrzymuje się i wydrukuje następujący wiersz:
Message is too large. TotalRead 10489856 chunkCount 2571
Oznacza to, że Rozmiar ładunku odpowiedzi wynosi więcej niż 10 MB, a Apigee zgłasza błąd, gdy rozmiar zaczyna przekraczać limit 10 MB i zawiera kod błędu
protocol.http.TooBigBody
- Jeśli masz zarejestrowany ślad dla nieudanego żądania, zapoznaj się z krokami opisanymi w
Trace i
Rozdzielczość
Popraw rozmiar
Opcja nr 1 [zalecana]: rozwiąż problem z aplikacją serwera docelowego, aby nie wysyłała ładunku o rozmiarze przekraczającym limit Apigee
- Przeanalizuj powód, dla którego określony serwer docelowy wysyła odpowiedź / rozmiar ładunku przekracza dozwolony limit określony w Limity.
- Jeśli nie jest to pożądane, zmodyfikuj aplikację serwera docelowego tak, aby wysyłała rozmiar odpowiedzi / ładunku jest mniejszy niż dozwolony limit.
- Jeśli jest to pożądane i chcesz wysłać odpowiedź lub ładunek więcej niż jest to dozwolone przejdź do następnych opcji.
Podpisany wzorzec adresu URL
Opcja nr 2 [zalecana]: użyj wzorca podpisanego adresu URL w Apigee JavaCallout
W przypadku ładunków większych niż 10 MB Apigee zaleca używanie wzorca podpisanego adresu URL w tagu Apigee JavaCallout, ilustrowane przez Przykład Edge Callout: Generator podpisanego adresu URL w GitHubie.
Streaming
Opcja 3. Korzystanie ze strumieniowania
Jeśli serwer proxy interfejsu API musi obsługiwać bardzo duże żądania lub odpowiedzi, możesz: włącz strumieniowanie 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 użyć żadnej z zalecanych opcji jako mogą wystąpić problemy z wydajnością.
Apigee zapewnia właściwość CwC, która pozwala zwiększyć rozmiar ładunku żądań i odpowiedzi. . Więcej informacji: Ustaw limit rozmiaru wiadomości w routerze lub procesorze wiadomości.
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 informacjami dla
Request/response size
w
Limity brzegowe Apigee.
- Jeśli jesteś użytkownikiem Public Cloud, maksymalny limit żądań i odpowiedzi
rozmiar ładunku jest taki sam jak w przypadku
Request/response size
w Limity brzegowe Apigee. - Jeśli jesteś użytkownikiem Private Cloud , możliwe, że domyślne maksimum zostało zmienione limitu rozmiaru ładunku żądań i odpowiedzi (mimo że nie jest to zalecana metoda). Maksymalny rozmiar ładunku żądania możesz określić, postępując zgodnie z instrukcjami w Jak sprawdzić aktualny limit
Jak sprawdzić obecny limit?
Z tej sekcji dowiesz się, jak sprawdzić, czy usługa
Pole HTTPResponse.body.buffer.limit
zostało zaktualizowane o nową wartość w wiadomości
Procesory.
Na komputerze z procesorem 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 powyższego polecenia jest taki:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
Zwróć uwagę, że w przykładowych danych wyjściowych powyżej Parametr
HTTPResponse.body.buffer.limit
został ustawiony na wartość10m
whttp.properties
Wskazuje to, że limit rozmiaru ładunku żądania skonfigurowany w Apigee dla Cloud Private Cloud zajmuje 10 MB.
Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, wejdź na Musi zbierać informacje diagnostyczne.
Musi zbierać informacje diagnostyczne
Zbierz te informacje diagnostyczne, a następnie skontaktuj się z zespołem pomocy Apigee Edge:
Jeśli jesteś użytkownikiem Public Cloud, 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ń do interfejsu API
- Pełne dane wyjściowe odpowiedzi z serwera docelowego lub serwera backendu wraz z rozmiarem ładunku
Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:
- Pełny komunikat o błędzie zaobserwowany dla nieudanych żądań
- Nazwa organizacji
- Nazwa środowiska
- Pakiet serwera proxy interfejsu 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 serwera 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 przez wartości rzeczywiste.
- Dzienniki systemowe procesora wiadomości
/opt/apigee/var/log/edge-message-processor/logs/system.log