404 Hôtes virtuels multiples avec le même alias d'hôte

Vous consultez la documentation Apigee Edge.
Accédez à la documentation**Apigee X**.
info

Problème constaté

L'application cliente reçoit un code d'état HTTP 404 avec le message Not Found et le message d'erreur Unable to identify proxy for host: VIRTUAL_HOST and url: PATH en réponse aux appels d'API.

Cette erreur signifie qu'Edge n'a pas pu trouver le proxy d'API pour l'hôte virtuel et le chemin spécifiés.

Message d'erreur

L'application cliente reçoit le code de réponse suivant :

HTTP/1.1 404 Not Found

En outre, vous pouvez observer un message d'erreur semblable à celui présenté ci-dessous :

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

Causes possibles

Cause Description Instructions de dépannage applicables
Hôte virtuel avec alias d'hôte en double Plusieurs hôtes virtuels ont le même alias d'hôte et le même numéro de port. Utilisateurs d'Edge Public Cloud et Private Cloud

Étapes de diagnostic courantes

Les journaux NGINX et du processeur de messages seront utiles pour résoudre l'erreur 404. Pour vérifier les journaux, procédez comme suit :

  1. Affichez les journaux NGINX à l'aide de la commande suivante :
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Vérifiez les champs suivants dans les entrées du journal :
    Champ Valeur
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    Notez l'ID du message dans les journaux.

  3. Consultez les journaux du processeur de messages (/opt/apigee/var/log/edge-message-processor/logs/system.log) pour voir si vous avez messaging.adaptors.http.flow.ApplicationNotFound pour l'API spécifique ou si vous disposez de l'ID de message unique de l'étape 2 pour la requête d'API.

    Exemple de message d'erreur provenant du journal du processeur de messages

  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)

    Le journal ci-dessus indique le code d'erreur et le message d'erreur suivants :

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

Cause : Plusieurs hôtes virtuels avec le même alias d'hôte et le même numéro de port

Les routeurs et les processeurs de messages Apigee Edge utilisent l'en-tête d'hôte, le numéro de port et les chemins d'URI pour acheminer le trafic vers le proxy d'API approprié. Les définitions ambiguës, telles que plusieurs hôtes virtuels avec le même alias d'hôte et le même numéro de port, sont un anti-modèle documenté et peuvent entraîner des comportements inattendus. L'une des erreurs courantes que vous observerez est une 404 erreur avec le message Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

En règle générale, si plusieurs hôtes virtuels avec le même alias d'hôte existent, vous observerez intermittentes 404 erreurs. En effet, le proxy d'API spécifique peut être configuré pour accepter les requêtes sur un seul des hôtes virtuels. Lorsque les requêtes d'API sont acheminées vers l' hôte virtuel spécifique configuré dans le proxy d'API, vous obtenez une réponse positive. Toutefois, lorsque les requêtes d'API sont acheminées vers les autres hôtes virtuels pour lesquels le proxy d'API n'est pas configuré pour accepter les requêtes, les API échouent avec ces 404 erreurs.

Suivez les instructions fournies dans 404 Impossible d'identifier le proxy pour l'hôte : <virtual host name> et l'URL : <path> et résolvez cette erreur. Si aucune des causes n'entraîne cette erreur, procédez comme suit pour déterminer si les hôtes virtuels avec des alias d'hôte en double sont à l'origine des 404 erreurs.

Diagnostic

Utilisez l'une des méthodes suivantes pour déterminer si plusieurs hôtes virtuels ont le même alias d'hôte/numéro de port, ce qui entraîne des 404 erreurs :

  • Interface utilisateur Edge
  • API de gestion

Interface utilisateur Edge

Suivez ces instructions pour déterminer si plusieurs hôtes virtuels ont le même alias d'hôte/numéro de port à l'aide de l'interface utilisateur Edge.

Par exemple, si vous avez observé l'erreur 404 avec l'URL http://example.com:9001/proxy1, vous devez trouver les hôtes virtuels qui ont l'alias d'hôte example.com et le port 9001.

  1. Dans Public Cloud et la nouvelle interface utilisateur Edge sur Private Cloud:
    1. Sélectionnez Admin.
    2. Sélectionnez Hôtes virtuels.
    3. Pour chaque environnement , utilisez le filtre de recherche pour déterminer les hôtes virtuels qui correspondent à l'alias d'hôte spécifique avec lequel les requêtes d'API ont été appelées.
    4. Si vous trouvez plusieurs hôtes virtuels utilisant le même alias d'hôte , consultez la section Solution pour résoudre ce problème.

    Exemple :

  2. Dans l'interface utilisateur classique sur Private Cloud:
    1. Sélectionnez l'onglet API .
    2. Sélectionnez Configuration de l'environnement.
    3. Sélectionnez Hôtes virtuels.
    4. Pour chaque environnement , consultez la liste des hôtes virtuels pour voir si l'un d'eux correspond à l'alias d'hôte spécifique avec lequel les requêtes d'API ont été appelées.
    5. Si vous trouvez plusieurs hôtes virtuels correspondant au même alias d'hôte , consultez la section Solution pour résoudre ce problème.

    Exemple :

API de gestion

Suivez ces instructions pour déterminer si plusieurs hôtes virtuels ont le même alias d'hôte/numéro de port à l'aide des API de gestion.

  1. Obtenez la définition de chacun des hôtes virtuels dans chacun des environnements de vos organisations pour voir quels hôtes virtuels ont le même alias d'hôte et le même numéro de port :

    Par exemple, si vous avez observé l'erreur 404 avec l'URL http://example.com:9001/proxy1, vous devez trouver les hôtes virtuels qui ont l'alias d'hôte example.com et le port 9001.

    1. Obtenir la liste des environnements

      Utilisateur de Public Cloud :

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

      Utilisateur de Private Cloud :

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

      Où :

      ORGANIZATION_NAME est le nom de l'organisation.

      Exemple :

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
    2. Obtenir la liste des hôtes virtuels dans un environnement

      Utilisateur de Public Cloud :

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

      Utilisateur de Private Cloud :

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

      Où :

      ORGANIZATION_NAME est le nom de l'organisation.

      ENVIRONMENT_NAME est le nom de l'environnement.

      Exemple :

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
    3. Obtenir la définition de chacun des hôtes virtuels dans l'environnement.

      Utilisateur de Public Cloud :

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

      Utilisateur de Private Cloud :

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

      Où :

      ORGANIZATION_NAME est le nom de l'organisation.

      ENVIRONMENT_NAME est le nom de l'environnement.

      VIRTUAL_HOST_NAME est le nom de l'hôte virtuel.

      Exemple :

      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. Répétez les deux étapes ci-dessus pour les autres environnements de votre organisation.

      Dans cet exemple, répétez les étapes pour l'environnement 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" : [ ]
      }

      Dans cet exemple, vous pouvez voir que les deux hôtes virtuels default dans deux environnements différents, test et dev, contiennent le même alias d'hôte example.com et le même numéro de port 9001. C'est la cause des erreurs 404.

    5. Si vous trouvez plusieurs hôtes virtuels correspondant au même alias d'hôte , consultez la section Solution pour résoudre ce problème.

Solution

  1. Assurez-vous que chaque hôte virtuel ne contient que des combinaisons uniques d'alias d'hôte et de port.
  2. Si vous avez identifié plusieurs hôtes virtuels avec les mêmes combinaisons d'alias d'hôte et de port vous devez les mettre à jour avec un alias d'hôte unique.
  3. Vous pouvez les mettre à jour à l'aide de l'interface utilisateur Edge ou de l'API Management. Pour obtenir des instructions, consultez la section Modifier un hôte virtuel.
  4. Assurez-vous que chaque alias d'hôte comporte une entrée DNS appropriée.
  5. Dans l'exemple ci-dessus, si notre configuration se présentait comme suit :
    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. Vous pouvez mettre à jour l'hôte virtuel incorrect afin qu'il ne se chevauche pas.
    2. Autrement dit, mettez à jour l'alias d'hôte en tant que example2.com.
    3. Assurez-vous que la nouvelle entrée DNS de l'alias d'hôte est semblable à celle de l'alias d'hôte précédent.
      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. Effectuez à nouveau les appels d'API au proxy et vérifiez que vous obtenez des réponses positives de manière cohérente :
    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. Si le problème persiste, consultez la page Vous devez collecter des informations de diagnostic.

Vous devez collecter des informations de diagnostic

Si le problème persiste, même après avoir suivi les instructions ci-dessus, rassemblez les informations de diagnostic suivantes , puis contactez l'assistance Apigee Edge :

Si vous êtes un utilisateur de Public Cloud, fournissez les informations suivantes :

  • Nom de l'organisation
  • Nom de l'environnement
  • Nom de proxy d'API
  • Commande curl complète pour reproduire l'erreur 404
  • Si les erreurs 404 ne se produisent pas actuellement, indiquez la période avec les informations de fuseau horaire au cours de laquelle les erreurs 404 se sont produites par le passé.

Si vous êtes un utilisateur de Private Cloud, fournissez les informations suivantes :

  • Message d'erreur complet observé pour les requêtes ayant échoué
  • Nom de l'organisation, de l'environnement et du proxy d'API pour lesquels vous observez 404 erreurs
  • Bundle de proxy d'API
  • Journaux d'accès NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • Journaux du processeur de messages
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • Période avec les informations de fuseau horaire au cours de laquelle les erreurs 404 se sont produites