502 Nieprawidłowa brama – ResponseWithBody

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.ResponseWithBody w odpowiedzi na wywołania interfejsu API.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 502 Bad Gateway

Dodatkowo możesz zobaczyć jeden z tych komunikatów o błędach:

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

Możliwe przyczyny

Ten błąd występuje, jeśli odpowiedź HTTP z serwera backendu do Apigee Edge to 204 No Content lub 205 Reset Content, ale zawiera treść odpowiedzi lub co najmniej 1 z tych nagłówków:

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

Zgodnie ze specyfikacjami RFC 7231, sekcja 6.3.5: 204 No Content i RFC 7231, sekcja 6.3.6: 205 Reset Content, serwer pierwotny nie powinien wysyłać żadnej dodatkowej treści w treści ładunku odpowiedzi z kodem stanu 204 No Content lub 205 Reset Content. Nagłówki odpowiedzi takie jak Content-Length, Content-Encoding lub Transfer-Encoding wskazują rozmiar, typ lub format ładunku odpowiedzi.

Dlatego w tych okolicznościach Apigee Edge zwraca do klienta kod stanu 502 Bad Gateway z kodem błędu protocol.http.ResponseWithBody:

Kod stanu z serwera backendu
Odpowiedź z serwera backendu zawiera 204 No Content 205 Reset Content
Treść odpowiedzi BŁĄD BŁĄD

Nagłówek Content-Length

(ustawiony na wartość inną niż zero)

BŁĄD BŁĄD

Content-Encoding

(ustawiony na obsługiwane kodowanie w Apigee Edge)

BŁĄD BRAK BŁĘDU
Transfer-Encoding BŁĄD BŁĄD

Oto możliwe przyczyny tego błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów, których dotyczy
Treść odpowiedzi lub nagłówki z odpowiedzią 204 z serwera backendu Serwer backendu wysyła odpowiedź 204 No Content lub 205 Reset Content z treścią odpowiedzi lub co najmniej 1 z tych nagłówków: Content-Type, Content-Encoding lub Transfer-Encoding. Użytkownicy Edge Public i Private Cloud

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:

  1. Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
  2. Przejdź do organizacji, w której chcesz zbadać problem.

  3. Otwórz stronę Analiza > Monitorowanie interfejsów API > Zbadaj.
  4. Wybierz konkretny przedział czasu, w którym wystąpiły błędy.
  5. Wykreśl Kod błędu względem Czasu.
  6. Wybierz komórkę z kodem błędu protocol.http.ResponseWithBody jak pokazano poniżej:

    ( zobacz większy obraz)

  7. Zobaczysz informacje o kodzie błędu protocol.http.ResponseWithBody jak pokazano poniżej:

    ( zobacz większy obraz)

  8. Kliknij Wyświetl logi i rozwiń wiersz z nieudanym żądaniem.

    ( zobacz większy obraz)

  9. W oknie Logi zanotuj te informacje:
    • Kod stanu: 502
    • Źródło błędu: target
    • Kod błędu: protocol.http.ResponseWithBody.
  10. Jeśli Źródło błędu ma wartość target, a Kod błędu ma wartość protocol.http.ResponseWithBody, oznacza to, że błąd wystąpił, ponieważ serwer backendu wysłał kod stanu 204 No Content lub 205 Reset Content z treścią odpowiedzi lub jednym z nagłówków wymienionych w sekcji Możliwe przyczyny.

Narzędzie Trace

Aby zdiagnozować błąd za pomocą narzędzia Trace:

  1. Włącz sesję śledzenia i wykonaj jedną z tych czynności:
    1. Zaczekaj na wystąpienie błędu 502 Bad Gateway lub
    2. Jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz błąd 502 Bad Gateway.
  2. Sprawdź, czy jest włączona opcja Pokaż wszystkie informacje o przepływie:

  3. Wybierz jedno z nieudanych żądań i sprawdź ślad.
  4. Przejdź przez różne etapy śledzenia i znajdź miejsce, w którym wystąpił błąd.
  5. Zwykle błąd znajdziesz w flowinfo Error tuż po etapie Request sent to target server (Żądanie wysłane do serwera docelowego) jak pokazano poniżej:

    Scenariusz 1

    Scenariusz 1. Serwer backendu odpowiada kodem stanu 204 No Content zawierającym treść odpowiedzi lub jeden z nagłówków wymienionych w sekcji Możliwe przyczyny.

    Zanotuj te wartości ze śladu:

    • error: Received 204 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway

    Scenariusz 2

    Scenariusz 2. Serwer backendu odpowiada kodem stanu 204 No Content zawierającym treść odpowiedzi lub jeden z nagłówków wymienionych w sekcji Możliwe przyczyny.

    Zanotuj te wartości ze śladu:

    • error: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. W śladzie otwórz etap AX (Analytics Data Recorded) i kliknij go.
  7. Przewiń w dół do sekcji Phase Details (Szczegóły etapu) i Error Headers (Nagłówki błędów) i określ wartości X-Apigee-fault-code i X-Apigee-fault-source jak pokazano poniżej:

    ( zobacz większy obraz)

  8. Zwróć uwagę, że wartości X-Apigee-fault-code i X-Apigee-fault-source are protocol.http.ResponseWithBody i target odpowiednio. Oznacza to, że błąd wystąpił, ponieważ serwer backendu wysłał kod stanu 204 No Content lub 205 Reset Content z treścią odpowiedzi lub jednym z nagłówków wymienionych w sekcji Możliwe przyczyny.
    Błąd Wartość
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

NGINX

Aby zdiagnozować błąd za pomocą logów dostępu NGINX:

  1. Jeśli jesteś użytkownikiem chmury prywatnej, możesz użyć logów dostępu NGINX, aby określić kluczowe informacje o błędzie HTTP 502 Bad Gateway.
  2. Sprawdź 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.

  3. Sprawdź, czy w określonym czasie (jeśli problem wystąpił w przeszłości) nie ma błędów 502 z kodem błędu protocol.http.ResponseWithBody lub czy nadal występują żądania, które kończą się niepowodzeniem z kodem 502.
  4. Jeśli znajdziesz błędy 502 z X-Apigee-fault-code pasującym do wartości protocol.http.ResponseWithBody, określ wartość X-Apigee-fault-source.

    Przykładowy błąd 502 z logu dostępu NGINX:

    Powyższy przykładowy wpis z logu dostępu NGINX ma te wartości X- Apigee-fault-code i X-Apigee-fault-source:

    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target
  5. Zwróć uwagę, że wartości X-Apigee-fault-code i X-Apigee-fault-source to odpowiednio protocol.http.ResponseWithBody i target. Oznacza to, że błąd wystąpił, ponieważ serwer backendu wysłał kod stanu 204 No Content lub 205 Reset Content z treścią odpowiedzi lub jednym z nagłówków wymienionych w sekcji Możliwe przyczyny.

Przyczyna: treść odpowiedzi lub nagłówki z odpowiedzią 204 z serwera backendu

Diagnostyka

  1. Określ Kod błędu i Ź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.
  2. Jeśli Kod błędu to protocol.http.ResponseWithBody, a Źródło błędu ma wartość target, oznacza to, że serwer backendu odpowiedział kodem stanu 204 No Content lub 205 Reset Content z treścią odpowiedzi lub jednym z nagłówków wymienionych w sekcji Możliwe przyczyny.
  3. Aby sprawdzić, czy serwer backendu rzeczywiście wysłał treść ładunku odpowiedzi lub co najmniej 1 z nagłówków wymienionych w sekcji Możliwe przyczyny, wykonaj te czynności:

    1. Jeśli jesteś użytkownikiem chmury publicznej i możesz wysłać to samo żądanie do interfejsu API bezpośrednio z dowolnego systemu.

    2. Jeśli jesteś użytkownikiem chmury prywatnej, możesz wysłać to samo żądanie do interfejsu API bezpośrednio z jednego z procesorów komunikatów powiązanych z konkretną organizacją i środowiskiem, w którym wystąpił błąd.
    3. Sprawdź odpowiedź otrzymaną z serwera backendu i upewnij się, że zawiera ona a treść ładunku odpowiedzi lub co najmniej 1 z wymienionych powyżej nagłówków. Jeśli tak, to jest to przyczyna tego błędu.

      Przykład 1

      Przykład 1. Odpowiedź serwera backendu 204 z nagłówkiem Content-Encoding

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      W tym przykładzie serwer backendu odpowiedział kodem stanu 204 No Content i Content-Encoding: gzip

      Przykład 2

      Przykład 2. Odpowiedź serwera backendu 204 z nagłówkiem Content-Length

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      W tym przykładzie serwer backendu odpowiedział z 204 No Content kodem stanu i Content-Length: 48

      Przykład 3

      Przykład 3. Odpowiedź serwera backendu 205 z treścią odpowiedzi

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      W tym przykładzie serwer backendu odpowiedział z 205 Reset Content kodem stanu z treścią odpowiedzi This is a sample Response.

    4. We wszystkich powyższych przykładach serwer backendu wysłał 204 No Content lub 205 Reset Content kod stanu z treścią odpowiedzi lub jednym z nagłówków wymienionych w sekcji Możliwe przyczyny.
    5. Dlatego Apigee Edge wysłał 502 Bad Gateway kod stanu z kodem błędu protocol.http.ResponseWithBody.

Rozdzielczość

Upewnij się, że serwer backendu zawsze przestrzega specyfikacji RFC 7231, sekcja 6.3.6: 205 Reset Content, gdy wysyła odpowiedź 204 No Content lub 205 Reset Content do Apigee Edge. Oznacza to, że serwer backendu NIE MOŻE wysyłać tych elementów w ramach odpowiedzi 204 No Content lub 205 Reset Content:

  1. Treść ładunku odpowiedzi
  2. I dowolny z tych nagłówków:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

Specyfikacja

Apigee Edge odpowiada kodem stanu 502 Bad Gateway i kodem błędu protocol.http.ResponseWithBody jeśli serwer backendu wysyła odpowiedź 204 No Content lub 205 Reset Content ale nie przestrzega tych specyfikacji RFC:

Specyfikacja
RFC 7231, sekcja 6.3.5: 204 No Content
RFC 7231, sekcja 6.3.6: 205 Reset Content

Ważne uwagi

Zalecamy naprawienie serwera backendu, aby wysyłał kod stanu 204 No Content i 205 Reset Content bez treści odpowiedzi i bez żadnego z tych nagłówków: Content-Length, Content-Encoding i Transfer-Encoding, oraz aby przestrzegał specyfikacji RFC 7231, sekcja 6.3.5: 204 No Content i RFC 7231, sekcja 6.3.6: 205 Reset Content.

Jeśli nadal potrzebujesz pomocy zespołu pomocy Apigee, zapoznaj się z sekcją 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 środowiska
  • Pakiet proxy interfejsu API
  • Plik śledzenia żądań do interfejsu API
  • 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 komunikatów /opt/apigee/var/log/edge-message-processor/logs/system.log