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 502 Bad Gateway
z kodem błędu protocol.http.TooBigLine
.
Komunikat o błędzie
Aplikacja kliencka otrzymuje ten kod odpowiedzi:
HTTP/1.1 502 Bad Gateway
Oprócz tego może pojawić się 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 wysyłany przez serwer docelowy/backend do Apigee Edge w ramach odpowiedzi HTTP jest większy niż maksymalny dozwolony limit w Apigee Edge.
Zanim zajmiemy się możliwymi przyczynami tego błędu, dowiedz się, co oznacza wiersz odpowiedzi i jak sprawdzić jego rozmiar.
Omówienie wiersza odpowiedzi
Typowa odpowiedź HTTP składa się z 3 części:
- Status-Line (nazwany w Apigee jako Response-Line)
- ( Zestaw nagłówków HTTP )
- [ Treść ]
Wiersz odpowiedzi składa się z 3 części: wersji protokołu, po których następują numeryczny kod stanu i powiązane z nim wyrażenie tekstowe, jak pokazano poniżej:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
Gdy aplikacja serwera docelowego lub backendu wysyła odpowiedź HTTP, pierwszy wysłany wiersz reprezentuje wiersz odpowiedzi, jak opisano powyżej. Po nim znajdują się nagłówki oraz treść/ładunek odpowiedzi.Poniższy przykładowy zrzut ekranu przedstawia typowe żądanie curl
, część Request oraz część Response (wraz z wierszem odpowiedzi).
Informacje o rozmiarze wiersza odpowiedzi
W przykładzie powyżej 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ż ta liczba mieści się w dozwolonym limicie w Apigee Edge, odpowiedź jest odsyłana do klienta bez błędów przez Apigee Edge.- Podobnie jeśli spojrzysz na element
faultstring
w komunikacie o błędzie widocznym powyżej, zawiera on"response line size exceeding 2,048"
. Oznacza to,że wartość wiersza odpowiedzi w odpowiedzi HTTP wysłanej przez serwer docelowy/backend przekracza 2048 bajtów.
Interpretacja dużej linii odpowiedzi
Zgodnie z definicją Status-Line (Linia odpowiedzi nazywana tutaj Response-Line) oraz typowymi żądaniami i odpowiedziami HTTP rozmiar jest znacznie mniejszy niż zdefiniowany domyślny limit 2 K w Apigee Edge, więc możemy nie osiągnąć tego limitu. Oto jednak kilka możliwych scenariuszy, w których ten limit może zostać przekroczony:
- Serwer docelowy/backend nie jest systemem HTTP. Może odpowiadać odpowiedzią inną niż HTTP.
- Serwer docelowy/backend ma problemy i wysyła długi wiersz odpowiedzi w odpowiedzi HTTP.
Więcej informacji na ten temat znajdziesz w artykule o uzyskiwaniu protokołu błędu.http.TooBigLine, „rozmiar wiersza odpowiedzi powyżej 2048.
Oto możliwe przyczyny błędu:
Przyczyna | Opis | Instrukcje rozwiązywania problemów dotyczące |
---|---|---|
Rozmiar wiersza odpowiedzi jest większy niż dozwolony limit | Rozmiar wiersza odpowiedzi wysyłanego przez serwer docelowy/backend w ramach odpowiedzi HTTP do Apigee Edge jest większy niż dozwolony limit w 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.TooBigLine
, jak pokazano poniżej:Informacje o kodzie błędu
protocol.http.TooBigLine
wyświetlą się 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.TooBigLine
.
- Kod stanu:
- Jeśli źródło błędu ma wartość
target
, a kod błędu ma wartośćprotocol.http.TooBigLine
, oznacza to, że rozmiar wiersza odpowiedzi z serwera docelowego/ serwera backendu ma wartość większą niż maksymalny dozwolony limit w Apigee Edge.
Narzędzie do śledzenia
- Włącz sesję śledzenia i wykonaj jedną z tych czynności:
- Poczekaj na wystąpienie błędu
502 Bad Gateway
lub - Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API i odtwórz błąd
502 Bad Gateway
.
- Poczekaj na wystąpienie błędu
- Wybierz 1 z nieudanych żądań i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
Błąd występuje zwykle w sekcji Błąd
flowinfo
tuż po etapie Żądanie wysłane do serwera docelowego, jak pokazano poniżej:Zapisz wartości błędu ze logu czasu:
- błąd:
response line exceeding 2,048
- error.class:
com.apigee.errors.http.server.BadGateway
Oznacza to, że Apigee Edge (komponent Message Processor) zgłasza błąd, gdy tylko otrzyma odpowiedź z serwera backendu z powodu przekroczenia limitu wiersza odpowiedzi.
- błąd:
Komunikat o błędzie wysłany do klienta zobaczyłby się poniżej na etapie Odpowiedź wysłana do klienta:
- Zapisz wartości błędu ze logu czasu:
- Błąd:
502 Bad Gateway
. - Treść błędu:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- Błąd:
Możesz też przejść w logu czasu do fazy AX (rejestrowane dane Analytics) i kliknąć ją, aby zobaczyć szczegóły błędu.
Zwróć uwagę na te kwestie:
Nagłówki żądania Wartość X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
Treść błędu : treść {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
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 do 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 występują jakieś błędy
502
w danym okresie (jeśli problem występował w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z502
. Jeśli znajdziesz błędy
502
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 .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-source:
Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
Przyczyna: rozmiar wiersza odpowiedzi jest większy niż dozwolony limit
Diagnostyka
- Znajdź kod błędu i źródło błędu dla błędu zaobserwowanego przy użyciu interfejsu API Monitoring, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w częstych krokach diagnostyki.
- Jeśli źródło błędów ma wartość
target
, oznacza to, że rozmiar wiersza odpowiedzi wysyłany przez aplikację serwera docelowego/backendowego do Apigee jest większy niż dozwolony limit w Apigee Edge. Aby sprawdzić, czy rozmiar wiersza odpowiedzi przekracza dozwolony limit 2 KB, użyj jednej z tych metod:
Komunikat o błędzie
Aby przeprowadzić weryfikację przy użyciu komunikatu o błędzie:
Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z dokumentem
faultstring
.Przykładowy komunikat o błędzie:
"faultstring":"response line size exceeding 2,048"
Powyższy
faultstring
oznacza, że rozmiar wiersza odpowiedzi przekracza dozwolony limit 2 KB.Rzeczywista prośba
Aby sprawdzić poprawność za pomocą rzeczywistego żądania:
Jeśli masz dostęp do rzeczywistego żądania wysłanego do aplikacji serwera docelowego lub backendu, wykonaj te czynności:
- Sprawdź rozmiar wiersza odpowiedzi
- Jeśli zauważysz, że rozmiar identyfikatora URI przekracza dozwolony limit w Apigee Edge, to jest przyczyną problemu.
Przykładowa odpowiedź z serwera docelowego lub backendu:
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 powyższym przypadku wiersz odpowiedzi
HTTP/1.1 200 1111…<trimmed>...11111111
jest większy niż 2 KB, czyli zawiera więcej niż 2 znaki ASCII.Jeśli używasz innego klienta, możesz przejrzeć dzienniki klienta i spróbować ustalić rozmiar wiersza odpowiedzi wysyłanego do Apigee Edge.
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 sprawdzić, czy rozmiar wiersza odpowiedzi przekroczył dozwolony limit w Apigee Edge.
- Ustal identyfikator wiadomości niezrealizowanego żądania za pomocą monitorowania interfejsu API, narzędzia do śledzenia lub logów dostępu NGINX zgodnie z opisem w częstych krokach diagnostyki.
Wyszukaj identyfikator wiadomości w dzienniku procesora wiadomości:
/opt/apigee/var/log/edge-message-processor/logs/system.log
Zobaczysz wiersze ze źródła
system.log
podobne 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,048
w powyższym komunikacie o błędzie oznacza, że rozmiar wiersza odpowiedzi przekracza 2 KB. Dlatego Apigee Edge zgłasza wyjątek i zwraca kodowi stanu502
z kodem błęduprotocol.http.TooBigline
aplikacjom klienckim.
Rozdzielczość
Stały rozmiar
Opcja nr 1 [zalecana]: napraw aplikację serwera docelowego/backendu, aby nie wysyłała wierszy odpowiedzi o rozmiarze większym niż dozwolony limit
- Przeanalizuj, dlaczego dany klient wysł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/backendowego tak, aby wysyłała wiersz odpowiedzi o rozmiarze mniejszym niż dozwolony limit.
- Jeśli to pożądane i chcesz wysł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 linii odpowiedzi
Apigee udostępnia właściwość CwC, która pozwala zwiększyć limit rozmiaru wiersza odpowiedzi. Więcej informacji znajdziesz w artykule o ustawieniu limitu wierszy odpowiedzi w procesorze wiadomości.
Ograniczenia
Apigee oczekuje, że aplikacja kliencka i serwer backendu nie wysyłają wierszy żądań ani odpowiedzi, których rozmiar przekracza dozwolony limit określony w sekcji Limit wierszy żądań/odpowiedzi w sekcji Limity brzegowe Apigee.
- Jeśli jesteś użytkownikiem chmury publicznej, to maksymalny rozmiar wiersza żądań i odpowiedzi jest zgodny z rozmiarem żądania/wiersza odpowiedzi w limitach Apigee Edge.
- Jeśli jesteś użytkownikiem Private Cloud , możesz zmienić domyślny maksymalny limit rozmiaru żądań i wiersza odpowiedzi (chociaż nie jest to zalecane). Maksymalny limit rozmiaru wiersza odpowiedzi możesz określić, wykonując instrukcje opisane w artykule Jak sprawdzić bieżący limit.
Jak sprawdzić aktualny limit?
Ta sekcja wyjaśnia, jak sprawdzić, czy właściwość HTTPResponse.line.limit
została zaktualizowana o nową wartość w procesorach wiadomości.
- Na komputerze procesora wiadomości wyszukaj właściwość
HTTPResponse.line.limit
w katalogu/opt/apigee/edge-message-processor/conf
i sprawdź, jaka wartość została ustawiona, jak pokazano poniżej:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- Przykładowy wynik tego polecenia:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
W przykładowych danych wyjściowych powyżej można zauważyć, że właściwość
HTTPResponse.line.limit
została ustawiona z wartością2k
w językuhttp.properties
.Oznacza to, że limit rozmiaru wiersza odpowiedzi skonfigurowanego w Apigee dla Private Cloud to 2 KB.
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
502
- 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
- Wykonaj polecenie
curl
użyte do odtworzenia błędu502
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