404 Più host virtuali con lo stesso alias host

Stai visualizzando la documentazione di Apigee Edge.
Vai alla 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 indica 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, potrebbe essere visualizzato 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 Istruzioni per la risoluzione dei problemi applicabili a
Host virtuale con alias host duplicato Più host virtuali hanno lo stesso alias host e numero di porta. Utenti di cloud pubblico e privato perimetrale

Passaggi di diagnosi più 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. Controlla i 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. Controlla i log del processore di messaggi (/opt/apigee/var/log/edge-message-processor/logs/system.log) per verificare se hai messaging.adaptors.http.flow.ApplicationNotFound per l'API specifica o se disponi dell'ID messaggio univoco del passaggio 2 per la richiesta API.

    Esempio di messaggio di errore del 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 come segue:

    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 dell'host, il numero di porta e i percorsi URI per instradare il traffico al proxy API corretto. Avere definizioni ambigue come più host virtuali con lo stesso alias host e lo stesso numero di porta è un anti-pattern documentato e può portare a comportamenti imprevisti. Uno degli errori più comuni che noterai è un errore 404 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, si verificheranno errori 404 intermittenti. Questo perché il proxy API specifico può essere configurato in modo da accettare le richieste solo su uno degli host virtuali. Quando le richieste API vengono instradate all'host virtuale specifico configurato nel proxy API, riceverai una risposta corretta. Tuttavia, se le richieste API vengono instradate ad altri host virtuali a cui il proxy API non è configurato per accettare le richieste, le API non riusciranno e restituiranno gli errori 404.

Segui le istruzioni fornite nella sezione 404 Impossibile identificare il proxy per l'host: <nome host virtuale> e url: <percorso> e risolvi questo errore. Se nessuna delle cause genera questo errore, segui i passaggi riportati di seguito per determinare se gli errori 404 sono causati da host virtuali con alias host duplicati.

Diagnostica

Utilizza uno dei seguenti metodi per determinare se sono presenti più host virtuali che hanno lo stesso alias host/numero di porta che genera errori 404:

  • UI perimetrale
  • API di gestione

UI perimetrale

Segui queste istruzioni per determinare se sono presenti più host virtuali che hanno lo stesso alias di porta o lo stesso numero di porta utilizzando l'interfaccia utente perimetrale.

Ad esempio, se hai notato l'errore 404 con l'URL http://example.com:9001/proxy1, devi trovare quali host virtuali hanno l'alias host example.com e la porta 9001.

  1. In Cloud pubblico e nella nuova UI Edge su Private Cloud:
    1. Seleziona Amministrazione.
    2. Seleziona Host virtuali.
    3. Per ogni ambiente, utilizza il filtro di ricerca per determinare gli host virtuali che corrispondono allo specifico alias host con cui sono state richiamate le richieste API.
    4. Se trovi più host virtuali che utilizzano lo stesso alias host, vai alla sezione 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 ciascun ambiente, visualizza l'elenco degli host virtuali per vedere se corrispondono all'alias host specifico con cui sono state richiamate le richieste API.
    5. Se trovi più host virtuali che corrispondono allo stesso alias host, vai alla sezione Risoluzione per risolvere il problema.

    Ad esempio:

API di gestione

Utilizza queste istruzioni per determinare se sono presenti più host virtuali che hanno lo stesso alias di porta o lo stesso numero di porta utilizzando le API di gestione.

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

    Ad esempio, se hai notato l'errore 404 con l'URL http://example.com:9001/proxy1, devi trovare quali host virtuali hanno l'alias host example.com e la porta 9001.

    1. Recupera l'elenco degli ambienti

      Utente del 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. Recupero dell'elenco di host virtuali in un ambiente

      Utente del 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 ciascuno degli host virtuali nell'ambiente.

      Utente del 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 della tua 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 ambienti diversi, test e dev, contengono entrambi lo stesso alias host example.com e numero di porta 9001. Questa è la causa di 404 errori.

    5. Se trovi più host virtuali che corrispondono allo stesso alias host, vai alla sezione 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 porte, devi aggiornarli con un alias host univoco.
  3. Puoi aggiornare queste impostazioni utilizzando l'interfaccia utente perimetrale o l'API di gestione. Le istruzioni sono disponibili nella sezione Modificare un host virtuale.
  4. Assicurati che ogni alias host abbia una voce DNS corretta.
  5. Nell'esempio visto 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 verrà 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. Ripeti le chiamate API al proxy e verifica di ricevere regolarmente risposte corrette:
    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 la pagina Devi raccogliere dati diagnostici.

Devi raccogliere dati diagnostici

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

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

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

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

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Organizzazione, nome dell'ambiente e nome del proxy API per cui stai osservando 404 errori
  • Bundle del proxy API
  • Log degli accessi 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 è verificato l'errore 404