404 Più host virtuali con lo stesso alias host

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

Sintomo

L'applicazione client riceve un codice di stato HTTP 404 con il messaggio Not Found e il messaggio di errore Unable to identify proxy for host: VIRTUAL_HOST and url: PATH in risposta alle chiamate API.

Questo errore significa che Edge non è riuscito a trovare il proxy API per l'host virtuale e il percorso specificati.

Messaggio di errore

L'applicazione client riceve il seguente codice di risposta:

HTTP/1.1 404 Not Found

Inoltre, potresti visualizzare un messaggio di errore simile a quello mostrato di seguito:

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

Possibili cause

Causa Descrizione Le istruzioni di risoluzione dei problemi applicabili a
Host virtuale con alias host duplicato Più host virtuali hanno lo stesso alias host e lo stesso numero di porta. Utenti perimetrali di cloud pubblici e privati

Passaggi diagnostici comuni

I log di NGINX e del processore di messaggi saranno utili per la risoluzione dell'errore 404. Per controllare i log:

  1. Visualizza i log NGINX utilizzando il seguente comando:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Verifica la presenza dei seguenti campi nelle voci di log:
    Campo Valore
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    Prendi nota dell'ID messaggio dei log.

  3. Controllare i log del processore di messaggi (/opt/apigee/var/log/edge-message-processor/logs/system.log) per sapere se avere messaging.adaptors.http.flow.ApplicationNotFound per l'API specifica o se disponi dell'attributo l'ID messaggio del passaggio 2 per la richiesta API.

    Esempio di messaggio di errore dal log del processore di messaggi

  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)
    

    Il log riportato sopra mostra il codice e il messaggio di errore seguenti:

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

Causa: più host virtuali con lo stesso alias host e numero di porta

I router e i processori di messaggi Apigee Edge utilizzano sia l'intestazione host, il numero di porta e i percorsi degli URI per indirizzare il traffico al proxy API corretto. Avere definizioni ambigue come la presenza di più istanze host con lo stesso alias host e numero di porta è una documentazione anti-pattern e può portare a comportamenti imprevisti. Uno degli errori più comuni che osserverai è la 404 errore con il messaggio Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

In genere, se esistono più host virtuali con lo stesso alias host, osserverai 404 errori intermittenti. Questo perché è possibile configurare il proxy API specifico per accettare le richieste solo su uno degli host virtuali. Quando le richieste API vengono instradate un host virtuale specifico configurato nel proxy API, riceverai una risposta positiva. Tuttavia, quando le richieste API vengono instradate agli altri host virtuali a cui viene inviato non configurato per accettare le richieste, le API avranno esito negativo con questi 404 errori.

Segui le istruzioni fornite in 404 Impossibile identificare il proxy per l'host: <nome host virtuale> e url: <path> e risolvi questo errore. Se l'errore non è tra le cause, segui la procedura indicata di seguito per determinare se gli host virtuali con alias host duplicati causano 404 errori.

Diagnosi

Utilizza uno dei seguenti metodi per determinare se sono presenti più host virtuali con stesso alias host/porta # che genera 404 errori:

  • UI Edge
  • API di gestione

UI Edge

Utilizza queste istruzioni per determinare se sono presenti più host virtuali con lo stesso host utilizzando l'interfaccia utente Edge.

Ad esempio, se hai osservato l'errore 404 con l'URL http://example.com:9001/proxy1, dovrai individuare gli host virtuali che l'alias host example.com e la porta 9001.

  1. In Cloud pubblico e nella nuova UI perimetrale su cloud privato:
      .
    1. Seleziona Amministrazione.
    2. Seleziona Host virtuali.
    3. Per ogni Ambiente, utilizza il filtro di ricerca per determinare la Host che corrispondono allo specifico alias host con cui l'API richieste sono state richiamate.
    4. Se trovi più host virtuali che utilizzano lo stesso alias host, vai a Risoluzione per risolvere il problema.

    Ad esempio:

  2. In UI classica su cloud privato:
      .
    1. Seleziona la scheda API .
    2. Seleziona Configurazione dell'ambiente.
    3. Seleziona Host virtuali.
    4. Per ogni Ambiente, visualizza l'elenco di Host virtuali per verificare se esistono corrispondenze. L'alias host specifico con cui sono state richiamate le richieste API.
    5. Se trovi più host virtuali corrispondenti allo stesso alias host, vai a Risoluzione per risolvere il problema.

    Ad esempio:

API di gestione

Utilizza queste istruzioni per determinare se sono presenti più host virtuali con lo stesso host utilizzando le API di gestione.

  1. Ottieni la definizione di ciascun host virtuale in ciascuno degli ambienti nella tua per vedere quali host virtuali hanno lo stesso alias host e numero di porta:

    Ad esempio, se hai osservato l'errore 404 con l'URL http://example.com:9001/proxy1, dovrai trovare le risorse virtuali gli host hanno l'alias host example.com e la porta 9001.

    1. Ottieni l'elenco degli ambienti

      Utente cloud pubblico:

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

      Utente Private Cloud:

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

      Dove:

      ORGANIZATION_NAME è il nome dell'organizzazione

      Esempio:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
      
    2. recupera l'elenco degli host virtuali in un ambiente

      Utente cloud pubblico:

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

      Utente Private Cloud:

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

      Dove:

      ORGANIZATION_NAME è il nome dell'organizzazione

      ENVIRONMENT_NAME è il nome dell'ambiente

      Esempio:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
      
    3. Ottieni la definizione di ciascun host virtuale nell'ambiente.

      Utente cloud pubblico:

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

      Utente Private Cloud:

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

      Dove:

      ORGANIZATION_NAME è il nome dell'organizzazione

      ENVIRONMENT_NAME è il nome dell'ambiente

      VIRTUAL_HOST_NAME è il nome dell'host virtuale

      Esempio:

      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. Ripeti i due passaggi precedenti per gli altri ambienti dell'organizzazione.

      In questo esempio, ripeti i passaggi per l'ambiente 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 questo esempio puoi vedere che i due host virtuali default in due diversi ambienti, test e dev, entrambi Contenere lo stesso alias host example.com e lo stesso numero di porta 9001. Questa è la causa degli errori di 404.

    5. Se trovi più host virtuali corrispondenti allo stesso alias host, vai a Risoluzione per risolvere il problema.

Risoluzione

  1. Assicurati che ogni host virtuale contenga solo combinazioni univoche di alias host e porta.
  2. Se hai identificato più host virtuali con le stesse combinazioni di alias host e porta devi aggiornarli con un alias host univoco.
  3. Puoi aggiornarli utilizzando l'UI Edge o l'API di gestione (puoi trovare le istruzioni) sotto Modifica di un host virtuale.
  4. Verifica che ogni alias host abbia una voce DNS corretta.
  5. Nell'esempio illustrato sopra, se la nostra configurazione era simile alla seguente:
    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. Puoi aggiornare l'host virtuale errato in modo che non si sovrappongano.
    2. In questo modo, l'alias host viene aggiornato come example2.com.
    3. Assicurati che il nuovo alias host abbia una voce DNS simile a quella dell'alias host precedente.
      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. Effettua nuovamente le chiamate API al proxy e verifica di ricevere in modo costante le risposte positive:
    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. Se il problema persiste, consulta l'articolo È necessario raccogliere i dati diagnostici.

Raccogliere dati diagnostici

Se il problema persiste anche dopo aver seguito le istruzioni riportate sopra, raccogli i seguenti dati informazioni diagnostiche e contattare l'assistenza Apigee Edge:

Se sei un utente del cloud pubblico, fornisci le seguenti informazioni:

  • Nome organizzazione
  • Nome ambiente
  • Nome proxy API
  • Completa il comando curl per riprodurre l'errore 404
  • Se al momento gli errori 404 non si verificano, indica il periodo di tempo con le informazioni sul fuso orario quando si sono verificati 404 errori in passato.

Se sei un utente di Private Cloud, fornisci le seguenti informazioni:

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Organizzazione, Nome ambiente e Nome proxy API che stai esaminando. 404 errore
  • Bundle proxy API
  • Log di accesso NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • Log del processore di messaggi
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • Il periodo di tempo con le informazioni sul fuso orario in cui si sono verificati gli errori 404