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 413 Request Entity Too Large z kodem błędu protocol.http.TooBigBody .
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 413 Request Entity Too Large
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 aplikację kliencką do Apigee Edge w ramach żądania 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 żądania przekracza dopuszczalny limit | Rozmiar ładunku wysłanego przez aplikację kliencką w ramach żądania HTTP do Apigee Edge przekracza dozwolony limit w Apigee Edge. | Użytkownicy publicznej i prywatnej chmury Edge |
| Rozmiar ładunku żądania po dekompresji przekracza dopuszczalny limit | Rozmiar ładunku wysłanego w formacie skompresowanym przez aplikację kliencką w ramach żądania HTTP do Apigee Edge przekracza dozwolony limit po dekompresji przez Apigee Edge. | 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.TooBigBodyi kodem stanu413, jak pokazano poniżej:
Informacje o kodzie błędu
protocol.http.TooBigBodysą wyświetlane w sposób pokazany poniżej:
- Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania. Następnie w oknie Logi zanotuj szczegóły widoczne poniżej :
Nieskompresowany
Scenariusz 1. Ładunek żądania wysłany w formie nieskompresowanej
W oknie Dzienniki zwróć uwagę na te informacje:
- Kod stanu:
413 - Źródło błędu:
proxy - Kod błędu:
protocol.http.TooBigBody. - Długość żądania(w bajtach):
15360440(~15 MB)
Jeśli Fault Source ma wartość
proxy, Fault Code ma wartośćprotocol.http.TooBigBody, a Request Length przekracza 10 MB, oznacza to, że żądanie HTTP od klienta ma rozmiar ładunku większy niż dozwolony limit w Apigee.Skompresowano
Scenariusz 2. Treść żądania wysłana w formie skompresowanej
W oknie Dzienniki zwróć uwagę na te informacje:
- Kod stanu:
413 - Źródło błędu:
proxy - Kod błędu:
protocol.http.TooBigBody. - Długość żądania(w bajtach):
15264(~15 KB)
Jeśli Fault Source ma wartość
proxy, Fault Code ma wartośćprotocol.http.TooBigBody, a Request Length jest mniejsza niż 10 MB, oznacza to, że żądanie HTTP od klienta ma rozmiar ładunku mniejszy niż dozwolony limit w formacie skompresowanym, ale rozmiar ładunku jest większy niż dozwolony limit po rozpakowaniu przez Apigee. - Kod stanu:
Ś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
413 Request Entity Too Largelub - Jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz
413 Request Entity Too Largebłąd.
- Poczekaj na wystąpienie błędu
Sprawdź, czy opcja Show all Flow Infos (Pokaż wszystkie informacje o przepływie) jest włączona.
- Wybierz jedno z nieudanych żądań i sprawdź ślad.
- Przejdź do etapu Prośba otrzymana od klienta.
Nieskompresowany
Scenariusz 1. Ładunek żądania wysłany w formie nieskompresowanej
Pamiętaj:
- Content-Encoding: brak
- Content-Length:
15360204
Skompresowano
Scenariusz 2. Treść żądania wysłana w formie skompresowanej
Pamiętaj:
- Content-Encoding:
gzip - Content-Length:
14969 - Content-Type:
application/x-gzip
- Przeglądaj różne fazy śledzenia i sprawdź, gdzie wystąpił błąd.
Błąd zwykle występuje w przepływie po fazie Request Received from Client (Otrzymano prośbę od klienta), jak pokazano poniżej:
- Zanotuj wartość błędu z trace’u. Powyższy przykładowy log czasu pokazuje:
- Błąd:
Body buffer overflow - error.class:
com.apigee.errors.http.user.RequestTooLarge
- Błąd:
Otwórz sekcję Response Sent to Client (Odpowiedź wysłana do klienta) i zanotuj wartości błędu z informacji o śledzeniu. Przykładowy log czasu poniżej pokazuje:
- Błąd:
413 Request Entity Too Large - Treść błędu:
{"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
- Błąd:
- W śladzie przejdź do fazy AX (Analytics Data Recorded) i kliknij ją.
W sekcji Szczegóły fazy przewiń w dół do Odczytane zmienne.
- Określ wartość zmiennej client.received.content.length , która wskazuje:
- rzeczywisty rozmiar ładunku żądania, gdy jest on wysyłany w formacie nieskompresowanym;
- Rozmiar ładunku żądania 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. Prośba o ładunek w formie nieskompresowanej
Zmienna client.received.content.length:
15360204Skompresowano
Scenariusz 2. Treść żądania w skompresowanym formacie
Zmienna client.received.content.length:
10489856 - W tabeli poniżej wyjaśniamy, dlaczego Apigee zwraca błąd
413w 2 scenariuszach na podstawie wartości zmiennej client.received.content.length:Scenariusz Wartość parametru client.received.content.length Przyczyna niepowodzenia Ładunek żądania w formacie nieskompresowanym ~15 MB Rozmiar > dozwolony limit 10 MB. Ładunek żądania 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
413. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- Sprawdź, czy w określonym czasie (jeśli problem wystąpił w przeszłości) nie wystąpiły żadne
413błędy lub czy nadal występują błędy w przypadku niektórych żądań413. - Jeśli znajdziesz błędy
413, w których X-Apigee-fault-code pasuje do wartościprotocol.http.TooBigBody, określ wartość X-Apigee-fault-source.Nieskompresowany
Scenariusz 1. Rozmiar ładunku żądania w formacie nieskompresowanym
Powyższy przykładowy wpis z dziennika dostępu NGINX zawiera te wartości w przypadku X-Apigee-fault-code i X-Apigee-fault-source:
Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.TooBigBodyX-Apigee-fault-sourc policyZwróć uwagę na Długość żądania:
15360440(14,6 MB > dozwolony limit).Skompresowano
Scenariusz 2. Rozmiar ładunku żądania w formacie skompresowanym
Powyższy przykładowy wpis z dziennika dostępu NGINX zawiera te wartości atrybutów X-Apigee-fault-code i X-Apigee-fault-source:
Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.TooBigBodyX-Apigee-fault-source policyZwróć uwagę na długość żądania:
15264(14,9 K < dozwolony limit).W takim przypadku Apigee Edge zwraca
413, mimo że długość żądania jest mniejsza niż dopuszczalny limit, ponieważ żądanie mogło zostać wysłane w formacie skompresowanym, a rozmiar ładunku po dekompresji przez Apigee Edge przekracza limit.
Przyczyna: rozmiar ładunku żądania przekracza dozwolony limit
Diagnostyka
- Określ kod błędu, źródło błędu i rozmiar ładunku żądania w przypadku błędu zaobserwowanego przy użyciu monitorowania interfejsu API, narzędzia do śledzenia lub dzienników dostępu NGINX, zgodnie z opisem w typowych krokach diagnostycznych w scenariuszu 1 (nieskompresowanym).
- Jeśli Fault Source ma wartość
policylubproxy, oznacza to, że rozmiar ładunku żądania wysłanego przez aplikację kliencką do Apigee jest większy niż dozwolony limit w Apigee Edge. - Sprawdź rozmiar ładunku żądania 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 mniejszy niż dozwolony limit 10 MB, możliwe jest, że ładunek żądania jest przekazywany w formacie skompresowanym. Otwórz Przyczyna: rozmiar ładunku żądania po dekompresji przekracza dopuszczalny limit
- Możesz też sprawdzić, czy rozmiar ładunku żądania jest rzeczywiście większy niż dopuszczalny limit 10 MB, wykonując te czynności:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego przez aplikację klienta, przejdź do sekcji Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego przez aplikację klienta, wykonaj te czynności:
- Sprawdź rozmiar ładunku przekazanego w żądaniu.
- Jeśli okaże się, że rozmiar ładunku przekracza dozwolony limit w Apigee Edge, to jest to przyczyną problemu.
Przykładowe żądanie:
curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
W tym przypadku plik
test15mbfilema około 15 MB. Jeśli używasz innego klienta, sprawdź jego logi, aby dowiedzieć się, jaki jest rozmiar wysyłanego ładunku.
Rozdzielczość
Otwórz Rozdzielczość.
Przyczyna: rozmiar ładunku żądania po dekompresji przekracza dopuszczalny limit
Jeśli ładunek żądania jest wysyłany w skompresowanym formacie, a nagłówek żądania Content-Encoding jest ustawiony na gzip, , Apigee dekompresuje ładunek żądania. Jeśli podczas dekompresji Apigee stwierdzi, że rozmiar ładunku jest większy niż 10 MB, czyli
przekracza dozwolony limit, zatrzyma dalszą dekompresję i natychmiast odpowie 413 Request Entity Too Large kodem błędu protocol.http.TooBigBody.
Diagnostyka
- Określ kod błędu, źródło błędu, i rozmiar ładunku żądania 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 (skompresowanym).
- Jeśli Fault Source ma wartość
policylubproxy, oznacza to, że rozmiar ładunku żądania wysłanego przez aplikację kliencką do Apigee jest większy niż dozwolony limit w Apigee Edge. - Sprawdź rozmiar ładunku żądania 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 mniejszy niż dozwolony limit 10 MB, możliwe jest, że ładunek żądania jest przekazywany w formacie skompresowanym. W takim przypadku sprawdź nieskompresowany rozmiar skompresowanego ładunku żądania.
- Możesz sprawdzić, czy żądanie od klienta zostało wysłane w formacie skompresowanym, a rozmiar nieskompresowany przekracza dopuszczalny limit, za pomocą jednej z tych metod:
Śledzenie
Aby przeprowadzić weryfikację za pomocą narzędzia Śledzenie:
- Jeśli masz log czasu nieudanego żądania, wykonaj czynności opisane w sekcjach Śledzenie i
- Określ wartość zmiennej client.received.content.length .
- Sprawdź, czy żądanie od klienta zawierało nagłówek Content-Encoding:
gzip.
- Jeśli wartość zmiennej client.received.content.length jest większa niż 10 MB, czyli
dozwolony limit, a nagłówek żądania Content-Encoding:
gzip, to jest to przyczyna tego błędu.
Rzeczywista prośba
Aby sprawdzić poprawność za pomocą rzeczywistego żądania:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego przez aplikację klienta, przejdź do sekcji Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego przez aplikację klienta, wykonaj te czynności:
- Sprawdź rozmiar ładunku przekazanego w żądaniu wraz z nagłówkiem
Content-Encodingwysłanym w żądaniu. Sprawdź, czy nieskompresowany rozmiar ładunku przekracza dozwolony limit w Apigee Edge.
Przykładowe żądanie:
curl https://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile.gz -H "Content-Encoding: gzip" -v
W tym przypadku plik
test15mbfile.gzjest mniejszy niż limit rozmiaru, ale rozmiar nieskompresowanego plikutest15mbfilewynosi około 15 MB, a nagłówekContent-Encodingma rozmiargzip.Jeśli używasz innego klienta, pobierz jego logi, aby sprawdzić rozmiar ładunku wysyłanego przez klienta i czy nagłówek
Content-Encodingjest ustawiony nagzip.
- Sprawdź rozmiar ładunku przekazanego w żądaniu wraz z nagłówkiem
Dzienniki procesora komunikatów
Aby przeprowadzić weryfikację za pomocą logów procesora komunikatów:
- Jeśli jesteś użytkownikiem chmury prywatnej, możesz używać dzienników procesora komunikatów, aby określać kluczowe informacje o błędach HTTP
413. Sprawdź logi procesora komunikatów:
/opt/apigee/var/log/edge-message-processor/logs/system.logSprawdź, czy w określonym czasie wystąpiły jakieś błędy
413(jeśli problem pojawił się w przeszłości) lub czy nadal występują błędy413.Możesz użyć tych ciągów wyszukiwania:
grep -ri "chunkCount"
grep -ri "RequestTooLarge"
- Znajdziesz wiersze z
system.logpodobne do tych poniżej (TotalReadichunkCountmogą się różnić w Twoim przypadku):2021-07-06 13:29:57,544 NIOThread@1 ERROR HTTP.SERVICE - TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large. TotalRead 10489856 chunkCount 2570 2021-07-06 13:29:57,545 NIOThread@1 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: com.apigee.errors.http.user.RequestTooLarge : 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 2570
Oznacza to, że rozmiar ładunku żądania przekracza 10 MB, a Apigee zgłasza błąd
RequestTooLarge, gdy rozmiar zaczyna przekraczać limit 10 MB, z kodem błęduprotocol.http.TooBigBody.
- Jeśli masz log czasu nieudanego żądania, wykonaj czynności opisane w sekcjach Śledzenie i
Rozdzielczość
Ustalanie rozmiaru
Opcja 1. [Zalecana]: popraw aplikację klienta, aby nie wysyłała ładunków o rozmiarze większym niż dozwolony limit.
- Przeanalizuj powód, dla którego konkretny klient wysyła żądanie lub ładunek o rozmiarze większym niż dopuszczalny limit określony w sekcji Limity.
Jeśli nie jest to pożądane, zmodyfikuj aplikację klienta, aby wysyłała żądania lub ładunki o rozmiarze mniejszym niż dopuszczalny limit.
W omówionym powyżej przykładzie możesz rozwiązać problem, przekazując mniejszy plik, np.
test5mbfile(o rozmiarze 5 MB), jak pokazano poniżej:curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
- Jeśli chcesz wysłać prośbę 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. Użyj streamingu
Jeśli serwer proxy interfejsu API musi obsługiwać bardzo duże żądania lub odpowiedzi, możesz włączyć strumieniowanie w Apigee.
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 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 dokumentacją dotyczącą Request/response size w sekcji Limity 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 sekcji Limity Apigee Edge. - Jeśli jesteś użytkownikiem chmury prywatnej , możesz mieć zmodyfikowany domyślny limit 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 procesorach wiadomości usługa HTTPRequest.body.buffer.limit
została zaktualizowana o nową wartość.
- Na komputerze procesora komunikatów wyszukaj właściwość
HTTPRequest.body.buffer.limitw katalogu/opt/apigee/edge-message- processor/confi sprawdź, jaka wartość została ustawiona za pomocą tego polecenia:grep -ri "HTTPRequest.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:HTTPRequest.body.buffer.limit=10m
W przykładzie danych wyjściowych powyżej zwróć uwagę, że właściwość
HTTPRequest.body.buffer.limitma wartość10mwhttp.properties.Oznacza to, że limit rozmiaru ładunku żądania skonfigurowany w Apigee w przypadku Private Cloud wynosi 10 MB.
Jeśli nadal potrzebujesz pomocy zespołu 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
413 - Plik śledzenia żądań do interfejsu API
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
413 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