502 Nieprawidłowa brama – ResponseWithBody

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.ResponseWithBody.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 502 Bad Gateway

Oprócz tego 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 ma postać 204 No Content albo 205 Reset Content, ale zawiera treść odpowiedzi lub co najmniej jeden z tych nagłówków:

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

Zgodnie ze specyfikacją RFC 7231, sekcja 6.3.5: 204 Brak zawartości oraz RFC 7231, sekcja 6.3.6: 205 Resetowanie treści, oczekuje się, że z serwera pierwotnego nie powinny być wysyłane żadne dodatkowe treści z kodem stanu 204 No Content lub 205 Reset Content. Nagłówki odpowiedzi, np. Content-Length, Content-Encoding lub Transfer-Encoding, wskazują rozmiar, typ lub format ładunku odpowiedzi.

Dlatego Apigee Edge zwraca klientowi kod stanu 502 Bad Gateway z kodem błędu protocol.http.ResponseWithBody w tych sytuacjach:

Kod stanu z serwera backendu
Odpowiedź z serwera backendu zawiera 204 Brak treści 205 Resetuj zawartość
Treść odpowiedzi BŁĄD BŁĄD

Content-Length nagłówek

(ustaw wartość inną niż 0)

BŁĄD BŁĄD

Content-Encoding

(ustaw 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 dotyczące
Treść lub nagłówki odpowiedzi z odpowiedzią 204 z serwera backendu Serwer backendu wysyła odpowiedź 204 No Content lub 205 Reset Content z treścią odpowiedzi lub z nagłówkami Content-Type, Content-Encoding lub Transfer-Encoding. 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:

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

  3. Otwórz stronę Analiza > Monitorowanie interfejsów API > Zbadaj.
  4. Wybierz przedział czasu, w którym zaobserwowano błędy.
  5. Porównaj kod błędu z czasem.
  6. Wybierz komórkę z kodem błędu protocol.http.ResponseWithBody, jak pokazano poniżej:

    ( wyświetl większy obraz)

  7. Informacje o kodzie błędu protocol.http.ResponseWithBody wyświetlą się poniżej:

    ( wyświetl większy obraz)

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

    ( wyświetl większy obraz)

  9. W oknie Logi zwróć uwagę na 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 do śledzenia

Aby zdiagnozować błąd za pomocą narzędzia do śledzenia:

  1. Włącz sesję śledzenia i wykonaj jedną z tych czynności:
    1. Poczekaj na wystąpienie błędu 502 Bad Gateway lub
    2. Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API i odtwórz błąd 502 Bad Gateway.
  2. Sprawdź, czy opcja Show all FlowInfos (Pokaż wszystkie informacje) jest włączona:

  3. Wybierz 1 z nieudanych żądań i sprawdź log czasu.
  4. Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
  5. Błąd występuje zwykle w sekcji Błąd flowinfo tuż po etapie Żą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.

    Zapisz te wartości ze logu czasu:

    • błąd: 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, który zawiera treść odpowiedzi lub jeden z nagłówków wymienionych w możliwych przyczynach.

    Zapisz te wartości ze logu czasu:

    • błąd: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. Przejdź do etapu AX (rejestrowane dane Analytics) w logu czasu i kliknij go.
  7. Przewiń w dół do sekcji Szczegóły fazy i Nagłówki błędów i określ wartości w polach X-Apigee-fault-code oraz X-Apigee-fault-source, jak pokazano poniżej:

    ( wyświetl większy obraz)

  8. Zwróć uwagę na wartości odpowiednio X-Apigee-fault-code i X-Apigee-fault-source are protocol.http.ResponseWithBody oraz target. Oznacza to, że wystąpił błąd, 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 możliwych przyczynach.
    Błąd Wartość
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

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 do określenia kluczowych informacji o HTTP 502 Bad Gateway.
  2. 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.

  3. Sprawdź, czy występują jakieś błędy 502 z kodem błędu protocol.http.ResponseWithBody w danym czasie (jeśli problem wystąpił w przeszłości) lub czy są nadal jakieś żądania, które kończą się niepowodzeniem z 502.
  4. Jeśli znajdziesz błędy 502 z kodem X-Apigee-fault-code zgodnym z wartością protocol.http.ResponseWithBody, sprawdź wartość źródła błędów X-Apigee.

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

    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.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 wystąpił błąd, 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 możliwych przyczynach.

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

Diagnostyka

  1. Znajdź kod błędu i źródło błędu dla błędu zaobserwowanego przy użyciu logów dostępu API monitorowania, narzędzia do śledzenia lub NGINX zgodnie z opisem w częstych krokach diagnostyki.
  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 faktycznie wysłał treść ładunku odpowiedzi lub co najmniej jeden z nagłówków wymienionych w sekcji Możliwe przyczyny, możesz wykonać te czynności:

    1. Jeśli jesteś użytkownikiem chmury publicznej i możesz wysłać to samo żądanie interfejsu API do serwera backendu bezpośrednio z dowolnego ze swoich systemów.

    2. Jeśli jesteś użytkownikiem Private Cloud, możesz wysłać to samo żądanie interfejsu API do serwera backendu bezpośrednio z jednego z procesorów wiadomości powiązanych z konkretną organizacją i środowiskiem, w którym zaobserwowano błąd.
    3. Sprawdź odpowiedź otrzymaną z serwera backendu i sprawdź, czy zawiera ona treść ładunku odpowiedzi lub co najmniej jeden z wymienionych powyżej nagłówków. Jeśli tak, to jest przyczyną tego błędu.

      Przykład 1

      Przykład 1. Odpowiedź 204 serwera backendu 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ł, wysyłając kod stanu 204 No Content, a kod stanu 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ł, wysyłając kod stanu 204 No Content, a kod stanu 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ł kodem stanu 205 Reset Content z treścią odpowiedzi This is a sample Response.

    4. We wszystkich powyższych przykładach 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.
    5. Dlatego usługa Apigee Edge wysłała kod stanu 502 Bad Gateway z kodem błędu protocol.http.ResponseWithBody.

Rozdzielczość

Podczas wysyłania odpowiedzi 204 No Content lub 205 Reset Content do Apigee Edge serwer backendu musi zawsze przestrzegać specyfikacji RFC 7231, sekcja 6.3.6: 205 Resetuj zawartość. Oznacza to, że serwer backendu NIE MOŻE wysyłać następujących treści w odpowiedzi 204 No Content ani 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 w odpowiedzi wysyła kod stanu 502 Bad Gateway i kod błędu protocol.http.ResponseWithBody, jeśli serwer backendu wysyła odpowiedź 204 No Content lub 205 Reset Content, ale nie jest zgodna z tymi specyfikacjami RFC:

Specyfikacja
RFC 7231, sekcja 6.3.5: 204 Brak treści
RFC 7231, sekcja 6.3.6: 205 Resetuj zawartość

Najważniejsze kwestie

Zalecanym rozwiązaniem jest naprawienie serwera backendu, tak aby wysyłał kod stanu 204 No Content i 205 Reset Content bez treści odpowiedzi oraz nagłówków – Content-Length, Content-Encoding i Transfer-Encoding, oraz przestrzeganie specyfikacji RFC 7231, sekcja 6.3.5: 204 Brak zawartości i RFC 7231, sekcja 6.3.6: 205 Resetuj zawartość.

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
  • Wykonaj 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 środowiska
  • Pakiet proxy API
  • Plik śledzenia żądań 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 wiadomości /opt/apigee/var/log/edge-message-processor/logs/system.log