404 Varios hosts virtuales con el mismo alias de host

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

Síntoma

La aplicación cliente obtiene un código de estado HTTP de 404 con el mensaje Not Found y el mensaje de error Unable to identify proxy for host: VIRTUAL_HOST and url: PATH como respuesta a las llamadas a la API.

Este error significa que Edge no pudo encontrar el proxy de API para el host virtual y la ruta de acceso especificados.

Mensaje de error

La aplicación cliente obtiene el siguiente código de respuesta:

HTTP/1.1 404 Not Found

Además, es posible que veas un mensaje de error similar al que se muestra a continuación:

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

Causas posibles

Causa Descripción Instrucciones de solución de problemas aplicables para
Host virtual con alias de host duplicado Varios hosts virtuales tienen el mismo alias de host y número de puerto. Usuarios de la nube pública y privada de Edge

Pasos comunes de diagnóstico

Los registros de NGINX y Message Processor serán útiles para solucionar el error 404. Sigue estos pasos para verificar los registros:

  1. Visualiza los registros de NGINX con el siguiente comando:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Verifica los siguientes campos en las entradas de registro:
    Campo Valor
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    Toma nota del ID del mensaje de los registros.

  3. Revisa los registros de Message Processor (/opt/apigee/var/log/edge-message-processor/logs/system.log)) a fin de ver si tienes messaging.adaptors.http.flow.ApplicationNotFound para la API específica o si tienes el ID del mensaje único del paso 2 de la solicitud a la API.

    Ejemplo de mensaje de error del registro de Message Processor

  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)
    

    En el registro anterior, se muestra el código y el mensaje de error siguientes:

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

Causa: Varios hosts virtuales con el mismo alias de host y número de puerto

Los routers y procesadores de mensajes de Apigee Edge usan el encabezado del host, el número de puerto y las rutas de URI para enrutar el tráfico al proxy de API correcto. Tener definiciones ambiguas, como varios hosts virtuales con el mismo alias de host y número de puerto es un antipatrón documentado y puede generar comportamientos inesperados. Uno de los errores comunes que verás es un error 404 con el mensaje Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

Por lo general, si existen varios hosts virtuales con el mismo alias de host, observarás errores 404 intermitentes. Esto se debe a que el proxy de API específico puede configurarse para aceptar solicitudes en solo uno de los hosts virtuales. Cuando las solicitudes a la API se enrutan al host virtual específico que está configurado en el proxy de API, obtendrás una respuesta exitosa. Sin embargo, cuando las solicitudes a la API se enrutan a los otros hosts virtuales para los que el proxy de API no está configurado para aceptar las solicitudes, las APIs fallarán y mostrarán estos errores 404.

Sigue las instrucciones que se indican en 404 No se puede identificar el proxy del host: <nombre del host virtual> y la URL: <ruta de acceso> y soluciona este error. Si ninguna de las causas genera este error, sigue los pasos que se indican a continuación para determinar si los hosts virtuales con alias de host duplicados causan los errores 404.

Diagnóstico

Usa uno de los siguientes métodos para determinar si hay varios hosts virtuales con el mismo alias de host o puerto #, lo que genera errores 404:

  • IU de Edge
  • APIs de administración

IU de Edge

Usa estas instrucciones para determinar si hay varios hosts virtuales con el mismo alias de host o número de puerto mediante la IU de Edge.

Por ejemplo, si observaste el error 404 con la URL http://example.com:9001/proxy1, debes encontrar qué hosts virtuales tienen el alias de host example.com y el puerto 9001.

  1. En la nube pública y la nueva IU perimetral en la nube privada, haz lo siguiente:
    1. Selecciona Administrador.
    2. Selecciona Hosts virtuales.
    3. En cada Entorno, usa el filtro de búsqueda para determinar los Hosts virtuales que coinciden con el Alias de host específico con el que se invocaron las solicitudes a la API.
    4. Si encuentras varios hosts virtuales con el mismo alias de host, ve a Resolución para resolver el problema.

    Por ejemplo:

  2. En IU clásica en la nube privada, haz lo siguiente:
    1. Selecciona la pestaña APIs .
    2. Selecciona Configuración del entorno.
    3. Selecciona Hosts virtuales.
    4. En cada Entorno, consulta la lista de Hosts virtuales para ver si alguno coincide con el Alias de host específico con el que se invocaron las solicitudes a la API.
    5. Si encuentras varios hosts virtuales que coinciden con el mismo alias de host, ve a Resolución para resolver el problema.

    Por ejemplo:

APIs de administración

Usa estas instrucciones para determinar si hay varios hosts virtuales con el mismo alias de host o número de puerto mediante las APIs de Management.

  1. Obtén la definición de cada uno de los hosts virtuales en cada uno de los entornos de tus organizaciones para ver cuáles tienen el mismo alias de host y número de puerto:

    Por ejemplo, si observaste el error 404 con la URL http://example.com:9001/proxy1, debes encontrar qué hosts virtuales tienen el alias de host example.com y el puerto 9001.

    1. Obtén la lista de entornos

      Usuario de la nube pública:

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

      Usuario de la nube privada:

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

      Donde:

      ORGANIZATION_NAME es el nombre de la organización

      Ejemplo:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
      
    2. Obtén la lista de hosts virtuales de un entorno

      Usuario de la nube pública:

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

      Usuario de la nube privada:

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

      Donde:

      ORGANIZATION_NAME es el nombre de la organización

      ENVIRONMENT_NAME es el nombre del entorno.

      Ejemplo:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
      
    3. Obtén la definición de cada uno de los hosts virtuales en el entorno.

      Usuario de la nube pública:

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

      Usuario de la nube privada:

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

      Donde:

      ORGANIZATION_NAME es el nombre de la organización

      ENVIRONMENT_NAME es el nombre del entorno.

      VIRTUAL_HOST_NAME es el nombre del host virtual.

      Ejemplo:

      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. Repite los dos pasos anteriores para los otros entornos de tu organización.

      En este ejemplo, repite los pasos para el entorno 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" : [ ]
      }
      

      En este ejemplo, puedes ver que los dos hosts virtuales default en dos entornos diferentes, test y dev, contienen el mismo alias de host example.com y el mismo número de puerto 9001. Esta es la causa de los errores 404.

    5. Si encuentras varios hosts virtuales que coinciden con el mismo alias de host, ve a Resolución para resolver el problema.

Resolución

  1. Asegúrate de que cada host virtual solo contenga combinaciones de alias y puertos de host únicos.
  2. Si identificaste varios hosts virtuales con las mismas combinaciones de alias de host y puertos, debes actualizarlos con un alias de host único.
  3. Puedes actualizarlos mediante la IU de Edge o la API de Management. Puedes encontrar las instrucciones en Modifica un host virtual.
  4. Asegúrate de que cada alias del host tenga una entrada de DNS adecuada.
  5. En el ejemplo anterior, la configuración se veía de la siguiente manera:
    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. Puedes actualizar el host virtual incorrecto para que no se superpongan.
    2. Es decir, se actualizará el alias del host como example2.com.
    3. Asegúrate de que el nuevo alias de host tenga una entrada de DNS similar a la del alias de host anterior.
      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. Vuelve a realizar las llamadas a la API al proxy y verifica que obtienes respuestas correctas de manera coherente:
    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 el problema persiste, consulta Recopila información de diagnóstico.

Se debe recopilar información de diagnóstico

Si el problema persiste, incluso después de seguir las instrucciones anteriores, recopila la siguiente información de diagnóstico y, luego, comunícate con el equipo de asistencia de Apigee Edge:

Si eres un usuario de la nube pública, proporciona la siguiente información:

  • Nombre de la organización
  • Nombre del entorno
  • Nombre del proxy de API
  • Completa el comando curl para reproducir el error 404
  • Si en este momento no se producen los errores 404, proporciona el período con la información de la zona horaria cuando se produjeron errores 404 en el pasado.

Si eres un usuario de la nube privada, proporciona la siguiente información:

  • Mensaje de error completo observado para las solicitudes con errores
  • Organización, nombre del entorno y nombre del proxy de API para los que observas errores 404
  • Paquete de proxy de API
  • Registros de acceso de NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • Registros de Message Processor
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • El período con la información de zona horaria en el que se produjeron los errores 404