Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację
Apigee X. info
Krótki opis problemu
Aplikacja kliencka otrzymuje kod stanu HTTP 502 Bad Gateway z kodem błędu
protocol.http.TooBigLine w odpowiedzi 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ć ten komunikat o błędzie:
{
"fault":{
"faultstring":"response line size exceeding 2,048",
"detail":{
"errorcode":"protocol.http.TooBigLine"
}
}
}Możliwe przyczyny
Ten błąd występuje, jeśli rozmiar wiersza odpowiedzi wysłanego przez serwer docelowy lub backendowy do Apigee Edge w ramach odpowiedzi HTTP jest większy niż maksymalny dozwolony limit w Apigee Edge.
Zanim przyjrzymy się możliwym przyczynom tego błędu, wyjaśnijmy, co oznacza wiersz odpowiedzi i jak sprawdzić jego rozmiar.
Co to jest wiersz odpowiedzi?
Typowa odpowiedź HTTP składa się z 3 części:
- Wiersz stanu (w Apigee nazywany wierszem odpowiedzi)
- ( Zestaw nagłówków HTTP )
- [ Treść ]
Wiersz odpowiedzi składa się z 3 części: wersji protokołu, liczbowego kodu stanu i powiązanego z nim wyrażenia tekstowego, jak pokazano poniżej:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
Gdy aplikacja serwera docelowego lub backendowego wysyła odpowiedź HTTP, pierwszy wysłany wiersz reprezentuje wiersz odpowiedzi opisany powyżej. Następują po nim
nagłówki i treść odpowiedzi lub ładunek.Poniższy przykładowy zrzut ekranu przedstawia typowe
curl żądanie, część Request (Żądanie) i część Response (Odpowiedź) (wraz z
wierszem odpowiedzi).
Co to jest rozmiar wiersza odpowiedzi?
W omówionym powyżej przykładzie wiersz start (pierwszy wiersz) w odpowiedzi, nazywany też wierszem odpowiedzi , wygląda tak:
HTTP/1.1 200 OK
Ten wiersz odpowiedzi ma rozmiar
~15 bytes, ponieważ zawiera15 ASCII characters. Ponieważ mieści się on w dozwolonym limicie w Apigee Edge, odpowiedź jest wysyłana z powrotem do klienta bez żadnych błędów przez Apigee Edge.- Podobnie, jeśli przyjrzysz się
faultstringw komunikacie o błędzie pokazanym powyżej, zobaczysz tam tekst"response line size exceeding 2,048". Oznacza to,że wiersz odpowiedzi w odpowiedzi HTTP wysłanej przez serwer docelowy lub backendowy przekroczył 2048 bajtów.
Co to jest duży wiersz odpowiedzi?
Zgodnie z definicją wiersza stanu (nazywanego tutaj wierszem odpowiedzi) oraz typowymi żądaniami i odpowiedziami HTTP jego rozmiar jest znacznie mniejszy niż zdefiniowany domyślny limit 2 KB w Apigee Edge, więc nie powinien go przekraczać. Oto jednak kilka możliwych scenariuszy, w których możesz przekroczyć ten limit:
- Serwer docelowy lub backendowy nie jest systemem HTTP. Może odpowiadać odpowiedzią inną niż HTTP odpowiedź.
- Serwer docelowy lub backendowy ma problemy i wysyła długi wiersz odpowiedzi w ramach odpowiedzi HTTP.
Więcej informacji znajdziesz w artykule Getting error protocol.http.TooBigLine, "response line size exceeding 2,048.
Oto możliwe przyczyny tego błędu:
| Przyczyna | Opis | Instrukcje rozwiązywania problemów, które mają zastosowanie do |
|---|---|---|
| Rozmiar wiersza odpowiedzi przekracza dozwolony limit | Rozmiar wiersza odpowiedzi wysłanego przez serwer docelowy lub backendowy w ramach odpowiedzi HTTP do Apigee Edge jest większy niż dozwolony limit w Apigee Edge. | Użytkownicy chmury publicznej i prywatnej Edge |
Typowe czynności diagnostyczne
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 interfejsów API:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
Przejdź do organizacji, w której chcesz zbadać problem.
- Otwórz stronę Analyze (Analiza) > API Monitoring (Monitorowanie interfejsów API) > Investigate (Zbadaj).
- Wybierz konkretny przedział czasu, w którym wystąpiły błędy.
- Aby zawęzić kod błędu, możesz wybrać filtr Proxy.
- Wykreśl Fault Code (Kod błędu) na osi Time (Czas).
Wybierz komórkę z kodem błędu
protocol.http.TooBigLinejak pokazano poniżej:
Zobaczysz informacje o kodzie błędu
protocol.http.TooBigLinejak pokazano poniżej:
Kliknij View logs (Wyświetl logi) i rozwiń wiersz nieudanego żądania.
- W oknie Logs (Logi) zanotuj te informacje:
- Status Code (Kod stanu):
502 - Fault Source (Źródło błędu):
target - Fault Code (Kod błędu):
protocol.http.TooBigLine.
- Status Code (Kod stanu):
- Jeśli Fault Source (Źródło błędu) ma wartość
target, a Fault Code (Kod błędu) ma wartośćprotocol.http.TooBigLine, oznacza to, że odpowiedź HTTP z serwera docelowego lub backendowego ma wiersz odpowiedzi o rozmiarze większym niż maksymalny dozwolony limit w Apigee Edge.
Narzędzie Trace
- Włącz sesję śledzenia i wykonaj jedną z tych czynności:
- Poczekaj na wystąpienie błędu
502 Bad Gatewaylub - jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz błąd
502 Bad Gateway.
- Poczekaj na wystąpienie błędu
- Wybierz jedno z nieudanych żądań i sprawdź ślad.
- Przejdź przez różne etapy śledzenia i znajdź miejsce, w którym wystąpił błąd.
Zwykle błąd znajdziesz w sekcji
flowinfoError (Błąd) tuż po etapie Request sent to target server (Żądanie wysłane do serwera docelowego) jak pokazano poniżej:
Zanotuj wartości błędu ze śladu:
- error (błąd):
response line exceeding 2,048(wiersz odpowiedzi przekracza 2048) - error.class (klasa błędu):
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 wiersza odpowiedzi przekracza dozwolony limit.
- error (błąd):
Komunikat o błędzie wysłany do klienta zobaczysz na etapie Response Sent to Client (Odpowiedź wysłana do klienta) jak pokazano poniżej:
- Zanotuj wartości błędu ze śladu:
- Error (Błąd):
502 Bad Gateway. - Treść błędu:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- Error (Błąd):
Możesz też przejść do etapu AX (Analytics Data Recorded) (Zarejestrowane dane analityczne) w śladzie i kliknąć go, aby zobaczyć szczegóły błędu.
Zanotuj wartość tych elementów:
Nagłówki żądania Wartość X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source targetError Content : Body {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
NGINX
Aby zdiagnozować błąd za pomocą logów dostępu NGINX:
- Jeśli jesteś użytkownikiem chmury prywatnej, 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_logGdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- Sprawdź, czy w określonym czasie (jeśli problem wystąpił w przeszłości) występują błędy
502lub czy nadal występują żądania, które kończą się niepowodzeniem z kodem502. Jeśli znajdziesz błędy
502z X-Apigee-fault-code pasującym do wartościprotocol.http.TooBigLine, określ wartość X-Apigee-fault-source.
Powyższy przykładowy wpis z logu dostępu NGINX ma te wartości dla X- Apigee-fault-code i X-Apigee-fault-source:
Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source target
Przyczyna: rozmiar wiersza odpowiedzi przekracza dozwolony limit
Diagnostyka
- Określ Fault Code (Kod błędu) i Fault Source (Źródło błędu) zaobserwowanego błędu za pomocą monitorowania interfejsów API, narzędzia Trace lub logów dostępu NGINX zgodnie z opisem w sekcji Typowe czynności diagnostyczne.
- Jeśli Fault Source (Źródło błędu) ma wartość
target, oznacza to, że rozmiar wiersza odpowiedzi wysłanego przez aplikację serwera docelowego lub backendowego do Apigee jest większy niż dozwolony limit w Apigee Edge. Możesz sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit 2 KB, za pomocą jednej z tych metod:
Komunikat o błędzie
Aby sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit, użyj komunikatu o błędzie:
Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, sprawdź
faultstring.Przykładowy komunikat o błędzie:
"faultstring":"response line size exceeding 2,048"
Powyższy
faultstringwskazuje, że rozmiar wiersza odpowiedzi przekroczył dozwolony limit 2 KB.Rzeczywiste żądanie
Aby sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit, użyj rzeczywistego żądania:
Jeśli masz dostęp do rzeczywistego żądania wysłanego do aplikacji serwera docelowego lub backendowego, wykonaj te czynności:
- Sprawdź rozmiar wiersza odpowiedzi.
- Jeśli okaże się, że rozmiar URI przekracza dozwolony limit w Apigee Edge, to jest to przyczyna problemu.
Przykładowa odpowiedź z serwera docelowego lub backendowego:
curl -v http://HOSTALIAS/test
* Trying 3.2.1.4... * TCP_NODELAY set * Connected to <hostalias> (3.2.1.4) port 80 (#0) > GET /test HTTP/1.1 > Host: HOSTALIAS > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 1111…<trimmed>...11111111 < Date: Mon, 26 Jul 2021 07:07:18 GMT < Content-Type: application/json < Content-Length: 269 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < { <Response Body> } * Connection #0 to host <hostalias> left intact * Closing connection 0
W tym przypadku wiersz odpowiedzi
HTTP/1.1 200 1111…<trimmed>...11111111jest większy niż 2 KB, czyli zawiera więcej niż 2 tys. znaków ASCII.Jeśli używasz innego klienta, możesz sprawdzić jego logi i spróbować znaleźć rozmiar wiersza odpowiedzi wysyłanego do Apigee Edge.
Logi procesora komunikatów
Aby sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit, użyj logów procesora komunikatów:
Jeśli jesteś użytkownikiem chmury prywatnej, możesz użyć dzienników procesora komunikatów, aby sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit w Apigee Edge.
- Określ identyfikator wiadomości nieudanego żądania za pomocą monitorowania interfejsów API, narzędzia Trace, lub logów dostępu NGINX zgodnie z opisem w sekcji Typowe czynności diagnostyczne.
Wyszukaj identyfikator wiadomości w logu procesora komunikatów:
/opt/apigee/var/log/edge-message-processor/logs/system.logZnajdziesz wiersze z
system.logpodobne do tych:2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592 useCount=1 bytesRead=0 bytesWritten=201 age=144ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048 at <snipped> 2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
Tekst
message = response line size exceeding 2,048w powyższym komunikacie o błędzie wskazuje, że rozmiar wiersza odpowiedzi przekracza 2 KB. Dlatego Apigee Edge zgłasza wyjątek i zwraca kod stanu502z kodem błęduprotocol.http.TooBiglinedo aplikacji klienckich.
Rozwiązanie
Naprawianie rozmiaru
Opcja 1 [zalecana]: zmień aplikację serwera docelowego lub backendowego, aby nie wysyłała wierszy odpowiedzi o rozmiarze większym niż dozwolony limit
- Przeanalizuj przyczynę, dla której konkretny klient wysyła wiersz odpowiedzi o rozmiarze większym niż dozwolony limit określony w sekcji Limity.
- Jeśli nie jest to pożądane, zmodyfikuj aplikację serwera docelowego lub backendowego, aby wysyłała wiersz odpowiedzi o rozmiarze mniejszym niż dozwolony limit.
- Jeśli jest to pożądane i chcesz wysyłać wiersz odpowiedzi o rozmiarze większym niż dozwolony limit, przejdź do następnych opcji.
CwC
Opcja 2: użyj właściwości CwC, aby zwiększyć limit wiersza odpowiedzi
Apigee udostępnia właściwość CwC , która pozwala zwiększyć limit rozmiaru wiersza odpowiedzi. Więcej informacji znajdziesz w artykule Ustawianie limitu wiersza odpowiedzi w procesorze komunikatów.
Limity
Apigee oczekuje, że aplikacja kliencka i serwer backendowy nie będą wysyłać wierszy żądań ani odpowiedzi o rozmiarach większych niż dozwolony limit, zgodnie z opisem w sekcji Limit wiersza żądania lub odpowiedzi w artykule Limity Apigee Edge.
- Jeśli jesteś użytkownikiem chmury publicznej, maksymalny limit rozmiaru wiersza żądania i odpowiedzi jest zgodny z opisem w sekcji Rozmiar wiersza żądania lub odpowiedzi w artykule Limity Apigee Edge.
- Jeśli jesteś użytkownikiem chmury prywatnej , możesz zmodyfikować domyślny maksymalny limit rozmiaru wiersza żądania i odpowiedzi (chociaż nie jest to zalecane). Maksymalny limit rozmiaru wiersza odpowiedzi możesz określić, wykonując instrukcje w artykule Jak sprawdzić aktualny limit.
Jak sprawdzić aktualny limit?
W tej sekcji wyjaśniamy, jak sprawdzić, czy właściwość HTTPResponse.line.limit została
zaktualizowana o nową wartość w Message Processor.
- Na komputerze procesora komunikatów wyszukaj właściwość
HTTPResponse.line.limitw katalogu/opt/apigee/edge-message-processor/confi sprawdź, jaka wartość została ustawiona, jak pokazano poniżej:grep -ri "HTTPResponse.line.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.line.limit=2k
W powyższym przykładzie zwróć uwagę, że właściwość
HTTPResponse.line.limitzostała ustawiona na wartość2kw plikuhttp.properties.Oznacza to, że limit rozmiaru wiersza odpowiedzi skonfigurowany w Apigee dla chmury prywatnej wynosi 2 KB.
Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, przejdź do sekcji Informacje diagnostyczne, które musisz zebrać.
Informacje diagnostyczne, które musisz zebrać
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
Jeśli jesteś użytkownikiem chmury prywatnej, podaj te informacje:
- Pełny komunikat o błędzie zaobserwowany w przypadku nieudanych żądań
- Nazwa organizacji
- Nazwa środowiska
- Pakiet proxy interfejsu API
- Plik śledzenia nieudanych żądań do interfejsu API
- Pełne polecenie
curlużyte do odtworzenia błędu502 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.
- Logi systemowe procesora komunikatów
/opt/apigee/var/log/edge-message-processor/logs/system.log