404 Varios hosts virtuales con el mismo alias de host

Estás viendo la documentación de Apigee Edge.
Ir a la documentación de Apigee X.
info

Síntoma

La aplicación cliente obtiene un código de estado HTTP 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 la ruta y el host virtual 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 observes 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. Consulta 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

    Anota el ID del mensaje de los registros.

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

    Mensaje de error de muestra 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 muestran el código de error y el mensaje de error de la siguiente manera:

    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 Message Processors de Apigee Edge usan el encabezado de 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 observarás es un 404 error 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 las 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 a los que el proxy de API no está configurado para aceptar las solicitudes, las APIs fallarán con estos 404 errores.

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

Diagnóstico

Usa uno de los siguientes métodos para determinar si hay varios hosts virtuales que tienen el mismo alias de host o número de puerto que generan errores 404:

  • IU de Edge
  • APIs de administración

IU de Edge

Usa estas instrucciones para determinar si hay varios hosts virtuales que tienen el mismo alias de host o número de puerto con 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 de Edge en la nube privada:
    1. Selecciona Administrar.
    2. Selecciona Hosts virtuales.
    3. Para 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 que usan el mismo alias de host , ve a Solución para resolver este problema.

    Por ejemplo:

  2. En la IU clásica en la nube privada:
    1. Selecciona la pestaña APIs .
    2. Selecciona Configuración del entorno.
    3. Selecciona Hosts virtuales.
    4. Para 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 Solución para resolver este problema.

    Por ejemplo:

APIs de administración

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

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

    Por ejemplo, si observaste el 404 error 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 en 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, ambos contienen el mismo alias de host example.com y el 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 Solución para resolver este problema.

Solución

  1. Asegúrate de que cada host virtual solo contenga combinaciones únicas de alias de host y puerto.
  2. Si identificaste varios hosts virtuales con las mismas combinaciones de alias de host y puerto, debes actualizarlos con un alias de host único.
  3. Puedes actualizarlos con la IU de Edge o la API de administración. Las instrucciones se pueden encontrar en Cómo modificar un host virtual.
  4. Asegúrate de que cada alias de host tenga una entrada DNS adecuada.
  5. En el ejemplo que se analizó anteriormente, si nuestra 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, actualiza el alias de host como example2.com.
    3. Asegúrate de que el nuevo alias de host tenga una entrada 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 obtengas respuestas exitosas 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 Se debe recopilar 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 Asistencia de Apigee Edge:

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

  • Nombre de la organización
  • Nombre del entorno
  • Nombre del proxy de API
  • Comando curl completo para reproducir el error 404
  • Si los errores 404 no ocurren actualmente, proporciona el período con la información de la zona horaria en la que ocurrieron los errores 404 en el pasado.

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

  • Mensaje de error completo observado para las solicitudes con errores
  • Nombre de la organización, el entorno y el proxy de API para los que observas 404 errores
  • 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 la zona horaria en la que ocurrieron los errores 404