404 Mehrere virtuelle Hosts mit demselben Host-Alias

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

Symptom

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

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 folgende 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 sind bei der Behebung des Fehlers 404 hilfreich. So prüfen Sie die Protokolle:

  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 Protokollen.

  3. Prüfen Sie die Message Processor-Logs (/opt/apigee/var/log/edge-message-processor/logs/system.log), um festzustellen, 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 einer Fehlermeldung aus dem Message Processor-Protokoll

  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)
    

    Das Protokoll oben zeigt den Fehlercode und die Fehlermeldung wie folgt an:

    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 Processorn verwenden sowohl den Hostheader, die Portnummer als auch die URI-Pfade, um den Traffic an den richtigen API-Proxy weiterzuleiten. Mehrdeutige Definitionen wie mehrere virtuelle Hosts mit demselben Hostalias und derselben Portnummer sind ein dokumentiertes Anti-Muster und können zu unerwartetem Verhalten führen. Einer der häufigsten Fehler, die auftreten, 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 spezifische API-Proxy so konfiguriert werden kann, dass er die Anfragen nur auf einem der virtuellen Hosts akzeptiert. Wenn die API-Anfragen an den im API-Proxy konfigurierten virtuellen Host weitergeleitet werden, erhalten Sie eine erfolgreiche Antwort. Wenn die API-Anfragen jedoch an die anderen virtuellen Hosts weitergeleitet werden, an die der API-Proxy nicht für die Annahme der Anfragen konfiguriert ist, schlagen die APIs mit den folgenden 404-Fehlern fehl.

Folgen Sie den Anweisungen in 404 Proxy für Host konnte nicht identifiziert werden: <Virtueller Hostname> und URL: <Pfad> und beheben Sie diesen Fehler. Wenn keine der Ursachen zu diesem Fehler führt, führen Sie die folgenden Schritte aus, um festzustellen, ob virtuelle Hosts mit doppelten Hostaliassen den Fehler 404 verursachen.

Diagnose

Ermitteln Sie mit einer der folgenden Methoden, ob mehrere virtuelle Hosts mit demselben Hostalias/gleichen Port-# vorhanden sind, was zu 404-Fehlern führt:

  • Edge-Benutzeroberfläche
  • Verwaltungs-APIs

Edge-Benutzeroberfläche

Folgen Sie dieser Anleitung, um mithilfe der Edge-Benutzeroberfläche festzustellen, ob mehrere virtuelle Hosts mit demselben Hostalias/gleichen Port-Nr. vorhanden sind.

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

  1. Gehen Sie in der öffentlichen Cloud und in der neuen Edge-Benutzeroberfläche in der privaten Cloud so vor:
    1. Wählen Sie Verwalten.
    2. Wählen Sie Virtuelle Hosts aus.
    3. Bestimmen Sie für jede Umgebung mit dem Suchfilter die virtuellen Hosts, die dem spezifischen Host-Alias entsprechen, mit dem die API-Anfragen aufgerufen wurden.
    4. Wenn Sie mehrere virtuelle Hosts mit demselben Hostalias finden, rufen Sie Lösung auf, um das Problem zu beheben.

    Beispiel:

  2. In der klassischen UI in der Private Cloud:
    1. Wählen Sie den Tab APIs aus.
    2. Wählen Sie Umgebungskonfiguration aus.
    3. Wählen Sie Virtuelle Hosts aus.
    4. Rufen Sie für jede Umgebung die Liste der virtuellen Hosts auf, um zu sehen, ob sie mit dem spezifischen Host-Alias übereinstimmen, mit dem die API-Anfragen aufgerufen wurden.
    5. Wenn Sie mehrere virtuelle Hosts finden, die mit demselben Host-Alias übereinstimmen, rufen Sie Lösung auf, um das Problem zu beheben.

    Beispiel:

Verwaltungs-APIs

Anhand dieser Anleitung können Sie mit den Management APIs feststellen, ob mehrere virtuelle Hosts mit demselben Hostalias/gleichen Port-Nummer vorhanden sind.

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

    Wenn Sie beispielsweise den Fehler 404 mit der URL http://example.com:9001/proxy1 beobachten, müssen Sie herausfinden, welche virtuellen Hosts den Hostalias example.com und 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.

      Example:

      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.

      Example:

      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.

      Example:

      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 oben genannten Schritte für die anderen Umgebungen in Ihrer Organisation.

      Wiederholen Sie in diesem Beispiel die Schritte für die dev-Umgebung:

      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, beide denselben Hostalias example.com und die Portnummer 9001 enthalten. Dies ist die Ursache für 404-Fehler.

    5. Wenn Sie mehrere virtuelle Hosts finden, die mit demselben Host-Alias übereinstimmen, rufen Sie Lösung auf, um das Problem zu beheben.

Auflösung

  1. Achten Sie darauf, dass jeder virtuelle Host nur eindeutige Kombinationen aus Hostalias und Port enthält.
  2. Wenn Sie mehrere virtuelle Hosts mit denselben Kombinationen aus Hostalias und Port identifiziert haben, müssen Sie diese mit einem eindeutigen Hostalias aktualisieren.
  3. Sie können diese mit der Edge-Benutzeroberfläche oder der Management API aktualisieren. Eine Anleitung finden Sie unter Virtuellen Host ändern.
  4. Achten Sie darauf, dass für jeden Hostalias ein korrekter DNS-Eintrag vorhanden ist.
  5. Wenn unsere Konfiguration im oben beschriebenen Beispiel so aussähe:
    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 er sich nicht überschneidet.
    2. Das heißt, Sie aktualisieren 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 konsistent 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 Anleitung weiterhin besteht, stellen Sie die folgenden Diagnoseinformationen zusammen und wenden Sie sich an den Apigee Edge-Support:

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

  • Name der Organisation
  • Name der Umgebung
  • API-Proxy-Name
  • Führen Sie den Befehl curl aus, um den Fehler 404 zu reproduzieren.
  • Wenn die 404-Fehler derzeit nicht auftreten, geben Sie den Zeitraum mit den Zeitzoneninformationen an, für die in der Vergangenheit 404-Fehler aufgetreten sind.

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

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