502 Nieprawidłowa brama – HeaderHeader

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

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 502 Bad Gateway

Może też pojawić się komunikat o błędzie podobny do tego:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

Możliwe przyczyny

Ten błąd występuje, jeśli określony nagłówek HTTP, który nie może mieć duplikatów w Apigee Edge, pojawia się więcej niż raz z tymi samymi lub różnymi wartościami w odpowiedzi HTTP wysyłanej przez serwer backendu do Apigee Edge.

Zgodnie z standardem RFC 7230, sekcją 3.2.2: Field Order, nadawca NIE MOŻE generować w wiadomości wielu pól nagłówka o tej samej nazwie, chyba że cała wartość pola nagłówka jest zdefiniowana jako lista rozdzielona przecinkami [tzn. #(values)] lub pole nagłówka jest a znanym wyjątkiem. Jeśli Apigee Edge stwierdzi, że ten sam nagłówek, który nie może mieć duplikatów, jest wysyłany więcej niż raz w odpowiedzi HTTP wysyłanej przez serwer docelowy lub backendu, odpowie kodem 502 Bad Gateway i kodem błędu protocol.http.DuplicateHeader

Oto możliwe przyczyny tego błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów, których dotyczy
Zduplikowany nagłówek w odpowiedzi Odpowiedź z serwera backendu zawiera zduplikowane nagłówki. Użytkownicy chmury publicznej i prywatnej Edge

Typowe czynności diagnostyczne

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 interfejsów 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 konkretny przedział czasu, w którym wystąpiły błędy.
  5. Upewnij się, że filtr Proxy jest ustawiony na Wszystkie.
  6. Wykreśl Kod błędu względem Czasu.
  7. Wybierz komórkę z kodem błędu protocol.http.DuplicateHeader jak pokazano poniżej:

    (wyświetl większy obraz)

  8. Informacje o kodzie błędu protocol.http.DuplicateHeader są wyświetlane jak poniżej:

    (wyświetl większy obraz)

  9. Upewnij się, że Kod stanu to 502, jak pokazano w powyższym przykładzie.
  10. Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
  11. W oknie Logi zanotuj te informacje:

    • Kod stanu: 502
    • Źródło błędu: target
    • Kod błędu: protocol.http.DuplicateHeader.
  12. Źródło błędu to target, co oznacza, że odpowiedź z serwera backendu zawierała zduplikowane nagłówki.

Narzędzie Trace

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

  1. Włącz sesję ś0}ledzenia i
    1. poczekaj 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. Upewnij się, że opcja Pokaż wszystkie informacje o przepływie jest włączona:

  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. Błąd zwykle występuje w przepływie po etapie Żądanie wysłane do serwera docelowego , jak pokazano poniżej:

    (wyświetl większy obraz)

  6. Zanotuj wartość błędu ze śladu.

    Powyższy przykładowy ślad pokazuje błąd Duplicate Header "Expires". Ponieważ błąd jest zgłaszany przez Apigee po wysłaniu żądania do serwera backendu, oznacza to że serwer backendu wysłał nagłówek Expires więcej niż raz.

  7. W śladzie otwórz etap AX (Zapisane dane analityczne) i kliknij go.
  8. Przewiń w dół do sekcji Szczegóły etapu – nagłówki odpowiedzi i określ wartości X-Apigee-fault-code i X-Apigee-fault-source , jak pokazano poniżej:

    (wyświetl większy obraz)

  9. Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source jako protocol.http.DuplicateHeader i target, co oznacza, że ten błąd jest spowodowany tym, że serwer backendu przekazał zduplikowane nagłówki w nagłówku odpowiedzi Expires.
    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. Sprawdź, czy używasz łańcucha proxy; czyli czy serwer docelowy lub punkt końcowy docelowy wywołuje inny serwer proxy w Apigee.

    1. Aby to sprawdzić, wróć do etapu Żądanie wysłane do serwera docelowego. Kliknij Pokaż Curl.

    2. Otworzy się okno Curl for Request Sent to Target Server (Curl dla żądania wysłanego do serwera docelowego), w którym możesz określić alias hosta serwera docelowego.

    3. Jeśli alias hosta serwera docelowego wskazuje alias hosta wirtualnego, oznacza to łańcuch proxy. W takim przypadku musisz powtórzyć wszystkie powyższe czynności w przypadku połączonego serwera proxy, aż ustalisz, co faktycznie powoduje błąd 502 Bad Gateway.
    4. Jeśli alias hosta serwera docelowego wskazuje serwer backendu, oznacza to, że serwer backendu wysyła zduplikowane nagłówki w odpowiedzi do Apigee.

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łędach HTTP 502.
  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 występują błędy 502 (jeśli problem wystąpił w przeszłości) 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.DuplicateHeader, wtedy 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 dla X- Apigee-fault-code i X-Apigee-fault-source:

    Nagłówki odpowiedzi Wartość
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

Przyczyna: zduplikowany nagłówek w odpowiedzi

Diagnostyka

  1. Określ Kod błędu i Źródło błędu zaobserwowanego błędu za pomocą monitorowania interfejsów API lub logów dostępu NGINX, jak opisano w sekcji Typowe czynności diagnostyczne.
  2. Jeśli Źródło błędu ma wartość target, oznacza to, że odpowiedź wysłana przez serwer docelowy zawiera zduplikowane nagłówki.
  3. Rzeczywisty nagłówek, który jest wysyłany więcej niż raz w ramach odpowiedzi możesz określić za pomocą jednej z tych metod:

    Komunikat o błędzie

    Używanie komunikatu o błędzie:

    1. Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z elementem faultstring. Element faultstring zawiera nazwę nagłówka, który został wysłany więcej niż raz.

      Przykładowy komunikat o błędzie:

      "faultstring":"Duplicate Header \"Expires\""
    2. W powyższym komunikacie o błędzie widać, że nagłówek Expires jest wysyłany więcej niż raz, co widać w faultstring.

    Rzeczywiste żądanie

    Używanie rzeczywistego żądania:

    1. Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego, pobierz odpowiednie curl polecenie z sekcji Używanie narzędzia Trace krok 10.a i krok 10.b.
    2. Jeśli masz dostęp do rzeczywistego żądania wysłanego do aplikacji serwera docelowego, wykonaj te czynności:

      1. Wywołaj serwer docelowy.

        Przykładowe żądanie do serwera docelowego użytego w tym przykładzie:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. Sprawdź listę nagłówków widocznych w odpowiedzi.

        Przykładowa odpowiedź z serwera docelowego użytego w tym przykładzie:

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0

        W powyższym przykładowym żądaniu nagłówek Expires jest wysyłany więcej niż raz. Dlatego to żądanie kończy się niepowodzeniem z błędem 502 Bad Gateway i kodem błędu protocol.http.DuplicateHeader.

      3. Jeśli nagłówek, którego nazwa pojawia się w faultstring, występuje więcej niż raz w odpowiedzi serwera backendu, jest to przyczyna tego błędu. W powyższym przypadku nagłówek Expires jest wysyłany więcej niż raz.

Rozdzielczość

Naprawianie duplikatów

Opcja 1. [Zalecana] Popraw serwer backendu, aby nie zawierał zduplikowanych nagłówków

  1. Przeanalizuj przyczynę, dla której konkretny serwer backendu wysyła zduplikowany nagłówek Expires i sprawdź, czy serwery proxy interfejsu API mogą go akceptować. W większości przypadków nie będzie to pożądane zgodnie ze specyfikacją HTTP RFC7230.
  2. Jeśli nie jest to pożądane, zmodyfikuj aplikację serwera docelowego, aby nie wysyłała zduplikowanych nagłówków. W omówionym powyżej przykładzie zauważono, że nagłówek Expires jest wysyłany 2 razy z tą samą wartością, co jest niepożądane. Problem możesz rozwiązać, upewniając się że serwer docelowy przekazuje nagłówek Expires tylko raz.
  3. Jeśli jest to pożądane i chcesz zezwolić na zduplikowane nagłówki, przejdź do opcji 2. Używanie właściwości CwC.

CwC

Opcja 2. Używanie właściwości CwC

Apigee udostępnia właściwość CwC HTTPHeader.<HeaderName> ,która umożliwia aplikacjom klienckim i serwerom docelowym wysyłanie zduplikowanych nagłówków do serwerów proxy interfejsu API w Apigee Edge.

Właściwość CwC Wartości
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Na przykład tę właściwość można ustawić w procesorach komunikatów, aby zezwolić na duplikaty i wiele wartości w nagłówku Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Jeśli jesteś użytkownikiem chmury prywatnej, możesz skonfigurować tę właściwość, aby uniemożliwić Apigee Edge zgłaszanie błędu 502 Bad Gateway, nawet jeśli żądanie zawiera zduplikowane nagłówki. Aby to zrobić, skorzystaj z instrukcji Konfigurowanie procesorów komunikatów do używania zduplikowanych nagłówków.
  2. Jeśli jesteś użytkownikiem chmury publicznej, skontaktuj się z zespołem pomocy Apigee Edge, aby skonfigurować tę właściwość w swojej organizacji.

Specyfikacja

Apigee odpowiada błędem 502 Bad Gateway, ponieważ oczekuje, że serwer backendu będzie działać zgodnie z tymi specyfikacjami RFC:

Specyfikacja
RFC 7230, sekcja 3.2.2: Field Order
RFC 7230, sekcja 3.2: Header Fields

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