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 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
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 aplikację kliencką do Apigee Edge w ramach żądania 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 żądania przekracza dozwolony limit | Rozmiar ładunku wysyłany przez aplikację kliencką w ramach żądania HTTP do Apigee Edge przekracza dozwolony limit w Apigee Edge. | Użytkownicy chmury publicznej i prywatnej usługi Edge |
Rozmiar ładunku żądania przekracza dozwolony limit po dekompresji | Rozmiar ładunku wysyłany w formacie skompresowanym przez aplikację kliencką w ramach żądania HTTP do Apigee Edge przekracza dozwolony limit po zdekompresowaniu przez Apigee Edge. | 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
i kodem stanu413
, jak pokazano poniżej:Informacje o kodzie błędu
protocol.http.TooBigBody
są wyświetlane jak poniżej:- Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania. Następnie w oknie Logi zapoznaj się ze szczegółami podanymi poniżej :
Nieskompresowany
Scenariusz 1. Ładunek żądania wysłany w nieskompresowanej formie
W oknie Logi zwróć uwagę na te informacje:
- Kod stanu:
413
- Źródło błędu:
proxy
- Kod błędu:
protocol.http.TooBigBody
. - Długość żądania(bajty):
15360440
(~15 MB)
Jeśli źródło błędu ma wartość
proxy
, kod błędu ma wartośćprotocol.http.TooBigBody
, a długość żądania jest większa niż 10 MB, oznacza to, że żądanie HTTP od klienta ma ładunek żądania większy niż dozwolony limit w Apigee.Skompresowany
Scenariusz 2. Żądanie ładunku wysłane w formie skompresowanej
W oknie Logi zwróć uwagę na te informacje:
- Kod stanu:
413
- Źródło błędu:
proxy
- Kod błędu:
protocol.http.TooBigBody
. - Długość żądania(bajty):
15264
(~15 kB)
Jeśli źródło błędu ma wartość
proxy
, kod błędu ma wartośćprotocol.http.TooBigBody
, a długość żądania jest mniejsza niż 10 MB, oznacza to, że rozmiar ładunku żądania HTTP od klienta w formacie skompresowanym jest mniejszy niż dozwolony limit, ale rozmiar ładunku przekracza dozwolony limit po zdekompresowaniu przez Apigee. - Kod stanu:
Trace
Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:
- Włącz sesję śledzenia i
- Poczekaj na wystąpienie błędu
413 Request Entity Too Large
lub - Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API i odtwórz błąd
413 Request Entity Too Large
- Poczekaj na wystąpienie błędu
Upewnij się, że opcja Pokaż wszystkie informacje o przepływie jest włączona.
- Wybierz 1 z nieudanych żądań i sprawdź log czasu.
- Przejdź do etapu Prośba otrzymana od klienta.
Nieskompresowany
Scenariusz 1. Ładunek żądania wysłany w nieskompresowanej formie
Uwaga:
- Content-Encoding: brak
- Content-Length:
15360204
Skompresowany
Scenariusz 2. Żądanie ładunku wysłane w formie skompresowanej
Uwaga:
- Kodowanie treści:
gzip
- Content-Length:
14969
- Content-Type:
application/x-gzip
- Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
Błąd pojawia się zwykle w procesie po fazie Żądanie otrzymane od klienta, jak pokazano poniżej:
- Zapisz wartość błędu ze śledzenia. Powyższy przykładowy log czasu pokazuje:
- błąd:
Body buffer overflow
- error.class:
com.apigee.errors.http.user.RequestTooLarge
- błąd:
Otwórz Odpowiedź wysłana do klienta i zanotuj wartości błędu z logu czasu. Przykładowy ślad 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:
- Przejdź do fazy AX (rejestrowane dane Analytics) w śledzeniu i kliknij ją.
W sekcji Szczegóły fazy przewiń w dół do opcji Odczyt zmiennych.
- Określ wartość zmiennej client.received.content.length , która wskazuje:
- Rzeczywisty rozmiar ładunku żądania wysyłanego w formacie nieskompresowanym i
- Rozmiar ładunku żądania 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. Żądanie ładunku w nieskompresowanej formie
zmienna client.received.content.length:
15360204
Skompresowany
Scenariusz 2. Żądanie ładunku w formacie skompresowanym
zmienna client.received.content.length:
10489856
- W tabeli poniżej wyjaśniono, dlaczego Apigee zwraca błąd
413
w tych 2 scenariuszach, na podstawie wartości zmiennej klienta.received.content.length:Scenariusz Wartość client.received.content.length Przyczyna niepowodzenia Ładunek żądania w formacie nieskompresowanym Około 15 MB Rozmiar > dozwolony limit, który wynosi 10 MB. Ładunek żądania 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
413
. Sprawdź logi dostępu do NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Sprawdź, czy występują jakieś błędy
413
w danym okresie (jeśli problem występował w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z413
. - Jeśli znajdziesz błędy
413
z kodem X-Apigee-fault-code pasującym do wartości X-Apigee-fault-code , sprawdź wartość źródła błędów X-Apigee-fault-code .Nieskompresowany
Scenariusz 1. Żądany rozmiar ładunku w formacie nieskompresowanym
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-code :
Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-sourc policy
Zwróć uwagę na Długość żądania:
15360440
(14,6 MB > dozwolony limit)Skompresowany
Scenariusz 2. Żądaj rozmiaru ładunku w formacie skompresowanym
Powyższy przykładowy wpis z logu dostępu NGINX ma następujące wartości kodu X-Apigee-fault-code i X-Apigee-fault-code :
Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.TooBigBody
X-Apigee-fault-source policy
Zwróć uwagę na Długość żądania:
15264
(14,9 KB < dozwolony limit)W tym scenariuszu Apigee Edge zwraca
413
, mimo że długość żądania jest mniejsza niż dozwolony limit, ponieważ żądanie mogło zostać wysłane w formacie skompresowanym, a rozmiar ładunku przekracza limit po dekompresji przez Apigee Edge.
Przyczyna: rozmiar ładunku żądania jest większy niż dozwolony limit
Diagnostyka
- Określ kod błędu, źródło błędu i rozmiar ładunku żądania dla błędu zaobserwowanego przy użyciu logów dostępu API Monitoring, narzędzia do śledzenia lub NGINX zgodnie z częstymi krokami diagnostycznymi dla scenariusza nr 1 (bez kompresji).
- Jeśli źródło błędu ma wartość
policy
lubproxy
, 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 z kroku 1.
- Jeśli dozwolony rozmiar ładunku przekracza 10 MB, to jest przyczyną błędu.
- Jeśli dozwolony rozmiar ładunku nie przekracza 10 MB, możliwe, że ładunek żądania jest przekazywany w formacie skompresowanym. Przejdź do sekcji Przyczyna: po zdekompresowaniu rozmiar ładunku żądania przekroczył dozwolony limit.
- Możesz też sprawdzić, czy rozmiar ładunku żądania przekracza 10 MB dozwolony limit, sprawdzając żądanie, wykonując te czynności:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego przez aplikację kliencką, przejdź do sekcji Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego przez aplikację kliencką, 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 przyczyną problemu.
Przykładowe żądanie:
curl http://<hostalias>/testtoobigbody -k -X POST -F file=@test15mbfile -v
W tym przypadku rozmiar pliku
test15mbfile
to około 15 MB. Jeśli korzystasz z innego klienta, pobierz logi klienta, aby sprawdzić rozmiar wysyłanego ładunku.
Rozdzielczość
Kliknij Rozwiązanie.
Przyczyna: rozmiar ładunku żądania przekracza dozwolony limit po dekompresji
Jeśli ładunek żądania jest wysyłany w formacie skompresowanym, a nagłówek żądania Content-Encoding
jest ustawiony na gzip,
Apigee dekompresuje ładunek żądania. Jeśli w trakcie procesu dekompresji Apigee ustali, że rozmiar ładunku przekracza 10 MB, jest
dozwolony limit, zatrzymuje dalszą dekompresję i natychmiast odpowiada 413 Request Entity Too Large
z kodem błędu protocol.http.TooBigBody
.
Diagnostyka
- Określ kod błędu, źródło błędu i rozmiar ładunku żądania dla błędu zaobserwowanego w logach monitorowania interfejsu API, narzędzia śledzenia lub logu dostępu NGINX zgodnie z opisem w sekcji Typowe kroki diagnostyki dla scenariusza nr 2 (skompresowany).
- Jeśli źródło błędu ma wartość
policy
lubproxy
, 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 dozwolony rozmiar ładunku przekracza 10 MB, to jest przyczyną błędu.
- Jeśli dozwolony rozmiar ładunku nie przekracza 10 MB, możliwe, że ładunek żądania jest przekazywany w formacie skompresowanym. W tym przypadku sprawdź nieskompresowany rozmiar ładunku skompresowanego żądania.
- Za pomocą jednej z tych metod możesz sprawdzić, czy żądanie od klienta zostało wysłane w formacie skompresowanym, a rozmiar nieskompresowany przekraczał dozwolony limit:
Trace
Aby sprawdzić poprawność danych za pomocą narzędzia Trace:
- Jeśli masz zarejestrowany log czasu dla nieudanego żądania, zapoznaj się z krokami opisanymi w sekcjach Śledzenie i
- Określ wartość zmiennej client.received.content.length
- Sprawdź, czy żądanie klienta zawiera nagłówek Content-Encoding:
gzip
- Jeśli wartość zmiennej client.received.content.length przekracza dozwolony limit, dozwolony limit i nagłówek żądania client.received.content.length , jest to przyczyną 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ę kliencką, przejdź do sekcji Rozwiązanie.
- Jeśli masz dostęp do rzeczywistego żądania wysłanego przez aplikację kliencką, wykonaj te czynności:
- Sprawdź rozmiar ładunku przekazanego w żądaniu wraz z nagłówkiem
Content-Encoding
wysłanym w żądaniu. Sprawdź, czy rozmiar nieskompresowanego ł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 powyższym przypadku rozmiar pliku
test15mbfile.gz
jest mniejszy niż limit rozmiaru, jednak rozmiar nieskompresowanego plikutest15mbfile
wynosi około 15 MB, a nagłówekContent-Encoding
togzip
.Jeśli korzystasz z innego klienta, sprawdź logi klienta, aby sprawdzić rozmiar wysyłanego ładunku i sprawdzić, czy nagłówek
Content-Encoding
jest ustawiony nagzip
.
- Sprawdź rozmiar ładunku przekazanego w żądaniu wraz z nagłówkiem
Logi procesora wiadomości
Aby sprawdzić poprawność danych za pomocą 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
413
. Sprawdź dzienniki procesora wiadomości:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Sprawdź, czy występują jakieś błędy
413
w określonym czasie (jeśli problem wystąpił w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z413
.Możesz użyć tych ciągów wyszukiwania:
grep -ri "chunkCount"
grep -ri "RequestTooLarge"
- Zobaczysz wiersze ze źródła
system.log
podobne do tych (TotalRead
ichunkCount
mogą 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
- Gdy tylko w trakcie procesu 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 2570
Wskazuje on, ż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 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ę kliencką, aby nie wysyłała ładunku większego niż dozwolony limit
- Przeanalizuj, dlaczego określony klient wysłał żądanie lub ładunek większy niż dozwolony limit określony w sekcji Limity.
Jeśli nie jest to pożądane, zmodyfikuj aplikację kliencką tak, aby wysyłała żądanie lub ładunek mniejszy niż dozwolony limit.
W podanym wyżej przykładzie możesz rozwiązać problem, przesyłając ładunek
test5mbfile
(o rozmiarze 5 MB):curl https://<host>/testtoobigbody -k -X POST -F file=@test5mbfile -v
- Jeśli chcesz, aby Twoje żądanie lub ładunek było więcej niż dozwolony limit, przejdź do kolejnych opcji.
Wzorzec podpisanego 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 o ustawianiu 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 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ść HTTPRequest.body.buffer.limit
została zaktualizowana o nową wartość w procesorach wiadomości.
- Na komputerze procesora wiadomości wyszukaj właściwość
HTTPRequest.body.buffer.limit
w katalogu/opt/apigee/edge-message- processor/conf
i sprawdź, jaka wartość została ustawiona przy użyciu tego polecenia:grep -ri "HTTPRequest.body.buffer.limit" /opt/apigee/edge-message-processor/conf
- Przykładowy wynik tego polecenia:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.body.buffer.limit=10m
W przykładowych danych wyjściowych powyżej można zauważyć, że właściwość
HTTPRequest.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 Wymagane jest zbieranie informacji diagnostycznych.
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
413
- Plik śledzenia żądań interfejsu API
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
413
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