404 Più host virtuali con lo stesso alias host

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

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 il percorso e l'host virtuale 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 Istruzioni per la risoluzione dei problemi applicabili per
Host virtuale con alias host duplicato Più host virtuali hanno lo stesso alias host e numero di porta. Utenti di Edge Public Cloud e Private Cloud

Passaggi comuni per la diagnosi

I log di NGINX e del processore di messaggi saranno utili per risolvere il problema dell'errore 404. Segui questi passaggi per controllare i log:

  1. Visualizza i log di 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 dai 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 hai l'ID messaggio univoco 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 sopra mostra il codice di errore 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 di Apigee Edge utilizzano sia l'intestazione 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 numero di porta è un anti-pattern documentato e può portare a comportamenti imprevisti. Uno degli errori comuni che si verifica è un 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, si verificano errori 404 intermittenti. Questo perché il proxy API specifico potrebbe essere configurato per 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 riuscita. Tuttavia, quando le richieste API vengono instradate agli altri host virtuali per i quali il proxy API non è configurato per accettare le richieste, le API non funzioneranno con questi 404 errori.

Segui le istruzioni riportate in 404 Unable to identify proxy for host: <virtual host name> and url: <path> e risolvi questo errore. Se nessuna delle cause porta a questo errore, segui i passaggi riportati di seguito per determinare se gli host virtuali con alias host duplicati causano gli 404 errori.

Diagnosi

Utilizza uno dei seguenti metodi per determinare se esistono più host virtuali con lo stesso alias host/numero di porta che causano errori 404:

  • UI Edge
  • API di gestione

UI Edge

Utilizza queste istruzioni per determinare se esistono più host virtuali con lo stesso alias host/numero di porta utilizzando l'UI Edge.

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

  1. In Public Cloud 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 all'alias host specifico 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. Nell'UI classica su Private Cloud:
    1. Seleziona la scheda API .
    2. Seleziona Configurazione ambiente.
    3. Seleziona Host virtuali.
    4. Per ogni ambiente , visualizza l'elenco degli host virtuali per verificare 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 esistono più host virtuali con lo stesso alias host/numero di porta utilizzando le API di gestione.

  1. Recupera la definizione di ciascuno degli host virtuali in ogni ambiente delle tue organizzazioni per vedere quali host virtuali hanno lo stesso alias host e numero di porta:

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

    1. Recupera l'elenco degli ambienti

      Utente di Public Cloud:

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

      Utente di 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 di Public Cloud:

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

      Utente di 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. Recupera la definizione di ciascuno degli host virtuali nell'ambiente.

      Utente di Public Cloud:

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

      Utente di 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 degli errori 404.

    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 porta devi aggiornarli con un alias host univoco.
  3. Puoi aggiornarli utilizzando l'UI Edge o l'API di gestione. Le istruzioni sono disponibili in Modificare un host virtuale.
  4. Assicurati che ogni alias host abbia una voce DNS corretta.
  5. Nell'esempio discusso sopra, se la nostra configurazione era simile a questa:
    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. Aggiorna l'alias host come example2.com.
    3. Assicurati che il nuovo alias host abbia una voce DNS simile all'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. Esegui di nuovo le chiamate API al proxy e verifica di ricevere risposte riuscite in modo coerente:
    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, vai a Raccogliere informazioni di diagnostica.

Raccogliere informazioni di diagnostica

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

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

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

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

  • Messaggio di errore completo osservato per le richieste non riuscite
  • Nome dell'organizzazione, dell'ambiente e del proxy API per cui si verificano 404 errori
  • Bundle del 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