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:
- Zaloguj się w interfejsie Apigee Edge jako użytkownik z odpowiednią rolą.
Przełącz się na organizację, w której chcesz zbadać problem.
- Otwórz stronę Analiza > Monitorowanie interfejsów API > Zbadaj.
- Wybierz przedział czasu, w którym zaobserwowano błędy.
- Upewnij się, że filtr Serwer proxy jest ustawiony na wartość Wszystkie.
- Porównaj kod błędu z czasem.
Wybierz komórkę z kodem błędu
protocol.http.DuplicateHeader
, jak pokazano poniżej:Informacje o kodzie błędu
protocol.http.DuplicateHeader
są wyświetlane jak poniżej:- Sprawdź, czy kod stanu ma wartość
502
, jak pokazano w powyższym przykładzie. - Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
W oknie Logi zwróć uwagę na te informacje:
- Kod stanu:
502
- Źródło błędu:
target
- Kod błędu:
protocol.http.DuplicateHeader
.
- Kod stanu:
- Ź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:
- Włącz sesję śledzenia i
- Poczekaj na wystąpienie błędu
502 Bad Gateway
lub - Jeśli możesz odtworzyć problem, wykonaj wywołanie interfejsu API i odtwórz błąd
502 Bad Gateway
- Poczekaj na wystąpienie błędu
Sprawdź, czy włączona jest opcja Pokaż wszystkie informacje o procesie:
- Wybierz 1 z nieudanych żądań i sprawdź log czasu.
- Przejdź przez różne fazy śledzenia i znajdź miejsce błędu.
Błąd pojawia się zwykle w przepływie po fazie żądania wysłanego do serwera docelowego, jak pokazano poniżej:
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łówekExpires
więcej niż raz.- Przejdź do fazy AX (rejestrowane dane Analytics) w śledzeniu i kliknij ją.
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:
- Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source jako
protocol.http.DuplicateHeader
oraztarget
, co oznacza, że ten błąd jest spowodowany tym, że serwer backendu przekazał zduplikowane nagłówki dla nagłówka odpowiedziExpires
.Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
Sprawdź, czy używasz łańcucha proxy, czyli czy serwer docelowy lub punkt końcowy wywołuje w Apigee inny serwer proxy.
Aby to sprawdzić, wróć do fazy Żądanie wysłane do serwera docelowego. Kliknij Pokaż zakręty.
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.
- 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
. - 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:
- 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
. 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.
- 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 z502
. 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
- 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.
- Jeśli źródło błędu ma wartość
target
, oznacza to, że odpowiedź wysłana przez serwer docelowy zawiera zduplikowane nagłówki. 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:
Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z dokumentem
faultstring
. Polefaultstring
zawiera nazwę nagłówka, która została wysłana więcej niż raz.Przykładowy komunikat o błędzie:
"faultstring":"Duplicate Header \"Expires\""
- W powyższym komunikacie o błędzie możesz zobaczyć, że nagłówek
Expires
został wysłany więcej niż raz, tak jak w interfejsiefaultstring
.
Rzeczywista prośba
Użycie rzeczywistego żądania:
- 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. Jeśli masz dostęp do rzeczywistego żądania wysłanego do aplikacji serwera docelowego, wykonaj te czynności:
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
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łąd502 Bad Gateway
i kod błędu:protocol.http.DuplicateHeader
.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łówekExpires
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
- 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. - 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łówekExpires
tylko raz. - 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
- 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. - 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łędu502
- 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