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:
- 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 konkretny przedział czasu, w którym wystąpiły błędy.
- Upewnij się, że filtr Proxy jest ustawiony na Wszystkie.
- Wykreśl Kod błędu względem Czasu.
Wybierz komórkę z kodem błędu
protocol.http.DuplicateHeaderjak pokazano poniżej:
Informacje o kodzie błędu
protocol.http.DuplicateHeadersą wyświetlane jak poniżej:
- Upewnij się, że Kod stanu to
502, jak pokazano w powyższym przykładzie. - Kliknij Wyświetl logi i rozwiń wiersz nieudanego żądania.
W oknie Logi zanotuj te informacje:
- Kod stanu:
502 - Źródło błędu:
target - Kod błędu:
protocol.http.DuplicateHeader.
- Kod stanu:
- Ź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:
- Włącz sesję ś0}ledzenia i
- poczekaj na wystąpienie błędu
502 Bad Gatewaylub - jeśli możesz odtworzyć problem, wywołaj interfejs API i odtwórz błąd
502 Bad Gateway
- poczekaj na wystąpienie błędu
Upewnij się, że opcja Pokaż wszystkie informacje o przepływie jest włączona:

- Wybierz jedno z nieudanych żądań i sprawdź ślad.
- Przejdź przez różne etapy śledzenia i znajdź miejsce, w którym wystąpił błąd.
Błąd zwykle występuje w przepływie po etapie Żądanie wysłane do serwera docelowego , jak pokazano poniżej:

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łówekExpireswięcej niż raz.- W śladzie otwórz etap AX (Zapisane dane analityczne) i kliknij go.
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:

- Zobaczysz wartości X-Apigee-fault-code i X-Apigee-fault-source
jako
protocol.http.DuplicateHeaderitarget, co oznacza, że ten błąd jest spowodowany tym, że serwer backendu przekazał zduplikowane nagłówki w nagłówku odpowiedziExpires.Nagłówki odpowiedzi Wartość X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target Sprawdź, czy używasz łańcucha proxy; czyli czy serwer docelowy lub punkt końcowy docelowy wywołuje inny serwer proxy w Apigee.
Aby to sprawdzić, wróć do etapu Żądanie wysłane do serwera docelowego. Kliknij Pokaż Curl.
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.
- 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. - 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:
- 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. Sprawdź logi dostępu NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logGdzie: ORG, ENV i PORT# są zastępowane rzeczywistymi wartościami.
- 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 kodem502. Jeśli znajdziesz błędy
502z X-Apigee-fault-code pasującym do wartościprotocol.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.DuplicateHeaderX-Apigee-fault-source target
Przyczyna: zduplikowany nagłówek w odpowiedzi
Diagnostyka
- 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.
- Jeśli Źródło błędu ma wartość
target, oznacza to, że odpowiedź wysłana przez serwer docelowy zawiera zduplikowane nagłówki. 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:
Jeśli masz dostęp do pełnego komunikatu o błędzie otrzymanego z Apigee Edge, zapoznaj się z elementem
faultstring. Elementfaultstringzawiera nazwę nagłówka, który został wysłany więcej niż raz.Przykładowy komunikat o błędzie:
"faultstring":"Duplicate Header \"Expires\""
- W powyższym komunikacie o błędzie widać, że nagłówek
Expiresjest wysyłany więcej niż raz, co widać wfaultstring.
Rzeczywiste żądanie
Używanie rzeczywistego żądania:
- Jeśli nie masz dostępu do rzeczywistego żądania wysłanego do serwera docelowego, pobierz
odpowiednie
curlpolecenie z sekcji Używanie narzędzia Trace krok 10.a i krok 10.b. Jeśli masz dostęp do rzeczywistego żądania wysłanego do aplikacji serwera docelowego, wykonaj te czynności:
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
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
Expiresjest wysyłany więcej niż raz. Dlatego to żądanie kończy się niepowodzeniem z błędem502 Bad Gatewayi kodem błęduprotocol.http.DuplicateHeader.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łówekExpiresjest wysyłany więcej niż raz.
Rozdzielczość
Naprawianie duplikatów
Opcja 1. [Zalecana] Popraw serwer backendu, aby nie zawierał zduplikowanych nagłówków
- Przeanalizuj przyczynę, dla której konkretny serwer backendu wysyła zduplikowany nagłówek
Expiresi 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. - 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
Expiresjest 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łówekExpirestylko raz. - 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
- 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. - 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
curlużyte do odtworzenia błędu502 - 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_logGdzie: 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