504 – limit czasu bramy – przekroczenie limitu czasu routera

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Krótki opis problemu

W odpowiedzi na wywołania interfejsu API aplikacja kliencka otrzymuje kod stanu HTTP 504 z komunikatem Gateway Timeout.

Ten komunikat o błędzie oznacza, że klient nie otrzymał w odpowiednim czasie odpowiedzi z Apigee Edge lub serwera backendu podczas wykonywania wywołania interfejsu API.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 504 Gateway Time-out

Podczas wywoływania takiego serwera proxy za pomocą cURL lub przeglądarki internetowej może pojawić się ten błąd:

<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
</body>
</html>

Co powoduje przekroczenie limitu czasu?

Typowa ścieżka żądania do interfejsu API przez platformę Edge to Klient > Router > Procesor komunikatów > Serwer backendu, jak pokazano na tym rysunku:

Wszystkie komponenty środowiska wykonawczego Apigee Edge, w tym klienci, routery, procesory wiadomości i serwery backendu, są skonfigurowane z odpowiednimi domyślnymi wartościami limitu czasu, aby zapewnić, że żądania API nie będą zbyt długo przetwarzane. Jeśli którykolwiek z komponentów w przepływie nie otrzyma odpowiedzi z komponentu nadrzędnego w okresie określonym w konfiguracji czasu oczekiwania, nastąpi przekroczenie czasu oczekiwania i zwykle zostanie zwrócony 504 Gateway Timeoutbłąd.

Ten scenariusz zawiera informacje o tym, jak rozwiązać problem z błędem 504 spowodowanym przekroczeniem limitu czasu przez router.

Przekroczony czas oczekiwania na routerze

Domyślny czas oczekiwania skonfigurowany na routerach w Apigee Edge to 57 sekund. Jest to maksymalny czas, przez jaki proxy interfejsu API może się wykonywać od momentu otrzymania żądania do interfejsu API przez Edge do momentu odesłania odpowiedzi, w tym odpowiedzi backendu i wszystkich wykonywanych zasad. Domyślny limit czasu można zastąpić na routerach lub hostach wirtualnych, jak opisano w artykule Konfigurowanie limitu czasu wejścia/wyjścia na routerach.

Możliwe przyczyny

W Edge typowe przyczyny błędu 504 Gateway Timeout spowodowanego przekroczeniem limitu czasu routera to:

Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
Nieprawidłowa konfiguracja limitu czasu na routerze Dzieje się tak, gdy router jest skonfigurowany z nieprawidłowym okresem limitu czasu wejścia/wyjścia. Użytkownicy publicznej i prywatnej chmury Edge

Typowe etapy diagnostyki

Aby zdiagnozować ten błąd, użyj jednego z tych narzędzi lub technik:

  • Monitorowanie interfejsów API
  • Logi dostępu NGINX

Monitorowanie interfejsów API

Aby zdiagnozować błąd za pomocą monitorowania interfejsu API:

  1. Otwórz stronę Analiza > Monitorowanie interfejsu API > Zbadaj.
  2. Filtruj błędy 5xx i wybierz okres.
  3. Wykreśl Kod stanu na osi Czas.
  4. Kliknij konkretną komórkę z błędami 504, aby wyświetlić więcej szczegółów i zobaczyć logi tych błędów, jak pokazano poniżej:

    Przykład pokazujący błędy 504

  5. W panelu po prawej stronie kliknij Wyświetl logi.

    W oknie Logi o ruchu zwróć uwagę na te szczegóły dotyczące niektórych błędów 504:

    • Żądanie: zawiera metodę żądania i identyfikator URI używane do wykonywania połączeń.
    • Odpowiedź Czas: łączny czas trwania żądania.

    W przykładzie powyżej

    • Żądanie wskazuje na GET /test-timeout.
    • Czas odpowiedzi wynosi 57.001 s. Oznacza to, że router przekroczył limit czasu, zanim procesor komunikatów mógł odpowiedzieć, ponieważ wartość jest bardzo zbliżona do domyślnego limitu czasu wejścia-wyjścia ustawionego na routerze, który wynosi 57 sekund.

    Wszystkie logi możesz też uzyskać za pomocą interfejsu API Monitoring GET logs. Na przykład wysyłając zapytanie do dzienników o wartości org, env, timeRange i status, możesz pobrać wszystkie dzienniki transakcji, w których klient przekroczył limit czasu.

    W przypadku tych 504błędów monitorowanie interfejsu API ustawia wartość proxy na - (not set), dlatego możesz użyć interfejsu API (Logs API), aby uzyskać powiązany serwer proxy dla hosta wirtualnego i ścieżki.

    Na przykład:

    curl "https://apimonitoring.enterprise.apigee.com/logs/apiproxies?org=ORG&env=ENV&select=https
    
  6. Sprawdź Czas odpowiedzi, aby uzyskać dodatkowe informacje o błędach 504, i upewnij się, że Czas odpowiedzi jest spójny (wartość limitu czasu wejścia/wyjścia ustawiona na routerze, czyli 57 sekund) we wszystkich błędach 504.

Logi dostępu NGINX

Aby zdiagnozować błąd za pomocą dzienników dostępu NGINX:

  1. Sprawdź logi dostępu serwera NGINX:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Sprawdź, czy w określonym czasie wystąpiły jakieś 504błędy (jeśli problem pojawił się w przeszłości) lub czy nadal występują błędy w przypadku niektórych żądań 504.
  3. Poniżej znajdziesz informacje o niektórych błędach 504:
    • Czas odpowiedzi
    • Identyfikator URI żądania

    W tym przykładzie widzimy te informacje:

    • Czas żądania: 57.001 sekundy. Oznacza to, że router przekroczył limit czasu po 57,001 sekundach.

    • Prośba: GET /test-timeout
    • Alias hosta: myorg-test.apigee.net
  4. Sprawdź, czy czas żądania jest taki sam jak limit czasu wejścia/wyjścia skonfigurowany na routerze lub hoście wirtualnym. Jeśli tak, oznacza to, że router przekroczył limit czasu, zanim procesor komunikatów odpowiedział w tym okresie.

    W przykładzie wpisu logu NGINX powyżej czas żądania wynoszący 57.001 sekundy jest bardzo zbliżony do domyślnego limitu czasu wejścia-wyjścia ustawionego w routerze. Wyraźnie wskazuje to, że router przekroczył limit czasu, zanim procesor wiadomości mógł odpowiedzieć.

  5. Określ proxy interfejsu API, do którego zostało wysłane żądanie, korzystając ze ścieżki podstawowej w polu Żądanie .

Przyczyna: nieprawidłowa konfiguracja limitu czasu na routerze

Diagnostyka

  1. Sprawdź, czy błędy 504 są spowodowane przekroczeniem limitu czasu przez router, zanim procesor komunikatów zdążył odpowiedzieć. Możesz to zrobić, sprawdzając, czy czas odpowiedzi w monitorowaniu interfejsu API lub czas żądania w routerze (oba pola zawierają te same informacje, ale mają różne nazwy) jest taki sam jak limit czasu wejścia/wyjścia skonfigurowany w routerze lub hoście wirtualnym, a pola Źródło błędu, Proxy błędu i Kod błędu mają wartość -. Możesz to sprawdzić za pomocą monitorowania interfejsu API lub dzienników dostępu NGINX, jak opisano w  często wykonywanych czynnościach diagnostycznych.
  2. Sprawdź, czy wartość limitu czasu wejścia/wyjścia skonfigurowana na routerze lub konkretnym hoście wirtualnym jest niższa niż wartość skonfigurowana na procesorze komunikatów lub konkretnym proxy interfejsu API.

    Aby to zrobić, wykonaj czynności opisane w tej sekcji.

Sprawdzanie limitu czasu operacji wejścia/wyjścia na hostach wirtualnych

Interfejs Edge

Aby sprawdzić limit czasu hosta wirtualnego za pomocą interfejsu Edge:

  1. Zaloguj się w interfejsie Edge.
  2. Kliknij Administracja > Hosty wirtualne.
  3. Wybierz konkretne środowisko, w którym występuje problem z przekroczeniem limitu czasu.
  4. Wybierz konkretny host wirtualny, dla którego chcesz sprawdzić wartość limitu czasu operacji wejścia/wyjścia.
  5. W sekcji Usługi sprawdź wartość Limit czasu odczytu proxy w sekundach.

    W powyższym przykładzie limit czasu odczytu serwera proxy ma wartość 120. Oznacza to, że limit czasu wejścia/wyjścia skonfigurowany na tym hoście wirtualnym wynosi 120 sekund.

Interfejsy API do zarządzania

Możesz też sprawdzić limit czasu odczytu proxy za pomocą tych interfejsów API do zarządzania:

  1. Wykonaj wywołanie interfejsu API Pobierz hosta wirtualnego, aby uzyskać konfigurację virtualhost, jak pokazano poniżej:

    Użytkownik chmury publicznej

    curl -v -X GET https://api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Użytkownik chmury Private Cloud

    curl -v -X GET http://MANAGEMENT_SERVER_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/v/virtualhosts/VIRTUALHOST_NAME -u USERNAME
    

    Gdzie:

    ORGANIZATION_NAME to nazwa organizacji.

    ENVIRONMENT_NAME to nazwa środowiska

    VIRTUALHOST_NAME to nazwa hosta wirtualnego.

  2. Sprawdź wartość skonfigurowaną dla właściwości proxy_read_timeout.

    Przykładowa definicja hosta wirtualnego

    {
      "hostAliases": [
        "api.myCompany,com",
      ],
      "interfaces": [],
      "listenOptions": [],
      "name": "secure",
      "port": "443",
      "retryOptions": [],
      "properties": {
        "property": [
          {
            "name": "proxy_read_timeout",
            "value": "120"
          }
        ]
      },
      "sSLInfo": {
        "ciphers": [],
        "clientAuthEnabled": "false",
        "enabled": "true",
        "ignoreValidationErrors": false,
        "keyAlias": "myCompanyKeyAlias",
        "keyStore": "ref://myCompanyKeystoreref",
        "protocols": []
      },
      "useBuiltInFreeTrialCert": false
    }

    W przykładzie powyżej parametr proxy_read_timeout ma wartość 120. Oznacza to, że limit czasu wejścia/wyjścia skonfigurowany na tym hoście wirtualnym wynosi 120 sekund.

Sprawdzanie limitu czasu wejścia/wyjścia w pliku router.properties

  1. Zaloguj się na komputerze z routerem.
  2. Wyszukaj właściwość proxy_read_timeout w katalogu /opt/nginx/conf.d i sprawdź, czy ma ona nową wartość:
    grep -ri "proxy_read_timeout" /opt/nginx/conf.d
    
  3. Sprawdź wartość ustawioną dla właściwości proxy_read_timeout w konkretnym pliku konfiguracji hosta wirtualnego.

    Przykładowy wynik polecenia grep

    /opt/nginx/conf.d/0-default.conf:proxy_read_timeout 57;
    /opt/nginx/conf.d/0-edge-health.conf:proxy_read_timeout 1s;

    W przykładzie powyżej zwróć uwagę, że właściwość proxy_read_timeout została ustawiona na nową wartość 57 w pliku 0-default.conf, który jest plikiem konfiguracyjnym domyślnego hosta wirtualnego. Oznacza to, że limit czasu wejścia/wyjścia jest skonfigurowany na 57 sekund na routerze dla domyślnego hosta wirtualnego. Jeśli masz wiele hostów wirtualnych, zobaczysz te informacje dla każdego z nich. Uzyskaj wartość proxy_read_timeout dla konkretnego hosta wirtualnego, którego używasz do wywoływania interfejsu API, które zakończyły się niepowodzeniem z błędami 504.

Weryfikowanie limitu czasu wejścia/wyjścia w proxy interfejsu API

Limit czasu operacji wejścia/wyjścia możesz sprawdzić w tych miejscach:

  • Docelowy punkt końcowy proxy interfejsu API
  • Zasady ServiceCallout serwera proxy interfejsu API
Wyświetlanie limitu czasu wejścia/wyjścia w docelowym punkcie końcowym proxy interfejsu API
  1. W interfejsie Edge wybierz konkretny serwer proxy interfejsu API, w którym chcesz wyświetlić wartość limitu czasu wejścia/wyjścia.
  2. Wybierz konkretny docelowy punkt końcowy, który chcesz sprawdzić.
  3. W konfiguracji TargetEndpoint w elemencie <HTTPTargetConnection> znajdź właściwość io.timeout.millis z odpowiednią wartością.

    Na przykład limit czasu operacji wejścia/wyjścia w tym kodzie jest ustawiony na 120 sekund:

    <Properties>
      <Property name="io.timeout.millis">120000</Property>
    </Properties>
Wyświetlanie limitu czasu wejścia/wyjścia w zasadach ServiceCallout serwera proxy interfejsu API
  1. W interfejsie Edge wybierz konkretny serwer proxy interfejsu API, w którym chcesz wyświetlić nową wartość limitu czasu wejścia/wyjścia w przypadku zasady ServiceCallout.
  2. Wybierz konkretne zasady ServiceCallout, które chcesz sprawdzić.
  3. W konfiguracji <ServiceCallout> znajdź element <Timeout> z odpowiednią wartością.

    Na przykład limit czasu operacji wejścia/wyjścia w przypadku poniższego kodu wyniesie 120 sekund:

    <Timeout>120000</Timeout>

Weryfikowanie limitu czasu wejścia/wyjścia na procesorach wiadomości

  1. Zaloguj się na komputerze z procesorem komunikatów.
  2. Wyszukaj właściwość HTTPTransport.io.timeout.millis w katalogu /opt/apigee/edge-message-processor/conf za pomocą tego polecenia:

    grep -ri "HTTPTransport.io.timeout.millis" /opt/apigee/edge-message-processor/conf
    

    Przykładowe dane wyjściowe

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPTransport.io.timeout.millis=55000
  3. W przykładzie danych wyjściowych powyżej zwróć uwagę, że właściwość HTTPTransport.io.timeout.millis ma wartość 55000 w http.properties. Oznacza to, że limit czasu wejścia/wyjścia został prawidłowo skonfigurowany na 55 sekund w procesorze komunikatów.

Po określeniu limitu czasu skonfigurowanego na routerze i procesorze komunikatów sprawdź, czy router lub host wirtualny ma skonfigurowaną niższą wartość limitu czasu niż procesor komunikatów lub proxy interfejsu API.

Zanotuj wartości ustawione we wszystkich warstwach, jak pokazano w tabeli poniżej:

Limit czasu na routerze (sekundy) Limit czasu na hoście wirtualnym (w sekundach) Limit czasu oczekiwania na procesor komunikatów (sekundy) Limit czasu proxy interfejsu API (sekundy)
57 - 55 120

W tym przykładzie

  • Na routerze skonfigurowano domyślną wartość 57 sekund.
  • Wartość limitu czasu nie jest ustawiona w konkretnym hoście wirtualnym. Oznacza to, że będzie używać wartości domyślnej 57 sekund skonfigurowanej na samym routerze.
  • W procesorze komunikatów skonfigurowano wartość domyślną 55 sekund.
  • Jednak w przypadku konkretnego proxy interfejsu API skonfigurowano wartość 120 sekund.

Pamiętaj, że wyższa wartość limitu czasu jest skonfigurowana tylko w przypadku proxy interfejsu API, ale router nadal ma skonfigurowany limit 57 sekund. Dlatego router przekracza limit czasu po 57 sekundach, podczas gdy procesor wiadomości lub backend nadal przetwarza Twoją prośbę. W takim przypadku router odpowiada aplikacji klienckiej błędem 504 Gateway Timeout.

Rozdzielczość

Aby rozwiązać ten problem, wykonaj te czynności, aby skonfigurować odpowiedni limit czasu wejścia/wyjścia na routerze i procesorze wiadomości.

  1. Aby dowiedzieć się, jakie wartości limitu czasu należy ustawić w różnych komponentach biorących udział w przepływie żądania do interfejsu API przez Apigee Edge, zapoznaj się z  sprawdzonymi metodami konfigurowania limitu czasu wejścia/wyjścia.
  2. W powyższym przykładzie, jeśli stwierdzisz, że należy ustawić wyższą wartość limitu czasu, ponieważ serwer backendu wymaga więcej czasu, i zwiększysz wartość limitu czasu procesora komunikatów do 120 sekund, ustaw wyższą wartość limitu czasu, np. 123 seconds, na routerze. Aby uniknąć wpływu nowego limitu czasu na wszystkie serwery proxy interfejsu API, ustaw wartość 123 seconds tylko na konkretnym hoście wirtualnym używanym w danym serwerze proxy interfejsu API.
  3. Aby ustawić limit czasu na hoście wirtualnym, postępuj zgodnie z instrukcjami w artykule Konfigurowanie limitu czasu wejścia/wyjścia na routerach.