404 Wiele hostów wirtualnych z tym samym aliasem hosta

Wyświetlasz dokumentację Apigee Edge.
Przejdź do dokumentacji Apigee X.
info

Krótki opis problemu

Aplikacja kliencka otrzymuje kod stanu HTTP 404 z komunikatem Not Found i komunikatem o błędzie Unable to identify proxy for host: VIRTUAL_HOST and url: PATH w odpowiedzi na wywołania interfejsu API.

Ten błąd oznacza, że Edge nie mógł znaleźć proxy interfejsu API dla określonego hosta wirtualnego i ścieżki.

Komunikat o błędzie

Aplikacja kliencka otrzymuje ten kod odpowiedzi:

HTTP/1.1 404 Not Found

Dodatkowo możesz zobaczyć komunikat o błędzie podobny do tego:

{
   "fault":{
      "faultstring":"Unable to identify proxy for host: default and url: \/oauth2\/token",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.ApplicationNotFound"
      }
   }
}

Możliwe przyczyny

Przyczyna Opis Instrukcje rozwiązywania problemów, których dotyczy
Host wirtualny z duplikatem aliasu hosta Kilka hostów wirtualnych ma ten sam alias hosta i numer portu. Użytkownicy Public Cloud i Private Cloud Edge

Typowe czynności diagnostyczne

Dzienniki NGINX i procesora komunikatów pomogą w rozwiązaniu błędu 404. Aby sprawdzić dzienniki:

  1. Wyświetl dzienniki NGINX za pomocą tego polecenia:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Sprawdź te pola w wpisach dziennika:
    Pole Wartość
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    Zanotuj identyfikator wiadomości z dzienników.

  3. Sprawdź dzienniki procesora komunikatów (/opt/apigee/var/log/edge-message-processor/logs/system.log) aby sprawdzić, czy masz messaging.adaptors.http.flow.ApplicationNotFound w przypadku konkretnego interfejsu API, lub czy masz unikalny identyfikator wiadomości z kroku 2 w przypadku żądania do interfejsu API.

    Przykładowy komunikat o błędzie z dziennika procesora komunikatów

  4. NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST,
    uri:/weather, message Id:null, exception:com.apigee.rest.framework.ResourceNotFoundException{
    code = messaging.adaptors.http.flow.ApplicationNotFound, message = Unable to identify proxy for
    host: vh1 and url: /weather, associated contexts = []}, context:Context@342ea86b
    input=ClientInputChannel(SSLClientChannel[Accepted: Remote:10.123.123.123:8443
    Local:10.135.33.68:62092]@1206954 useCount=1 bytesRead=0 bytesWritten=0 age=1ms
    lastIO=0ms  isOpen=true)

    Powyższy dziennik pokazuje kod błędu i komunikat o błędzie:

    code = messaging.adaptors.http.flow.ApplicationNotFound,
    message = Unable to identify proxy for host: vh1 and url: /weather

Przyczyna: wiele hostów wirtualnych z tym samym aliasem hosta i numerem portu

Routery i procesory komunikatów Apigee Edge używają nagłówka hosta, numeru portu i ścieżek URI do kierowania ruchu do prawidłowego proxy interfejsu API. Niejednoznaczne definicje, takie jak wiele hostów wirtualnych z tym samym aliasem hosta i numerem portu, są udokumentowanym anty-wzorcem i mogą prowadzić do nieoczekiwanych zachowań. Jednym z typowych błędów, które możesz zauważyć, jest błąd 404 z komunikatem Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

Zwykle, jeśli istnieje wiele hostów wirtualnych z tym samym aliasem hosta, występują sporadyczne 404 błędy. Dzieje się tak, ponieważ konkretne proxy interfejsu API może być skonfigurowane do akceptowania żądań tylko na jednym z hostów wirtualnych. Gdy żądania API są kierowane do konkretnego hosta wirtualnego skonfigurowanego w proxy interfejsu API, otrzymasz odpowiedź z informacją o powodzeniu. Gdy jednak żądania API są kierowane do innych hostów wirtualnych, w przypadku których proxy interfejsu API nie jest skonfigurowane do akceptowania żądań, interfejsy API będą zwracać błędy 404.

Postępuj zgodnie z instrukcjami podanymi w artykule 404 Nie udało się zidentyfikować serwera proxy dla hosta <nazwa hosta wirtualnego> i adresu URL <ścieżka> i rozwiąż ten błąd. Jeśli żadna z przyczyn nie powoduje tego błędu, wykonaj te czynności poniżej, aby sprawdzić, czy błędy 404 są spowodowane przez hosty wirtualne z duplikatami aliasów hostów.

Diagnostyka

Aby sprawdzić, czy istnieje wiele hostów wirtualnych z tym samym aliasem hosta lub numerem portu, co powoduje błędy 404:

  • Interfejs Edge
  • Interfejsy API do zarządzania

Interfejs Edge

Postępuj zgodnie z tymi instrukcjami, aby sprawdzić, czy istnieje wiele hostów wirtualnych z tym samym aliasem hosta lub numerem portu, korzystając z interfejsu Edge.

Jeśli na przykład wystąpił błąd 404 z adresem URL http://example.com:9001/proxy1, musisz znaleźć hosty wirtualne, które mają alias hosta example.com i port 9001.

  1. W Public Cloud i nowym interfejsie Edge w Private Cloud:
    1. Wybierz Administracja.
    2. Wybierz Hosty wirtualne.
    3. W przypadku każdego środowiska użyj filtra wyszukiwania, aby określić hosty wirtualne , które pasują do konkretnego aliasu hosta , za pomocą którego wywoływano żądania API.
    4. Jeśli znajdziesz wiele hostów wirtualnych używających tego samego aliasu hosta , przejdź do sekcji Rozwiązanie, aby rozwiązać ten problem.

    Przykład:

  2. W klasycznym interfejsie w Private Cloud:
    1. Kliknij kartę Interfejsy API .
    2. Wybierz Konfiguracja środowiska.
    3. Wybierz Hosty wirtualne.
    4. W przypadku każdego środowiska wyświetl listę hostów wirtualnych , aby sprawdzić, czy któryś z nich pasuje do konkretnego aliasu hosta , za pomocą którego wywoływano żądania API.
    5. Jeśli znajdziesz wiele hostów wirtualnych pasujących do tego samego aliasu hosta , przejdź do sekcji Rozwiązanie , aby rozwiązać ten problem.

    Przykład:

Interfejsy API do zarządzania

Postępuj zgodnie z tymi instrukcjami, aby sprawdzić, czy istnieje wiele hostów wirtualnych z tym samym aliasem hosta lub numerem portu, korzystając z interfejsów API do zarządzania.

  1. Pobierz definicję każdego hosta wirtualnego w każdym środowisku w organizacji, aby sprawdzić, które hosty wirtualne mają ten sam alias hosta i numer portu:

    Jeśli na przykład wystąpił błąd 404 z adresem URL http://example.com:9001/proxy1, musisz znaleźć hosty wirtualne, które mają alias hosta example.com i port 9001.

    1. Pobierz listę środowisk

      Użytkownik Public Cloud:

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

      Użytkownik Private Cloud:

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

      Gdzie:

      ORGANIZATION_NAME to nazwa organizacji.

      Przykład:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
    2. Pobierz listę hostów wirtualnych w środowisku

      Użytkownik Public Cloud:

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

      Użytkownik Private Cloud:

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

      Gdzie:

      ORGANIZATION_NAME to nazwa organizacji.

      ENVIRONMENT_NAME to nazwa środowiska.

      Przykład:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
    3. Pobierz definicję każdego hosta wirtualnego w środowisku.

      Użytkownik Public Cloud:

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

      Użytkownik Private Cloud:

      curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME -u USERNAME
      

      Gdzie:

      ORGANIZATION_NAME to nazwa organizacji.

      ENVIRONMENT_NAME to nazwa środowiska.

      VIRTUAL_HOST_NAME to nazwa hosta wirtualnego.

      Przykład:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u USERNAME
      
      {
        "hostAliases" : [ "example.com" ],
        "interfaces" : [ ],
        "listenOptions" : [ ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [ ]
      }
    4. Powtórz 2 kroki wymienione powyżej w przypadku innych środowisk w organizacji.

      W tym przykładzie powtórz kroki w środowisku dev:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts -u USERNAME
      
      [ "default" ]
      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u USERNAME
      
      {
        "hostAliases" : [ "example.com" ],
        "interfaces" : [ ],
        "listenOptions" : [ ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [ ]
      }

      W tym przykładzie widać, że 2 hosty wirtualne default w 2 różnych środowiskach, test i dev, zawierają ten sam alias hosta example.com i numer portu 9001. Jest to przyczyna błędów 404.

    5. Jeśli znajdziesz wiele hostów wirtualnych pasujących do tego samego aliasu hosta , przejdź do sekcji Rozwiązanie , aby rozwiązać ten problem.

Rozdzielczość

  1. Upewnij się, że każdy host wirtualny zawiera tylko unikalne kombinacje aliasu hosta i portu.
  2. Jeśli znajdziesz wiele hostów wirtualnych z tymi samymi kombinacjami aliasu hosta i portu musisz je zaktualizować, aby używały unikalnego aliasu hosta.
  3. Możesz je zaktualizować za pomocą interfejsu Edge lub interfejsu API zarządzania Google Analytics. Instrukcje znajdziesz w sekcji Zmienianie hosta wirtualnego.
  4. Upewnij się, że każdy alias hosta ma prawidłowy wpis DNS.
  5. Jeśli w omawianym powyżej przykładzie konfiguracja wyglądała tak:
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments -u user
    
    [ "prod", "test", "dev" ]
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u user
    
    {
      "hostAliases" : [ "example.com" ],
      "interfaces" : [  ],
      "listenOptions" : [  ],
      "name" : "default",
      "port" : "9001",
      "retryOptions" : [  ]
    }
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user
    
    {
      "hostAliases" : [ "example.com" ],
      "interfaces" : [  ],
      "listenOptions" : [  ],
      "name" : "default",
      "port" : "9001",
      "retryOptions" : [  ]
    }
    1. Możesz zaktualizować nieprawidłowy host wirtualny, aby się nie nakładały.
    2. Zaktualizuj alias hosta na example2.com.
    3. Upewnij się, że nowy alias hosta ma podobny wpis DNS jak poprzedni alias hosta.
      curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user -H 'Content-Type: application/json' -d '{
        "hostAliases" : [ "example2.com" ],
        "interfaces" : [  ],
        "listenOptions" : [  ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [  ]
      }' -i
      
      HTTP/1.1 200 OK
      Date: Tue, 02 Feb 2021 20:54:29 GMT
      Content-Type: application/json
      X-Apigee.user: user
      X-Apigee.organization: myorg
      X-Apigee.environment: dev
      X-Apigee.backends: management-server
      Date: Tue, 02 Feb 2021 20:54:29 GMT
      Content-Length: 152
      
      {
        "hostAliases" : [ "example2.com" ],
        "interfaces" : [  ],
        "listenOptions" : [  ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [  ]
      }
  6. Ponownie wywołaj interfejs API w proxy i sprawdź, czy stale otrzymujesz odpowiedzi z informacją o powodzeniu:
    curl http://example.com:9001/proxy1
    
    {
        "slideshow": {
    	    "author": "Yours Truly",
    		"date": "date of publication",
    		"slides": [
    		    {
    			    "title": "Wake up to WonderWidgets!",
    				"type:": "all"
    			},
    			{
    			    "items": [
    				    "Why WonderWidgets are great",
    					"Who buys WonderWidgets"
    				],
    				"title": "Overview",
    				"type": "all"
    			}
    		],
    		"title": "Sample Slide Show"
        }
    
    }
  7. Jeśli problem nadal występuje, przejdź do sekcji Informacje diagnostyczne, które musisz zebrać.

Informacje diagnostyczne, które musisz zebrać

Jeśli problem nadal występuje po wykonaniu powyższych instrukcji, zbierz te informacje diagnostyczne i skontaktuj się z zespołem pomocy Apigee Edge:

Jeśli jesteś użytkownikiem Public Cloud, podaj te informacje:

  • Nazwa organizacji
  • Nazwa środowiska
  • Nazwa proxy interfejsu API
  • Pełne polecenie curl umożliwiające odtworzenie błędu 404
  • Jeśli błędy 404 nie występują obecnie, podaj okres z informacjami o strefie czasowej, w którym błędy 404 występowały w przeszłości.

Jeśli jesteś użytkownikiem Private Cloud, podaj te informacje:

  • Pełny komunikat o błędzie zaobserwowany w przypadku nieudanych żądań
  • Nazwa organizacji, środowiska i proxy interfejsu API, w przypadku których występują 404 błędy
  • Pakiet proxy interfejsu API
  • Dzienniki dostępu NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • Dzienniki procesora komunikatów
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • Okres z informacjami o strefie czasowej, w którym wystąpiły błędy 404