404 Vários hosts virtuais com o mesmo alias de host

Você está lendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
info

Sintoma

O aplicativo cliente recebe um código de status HTTP 404 com a mensagem Not Found e a mensagem de erro Unable to identify proxy for host: VIRTUAL_HOST and url: PATH como resposta às chamadas de API.

Esse erro significa que o Edge não conseguiu encontrar o proxy de API para o host virtual e o caminho especificados.

Mensagem de erro

O aplicativo cliente recebe o seguinte código de resposta:

HTTP/1.1 404 Not Found

Além disso, você pode observar uma mensagem de erro semelhante à mostrada abaixo:

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

Causas possíveis

Causa Descrição Instruções de solução de problemas aplicáveis para
Host virtual com alias de host duplicado Vários hosts virtuais têm o mesmo alias de host e número de porta. Usuários da nuvem pública e privada do Edge

Etapas comuns do diagnóstico

Os registros do NGINX e do processador de mensagens serão úteis para resolver o erro 404. Siga estas etapas para verificar os registros:

  1. Visualize os registros do NGINX usando o seguinte comando:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. Verifique os seguintes campos nas entradas de registro:
    Campo Valor
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    Anote o ID da mensagem nos registros.

  3. Verifique os registros do processador de mensagens (/opt/apigee/var/log/edge-message-processor/logs/system.log) para saber se você tem messaging.adaptors.http.flow.ApplicationNotFound para a API específica ou se tem o ID de mensagem exclusivo da etapa 2 para a solicitação de API.

    Exemplo de mensagem de erro do registro do processador de mensagens

  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)

    O registro acima mostra o código e a mensagem de erro da seguinte maneira:

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

Causa: vários hosts virtuais com o mesmo alias de host e número de porta

Os roteadores e processadores de mensagens do Apigee Edge usam o cabeçalho do host, o número da porta e os caminhos de URI para rotear o tráfego para o proxy de API correto. Ter definições ambíguas, como vários hosts virtuais com o mesmo alias de host e número de porta, é um antipadrão documentado e pode levar a comportamentos inesperados. Um dos erros comuns que você vai observar é um 404 erro com a mensagem Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

Normalmente, se houver vários hosts virtuais com o mesmo alias de host, você vai observar erros 404 intermitentes. Isso ocorre porque o proxy de API específico pode ser configurado para aceitar as solicitações em apenas um dos hosts virtuais. Quando as solicitações de API são roteadas para o host virtual específico configurado no proxy de API, você recebe uma resposta bem-sucedida. No entanto, quando as solicitações de API são roteadas para os outros hosts virtuais em que o proxy de API não está configurado para aceitar as solicitações, as APIs falham com estes 404 erros.

Siga as instruções fornecidas em 404 Não foi possível identificar o proxy para o host: <nome do host virtual> e o URL: <caminho> e resolva esse erro. Se nenhuma das causas estiver levando a esse erro, use as etapas abaixo para determinar se os hosts virtuais com aliases de host duplicados estão causando os 404 erros.

Diagnóstico

Use um dos métodos a seguir para determinar se há vários hosts virtuais com o mesmo alias de host/número de porta que levam a 404 erros:

  • Interface do Edge
  • APIs de gerenciamento

Interface do Edge

Use estas instruções para determinar se há vários hosts virtuais com o mesmo alias de host/número de porta usando a interface do Edge.

Por exemplo, se você observou o erro 404 com o URL http://example.com:9001/proxy1, será necessário encontrar quais hosts virtuais têm o alias de host example.com e a porta 9001.

  1. Na nuvem pública e na nova interface do Edge na nuvem privada:
    1. Selecione Administrador.
    2. Selecione Hosts virtuais.
    3. Para cada ambiente, use o filtro de pesquisa para determinar os hosts virtuais que correspondem ao alias de host específico com que as solicitações de API foram invocadas.
    4. Se você encontrar vários hosts virtuais usando o mesmo alias de host , acesse Resolução para resolver esse problema.

    Por exemplo:

  2. Na interface clássica na nuvem privada:
    1. Selecione a guia APIs .
    2. Selecione Configuração do ambiente.
    3. Selecione Hosts virtuais.
    4. Para cada ambiente, confira a lista de hosts virtuais para saber se algum corresponde ao alias de host específico com que as solicitações de API foram invocadas.
    5. Se você encontrar vários hosts virtuais que correspondam ao mesmo alias de host , acesse Resolução para resolver esse problema.

    Por exemplo:

APIs de gerenciamento

Use estas instruções para determinar se há vários hosts virtuais com o mesmo alias de host/número de porta usando as APIs de gerenciamento.

  1. Receba a definição de cada um dos hosts virtuais em cada um dos ambientes nas suas organizações para saber quais hosts virtuais têm o mesmo alias de host e número de porta:

    Por exemplo, se você observou o erro 404 com o URL http://example.com:9001/proxy1, será necessário encontrar quais hosts virtuais têm o alias de host example.com e a porta 9001.

    1. Acessar a lista de ambientes

      Usuário da nuvem pública:

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

      Usuário da nuvem privada:

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

      Em que:

      ORGANIZATION_NAME é o nome da organização

      Exemplo:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
    2. Acessar a lista de hosts virtuais em um ambiente

      Usuário da nuvem pública:

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

      Usuário da nuvem privada:

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

      Em que:

      ORGANIZATION_NAME é o nome da organização

      ENVIRONMENT_NAME é o nome do ambiente

      Exemplo:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
    3. Acessar a definição de cada um dos hosts virtuais no ambiente.

      Usuário da nuvem pública:

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

      Usuário da nuvem privada:

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

      Em que:

      ORGANIZATION_NAME é o nome da organização

      ENVIRONMENT_NAME é o nome do ambiente

      VIRTUAL_HOST_NAME é o nome do host virtual

      Exemplo:

      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. Repita as duas etapas acima para os outros ambientes da sua organização.

      Neste exemplo, repita as etapas para o 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" : [ ]
      }

      Neste exemplo, é possível observar que os dois hosts virtuais default em dois ambientes diferentes, test e dev, contêm o mesmo alias de host example.com e número de porta 9001. Essa é a causa dos erros 404.

    5. Se você encontrar vários hosts virtuais que correspondam ao mesmo alias de host , acesse Resolução para resolver esse problema.

Resolução

  1. Verifique se cada host virtual contém apenas combinações exclusivas de alias de host e porta.
  2. Se você identificou vários hosts virtuais com o mesmo alias de host e combinações de porta então você deve atualizá-los com um alias de host exclusivo.
  3. É possível atualizar esses hosts usando a interface do Edge ou a API Management. As instruções podem ser encontradas em Modificar um host virtual.
  4. Verifique se cada alias de host tem uma entrada DNS adequada.
  5. No exemplo discutido acima, se nossa configuração fosse assim:
    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. É possível atualizar o host virtual incorreto para que eles não se sobreponham.
    2. Ou seja, atualize o alias de host como example2.com.
    3. Verifique se o novo alias de host tem uma entrada DNS semelhante ao 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. Faça as chamadas de API novamente para o proxy e verifique se você está recebendo respostas bem-sucedidas de forma consistente:
    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 o problema persistir, acesse Precisa de informações de diagnóstico.

É necessário coletar informações de diagnóstico

Se o problema persistir mesmo depois de seguir as instruções acima, reúna as seguintes informações de diagnóstico e entre em contato com o suporte do Apigee Edge:

Se você for um usuário da nuvem pública, forneça as seguintes informações:

  • Nome da organização
  • Nome do ambiente
  • Nome do proxy de API
  • Comando curl completo para reproduzir o erro 404
  • Se os erros 404 não estiverem ocorrendo no momento, forneça o período com as informações de fuso horário em que os erros 404 ocorreram no passado.

Se você for um usuário da nuvem privada, forneça as seguintes informações:

  • Mensagem de erro completa observada para as solicitações com falha
  • Nome da organização, do ambiente e do proxy de API para o qual você está observando 404 erros
  • Pacote de proxy de API
  • Registros de acesso do NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • Registros do processador de mensagens
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • O período com as informações de fuso horário em que os erros 404 ocorreram