502 Nieprawidłowa brama – HeaderHeader

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

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 502 Bad Gateway

Możesz też zobaczyć 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, gdy konkretny nagłówek HTTP, który nie może mieć duplikatów w Apigee Edge, pojawia się więcej niż raz z takimi samymi lub różnymi wartościami w odpowiedzi HTTP wysłanej przez serwer backendu do Apigee Edge.

Zgodnie z sekcją 3.2.2 specyfikacji pólRFC 7230: nadawca NIE MOŻE generować wielu pól nagłówka z tą samą nazwą pola w wiadomości, chyba że cała wartość danego pola jest zdefiniowana jako lista rozdzielana przecinkami, [np. #(values)] lub pole nagłówka jest dobrze znanym wyjątkiem. Jeśli Apigee Edge wykryje, że ten sam nagłówek, który nie może mieć duplikatów, zostanie wysłany więcej niż raz w odpowiedzi HTTP wysłanej przez serwer docelowy/backendowy, w odpowiedzi wyświetli 502 Bad Gateway i kod błędu protocol.http.DuplicateHeader

Oto możliwe przyczyny tego błędu:

Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
Zduplikowany nagłówek w odpowiedzi Odpowiedź z serwera backendu zawiera zduplikowane nagłówki. 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. Upewnij się, że filtr Serwer proxy jest ustawiony na wartość Wszystkie.
  6. Porównaj kod błędu z czasem.
  7. Wybierz komórkę z kodem błędu protocol.http.DuplicateHeader, jak pokazano poniżej:

    (zobacz większy obraz)

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

    (zobacz większy obraz)

  9. Sprawdź, czy kod stanu ma wartość 502, jak pokazano w powyższym przykładzie.
  10. Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
  11. W oknie Logi zwróć uwagę na te informacje:

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

Narzędzie do śledzenia

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

  1. Włącz sesję śledzenia i
    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 włączona jest opcja Pokaż wszystkie informacje o procesie:

  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 pojawia się zwykle w przepływie po fazie żądania wysłanego do serwera docelowego, jak pokazano poniżej:

    (zobacz większy obraz)

  6. Zapisz wartość błędu ze śledzenia.

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

  7. Przejdź do fazy AX (rejestrowane dane Analytics) w śledzeniu i kliknij ją.
  8. Przewiń w dół do sekcji Szczegóły fazy – nagłówki odpowiedzi i określ wartości pól X-Apigee-fault-code oraz X-Apigee-fault-source, jak pokazano poniżej:

    (zobacz większy obraz)

  9. Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source jako protocol.http.DuplicateHeader oraz target, co oznacza, że ten błąd jest spowodowany tym, że serwer backendu przekazał zduplikowane nagłówki dla nagłówka 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 wywołuje w Apigee inny serwer proxy.

    1. Aby to sprawdzić, wróć do fazy Żądanie wysłane do serwera docelowego. Kliknij Pokaż zakręty.

    2. Otworzy się okno Curl for Request Sent to Target Server (Curl na żądanie wysłane 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, jest to łańcuch serwerów proxy. W tym przypadku musisz powtórzyć wszystkie powyższe kroki dla połączonego serwera proxy, aż ustalisz, co faktycznie powoduje błąd 502 Bad Gateway.
    4. Jeśli alias hosta serwera docelowego wskazuje Twój serwer backendu, oznacza to, że serwer backendu wysyła zduplikowane nagłówki w odpowiedzi do Apigee.

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 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 w danym okresie (jeśli problem występował w przeszłości) lub czy są jakieś żądania, które nadal kończą się niepowodzeniem z 502.
  4. 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 .

    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.DuplicateHeader
    X-Apigee-fault-source target

Przyczyna: zduplikowany nagłówek w odpowiedzi

Diagnostyka

  1. Znajdź kod błędu i źródło błędu dla błędu zaobserwowanego w logach dostępu API Monitoring lub NGINX zgodnie z opisem w częstych krokach diagnostyki.
  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. Faktyczny nagłówek, który jest wysyłany więcej niż raz w odpowiedzi, możesz ustalić, korzystając z jednej z tych metod:

    Komunikat o błędzie

    Korzystanie z komunikatu o błędzie:

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

      Przykładowy komunikat o błędzie:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. W powyższym komunikacie o błędzie możesz zobaczyć, że nagłówek Expires został wysłany więcej niż raz, tak jak w interfejsie faultstring.

    Rzeczywista prośba

    Użycie rzeczywistego żądania:

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

      1. Wyślij wywołanie do serwera docelowego.

        Przykładowe żądanie dotyczące 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żyta 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 tym przykładowym żądaniu nagłówek Expires jest wysyłany więcej niż raz. Dlatego żądanie się nie powiedzie – wyświetli się błąd 502 Bad Gateway i kod błędu: protocol.http.DuplicateHeader.

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

Rozdzielczość

Napraw duplikowanie

Opcja nr 1 [zalecana opcja] Napraw serwer backendu, aby nie dodawać zduplikowanych nagłówków

  1. Przeanalizuj, dlaczego dany serwer backendu ma wysłać zduplikowany nagłówek Expires, i sprawdź, czy serwery proxy interfejsu API mogą to zaakceptować. W większości przypadków nie będzie to pożądane zgodnie ze specyfikacją HTTP RFC7230.
  2. Jeśli nie chcesz, zmodyfikuj aplikację serwera docelowego tak, by nie wysyłała zduplikowanych nagłówków. W podanym wyżej przykładzie zauważyliśmy, że nagłówek Expires jest wysyłany dwukrotnie z tą samą wartością, co nie jest pożądane. Aby rozwiązać ten problem, sprawdź, czy serwer docelowy przekazuje nagłówek Expires tylko raz.
  3. Jeśli chcesz, aby zduplikowane nagłówki zostały zaakceptowane, przejdź do opcji nr 2 korzystania z właściwości CwC.

CwC

Opcja 2. Użycie 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 interfejsów API w Apigee Edge.

Usługa CwC Wartości
HTTPHeader.<HeaderName> allowDuplicates,multivalued

Na przykład tę właściwość można ustawić w jednostkach przetwarzania wiadomości, aby zezwolić na duplikowanie nagłówka Expires i wiele wartości.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. Jeśli jesteś użytkownikiem Private Cloud, możesz skonfigurować właściwość tak, aby uniemożliwić Apigee Edge zgłaszanie błędu 502 Bad Gateway, nawet jeśli żądanie zawiera zduplikowane nagłówki, zgodnie z instrukcjami konfigurowania procesorów wiadomości w celu 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ść dla swojej organizacji.

Specyfikacja

Apigee w odpowiedzi wysyła odpowiedź o błędzie 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: Pola nagłówka

Jeśli nadal będziesz potrzebować pomocy zespołu pomocy Apigee, przejdź do artykułu Musisz zebrać informacje diagnostyczne.

Musisz zebrać informacje diagnostyczne

Zbierz poniższe 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 interfejsu 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.

  • Logi systemowe procesora wiadomości /opt/apigee/var/log/edge-message-processor/logs/system.log