502 Nieprawidłowa bramka – TooBigBody

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:

  1. Zaloguj się w interfejsie Apigee Edge jako użytkownik z uprawnieniami odpowiednią rolę.
  2. Przełącz się na organizację, w której chcesz zbadać problem.

  3. Przejdź do przycisku Analiza > Monitorowanie interfejsów API > Zbadaj stronę.
  4. Wybierz okres, w którym zaobserwowano błędy.
  5. Aby zawęzić kod błędu, możesz wybrać filtr Serwer proxy.
  6. Porównaj Kod błędu z czasem.
  7. Wybierz komórkę, która ma kod błędu protocol.http.TooBigBody jako poniżej:

  8. Pojawi się informacja o kodzie błędu protocol.http.TooBigBody jak pokazano poniżej:

  9. Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.

  10. W oknie Logi zwróć uwagę na te informacje:
    • Kod stanu: 502
    • Źródło błędu: target
    • Kod błędu: protocol.http.TooBigBody.
  11. 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:

  1. 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.
  2. Wybierz jedno z nieudanych żądań i sprawdź log czasu.
  3. Przejdź przez różne fazy śledzenia i znajdź miejsca, w których wystąpił błąd.
  4. 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 .

  5. Niepowodzenie pojawi się na etapie Odpowiedź wysłana do klienta tak jak poniżej:

  6. 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"}}}
  7. 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
  8. Zwróć uwagę na Treść w sekcji Treść odpowiedzi:

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. Przejdź do fazy AX (zarejestrowane dane Analytics) w śledzeniu i kliknij ją. , aby zobaczyć powiązane informacje.

  10. 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
  11. 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:

  1. 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.
  2. 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.

  3. 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ę niepowodzeniem 502
  4. 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

  1. 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.
  2. 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.
  3. Sprawdź Rozmiar ładunku odpowiedzi określony w kroku 1.
  4. Sprawdź, czy rozmiar ładunku odpowiedzi jest rzeczywiście > Dozwolony limit 10 MB: wykonaj te czynności:
    1. Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego/backendu, i wybierz Rozwiązanie.
    2. Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego/backendu, wykonaj te czynności:
      1. 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.
      2. Jeśli jesteś użytkownikiem Private Cloud, możesz również wysłać prośbę do serwera backendu jednego z procesorów wiadomości.
      3. Aby sprawdzić rozmiar ładunku przekazywanego w odpowiedzi, sprawdź pole Nagłówek Content-Length.
      4. 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

  1. 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.
  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: .
  3. 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.
  4. 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):

    1. Jeśli masz zarejestrowany ślad dla nieudanego żądania, zapoznaj się z krokami opisanymi w Trace i
      1. Określ wartość parametru target.received.content.length.
      2. Sprawdź, czy żądanie klienta zawierało Kodowanie treści: nagłówek gzip
    2. 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:

    1. Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego/backendu, i wybierz Rozwiązanie.
    2. Jeśli masz dostęp do rzeczywistego żądania wysłanego do serwera docelowego/backendu, wykonaj te czynności:
      1. Sprawdź rozmiar ładunku przekazywanego w odpowiedzi razem z Nagłówek Content-Encoding został wysłany w odpowiedzi.
      2. Jeśli zauważysz, że nagłówek odpowiedzi Content-Encoding jest ustawiony na gzip, 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 pliku testzippedfile.gz w odpowiedzi jest mniejszy niż limit, jednak rozmiar nieskompresowanego pliku testzippedfile wynosił Ok. 15 MB.

    .

    Logi procesora wiadomości

    Przy użyciu dzienników procesora wiadomości:

    1. 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.
    2. Sprawdzanie logów procesora wiadomości

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. 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ę niepowodzeniem 502 Możesz użyć następujących ciągów wyszukiwania:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. Znajdziesz tam wiersze z domeny system.log podobne do tych poniżej (TotalRead i chunkCount 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)
      
    5. 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

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

  1. Przeanalizuj powód, dla którego określony serwer docelowy wysyła odpowiedź / rozmiar ładunku przekracza dozwolony limit określony w Limity.
  2. Jeśli nie jest to pożądane, zmodyfikuj aplikację serwera docelowego tak, aby wysyłała rozmiar odpowiedzi / ładunku jest mniejszy niż dozwolony limit.
  3. 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.

  1. 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.
  2. 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.

  1. 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
    
  2. Przykładowy wynik powyższego polecenia jest taki:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
    
  3. Zwróć uwagę, że w przykładowych danych wyjściowych powyżej Parametr HTTPResponse.body.buffer.limit został ustawiony na wartość 10m w http.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