404 Mehrere virtuelle Hosts mit demselben Host-Alias

Sie lesen gerade die Dokumentation zu Apigee Edge.
Zur Dokumentation zu Apigee X.
info

Symptom

Die Clientanwendung erhält als Antwort auf die API-Aufrufe den HTTP-Statuscode 404 mit der Meldung Not Found und der Fehlermeldung Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

Dieser Fehler bedeutet, dass Edge den API-Proxy für den angegebenen virtuellen Host und Pfad nicht finden konnte.

Fehlermeldung

Die Clientanwendung erhält den folgenden Antwortcode:

HTTP/1.1 404 Not Found

Außerdem wird möglicherweise eine Fehlermeldung wie die unten gezeigte angezeigt:

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

Mögliche Ursachen

Ursache Beschreibung Anleitungen zur Fehlerbehebung gelten für
Virtueller Host mit doppeltem Hostalias Mehrere virtuelle Hosts haben denselben Hostalias und dieselbe Portnummer. Nutzer von Edge Public und Private Cloud

Allgemeine Diagnoseschritte

NGINX- und Message Processor-Logs können bei der Fehlerbehebung des 404-Fehlers hilfreich sein. So prüfen Sie die Logs:

  1. Rufen Sie die NGINX-Logs mit dem folgenden Befehl auf:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Prüfen Sie die folgenden Felder in den Logeinträgen:
    Feld Wert
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    Notieren Sie sich die Nachrichten-ID aus den Logs.

  3. Prüfen Sie in den Message Processor-Logs (/opt/apigee/var/log/edge-message-processor/logs/system.log) ob Sie messaging.adaptors.http.flow.ApplicationNotFound für die jeweilige API haben oder ob Sie die eindeutige Nachrichten-ID aus Schritt 2 für die API-Anfrage haben.

    Beispiel für eine Fehlermeldung aus dem Message Processor-Log

  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)

    Im obigen Log sind der Fehlercode und die Fehlermeldung wie folgt:

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

Ursache: Mehrere virtuelle Hosts mit demselben Hostalias und derselben Portnummer

Apigee Edge-Router und Message Processor verwenden sowohl den Host-Header als auch die Portnummer und die URI-Pfade um Traffic an den richtigen API-Proxy weiterzuleiten. Mehrdeutige Definitionen wie mehrere virtuelle Hosts mit demselben Hostalias und derselben Portnummer sind ein dokumentiertes Anti-Pattern und können zu unerwartetem Verhalten führen. Einer der häufigsten Fehler ist ein 404 Fehler mit der Meldung Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

Wenn mehrere virtuelle Hosts mit demselben Hostalias vorhanden sind, treten in der Regel zeitweise 404 Fehler auf. Das liegt daran, dass der jeweilige API-Proxy möglicherweise so konfiguriert ist, dass er die Anfragen nur auf einem der virtuellen Hosts akzeptiert. Wenn die API-Anfragen an den spezifischen virtuellen Host weitergeleitet werden, der im API-Proxy konfiguriert ist, erhalten Sie eine erfolgreiche Antwort. Wenn die API-Anfragen jedoch an die anderen virtuellen Hosts weitergeleitet werden, für die der API-Proxy nicht so konfiguriert ist, dass er die Anfragen akzeptiert, schlagen die APIs mit diesen 404 Fehlern fehl.

Folgen Sie der Anleitung unter 404 – Proxy für Host <virtual host name> und URL <path> kann nicht identifiziert werden und beheben Sie diesen Fehler. Wenn keine der Ursachen zu diesem Fehler führt, prüfen Sie anhand der Schritte unten, ob virtuelle Hosts mit doppelten Hostaliassen die 404 Fehler verursachen.

Diagnose

Verwenden Sie eine der folgenden Methoden, um festzustellen, ob mehrere virtuelle Hosts mit demselben Hostalias/derselben Portnummer zu 404 Fehlern führen:

  • Edge-UI
  • Verwaltungs-APIs

Edge-UI

Folgen Sie dieser Anleitung, um festzustellen, ob mehrere virtuelle Hosts mit demselben Host alias/derselben Portnummer vorhanden sind.

Wenn Sie beispielsweise den 404-Fehler mit der URL http://example.com:9001/proxy1 beobachtet haben, müssen Sie herausfinden, welche virtuellen Hosts den Hostalias example.com und den Port 9001 haben.

  1. In der Public Cloud und der neuen Edge-UI in der Private Cloud:
    1. Wählen Sie Verwalten aus.
    2. Wählen Sie Virtuelle Hosts aus.
    3. Verwenden Sie für jede Umgebung den Suchfilter, um die virtuellen Hosts zu ermitteln, die mit dem spezifischen Hostalias übereinstimmen, mit dem die API Anfragen aufgerufen wurden.
    4. Wenn Sie mehrere virtuelle Hosts mit demselben Hostalias finden, lesen Sie den Abschnitt Auflösung, um dieses Problem zu beheben.

    Beispiel :

  2. In der klassischen UI in der Private Cloud:
    1. Wählen Sie den APIs Tab aus.
    2. Wählen Sie Umgebungskonfiguration aus.
    3. Wählen Sie Virtuelle Hosts aus.
    4. Sehen Sie sich für jede Umgebung die Liste der virtuellen Hosts an, um festzustellen, ob einer mit dem spezifischen Hostalias übereinstimmt, mit dem die API-Anfragen aufgerufen wurden.
    5. Wenn Sie mehrere virtuelle Hosts finden, die mit demselben Hostalias übereinstimmen, lesen Sie den Abschnitt Auflösung, um dieses Problem zu beheben.

    Beispiel :

Verwaltungs-APIs

Folgen Sie dieser Anleitung, um festzustellen, ob mehrere virtuelle Hosts mit demselben Host alias/derselben Portnummer vorhanden sind.

  1. Rufen Sie die Definition der einzelnen virtuellen Hosts in den einzelnen Umgebungen Ihrer Organisationen ab, um zu sehen, welche virtuellen Hosts denselben Hostalias und dieselbe Portnummer haben:

    Wenn Sie beispielsweise den 404 Fehler mit der URL http://example.com:9001/proxy1 beobachtet haben, müssen Sie herausfinden, welche virtuellen Hosts den Hostalias example.com und den Port 9001 haben.

    1. Liste der Umgebungen abrufen

      Public Cloud-Nutzer :

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

      Private Cloud-Nutzer :

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

      Wobei:

      ORGANIZATION_NAME ist der Name der Organisation.

      Beispiel :

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
    2. Liste der virtuellen Hosts in einer Umgebung abrufen

      Public Cloud-Nutzer :

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

      Private Cloud-Nutzer :

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

      Wobei:

      ORGANIZATION_NAME ist der Name der Organisation.

      ENVIRONMENT_NAME ist der Name der Umgebung.

      Beispiel :

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
    3. Rufen Sie die Definition der einzelnen virtuellen Hosts in der Umgebung ab.

      Public Cloud-Nutzer :

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

      Private Cloud-Nutzer :

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

      Wobei:

      ORGANIZATION_NAME ist der Name der Organisation.

      ENVIRONMENT_NAME ist der Name der Umgebung.

      VIRTUAL_HOST_NAME ist der Name des virtuellen Hosts.

      Beispiel :

      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. Wiederholen Sie die beiden obigen Schritte für die anderen Umgebungen in Ihrer Organisation.

      Wiederholen Sie in diesem Beispiel die Schritte für die Umgebung 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" : [ ]
      }

      In diesem Beispiel sehen Sie, dass die beiden virtuellen Hosts default in zwei verschiedenen Umgebungen, test und dev, denselben Hostalias example.com und dieselbe Portnummer 9001 enthalten. Das ist die Ursache für die 404-Fehler.

    5. Wenn Sie mehrere virtuelle Hosts finden, die mit demselben Hostalias übereinstimmen, lesen Sie den Abschnitt Auflösung, um dieses Problem zu beheben.

Auflösung

  1. Achten Sie darauf, dass jeder virtuelle Host nur eindeutige Hostalias- und Portkombinationen enthält.
  2. Wenn Sie mehrere virtuelle Hosts mit denselben Hostalias- und Portkombinationen gefunden haben müssen Sie diese mit einem eindeutigen Hostalias aktualisieren.
  3. Sie können diese über die Edge-UI oder die Verwaltungs-API aktualisieren. Eine Anleitung finden Sie unter Virtuellen Host ändern.
  4. Achten Sie darauf, dass jeder Hostalias einen entsprechenden DNS-Eintrag hat.
  5. Wenn unsere Konfiguration im oben beschriebenen Beispiel so aussieht:
    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. Sie können den falschen virtuellen Host so aktualisieren, dass sie sich nicht überschneiden.
    2. Aktualisieren Sie dazu den Hostalias als example2.com.
    3. Achten Sie darauf, dass der neue Hostalias einen ähnlichen DNS-Eintrag wie der vorherige Hostalias hat.
      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. Führen Sie die API-Aufrufe noch einmal an den Proxy aus und prüfen Sie, ob Sie durchgehend erfolgreiche Antworten erhalten:
    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. Wenn das Problem weiterhin besteht, gehen Sie zu Erfassen von Diagnoseinformationen erforderlich.

Erfassen von Diagnoseinformationen erforderlich

Wenn das Problem auch nach Befolgen der obigen Anweisungen weiterhin besteht, sammeln Sie die folgenden Diagnoseinformationen und wenden Sie sich dann an den Apigee Edge-Support:

Wenn Sie ein Public Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

  • Name der Organisation
  • Name der Umgebung
  • Name des API-Proxys
  • Vollständiger curl-Befehl zum Reproduzieren des 404-Fehlers
  • Wenn die 404-Fehler derzeit nicht auftreten, geben Sie den Zeitraum mit den Zeitzoneninformationen an, in dem in der Vergangenheit 404-Fehler aufgetreten sind.

Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:

  • Vollständige Fehlermeldung für die fehlgeschlagenen Anfragen
  • Name der Organisation, der Umgebung und des API-Proxys, für die 404 Fehler auftreten
  • API-Proxy-Bundle
  • NGINX-Zugriffslogs
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • Message Processor-Logs
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • Der Zeitraum mit den Zeitzoneninformationen, in dem die 404-Fehler aufgetreten sind