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

Você está vendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
informações

Sintoma

O aplicativo cliente recebe um código de status HTTP 404 com a mensagem Not Found e 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 este código de resposta:

HTTP/1.1 404 Not Found

Além disso, talvez você veja 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 de nuvens públicas e privadas de borda

Etapas comuns do diagnóstico

Os registros do NGINX e do Processador de mensagens serão úteis na solução de problemas do erro 404. Siga estas etapas para verificar os registros:

  1. Acesse 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 dos registros.

  3. Verifique os registros do processador de mensagens (/opt/apigee/var/log/edge-message-processor/logs/system.log)) para ver se você tem messaging.adaptors.http.flow.ApplicationNotFound para a API específica ou se tem o ID da 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 a seguir:

    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 da Apigee usam o cabeçalho do host, o número da porta e os caminhos do 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ê observará é um erro 404 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ê notará erros 404 intermitentes. Isso ocorre porque o proxy da API específico pode ser configurado para aceitar as solicitações em apenas um dos hosts virtuais. Quando as solicitações de API forem encaminhadas para o host virtual específico configurado no proxy de API, você receberá uma resposta bem-sucedida. No entanto, quando as solicitações de API forem roteadas para outros hosts virtuais em que o proxy da API não está configurado para aceitar as solicitações, as APIs falharão com esses erros 404.

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

Diagnóstico

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

  • 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/porta de host usando a IU do Edge.

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

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

    Exemplo:

  2. Em IU clássica na nuvem privada:
    1. Selecione a guia APIs .
    2. Selecione Configuração do ambiente.
    3. Selecione Virtual Hosts.
    4. Para cada Environment, confira a lista de Virtual Hosts para verificar se algum deles corresponde ao Alias do host específico com que as solicitações da API foram invocadas.
    5. Se você encontrar vários hosts virtuais correspondentes 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/porta de host usando as APIs de gerenciamento.

  1. Receba a definição de cada um dos hosts virtuais em cada um dos ambientes das suas organizações para ver 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, precisará descobrir 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. Acesse 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 ver que os dois hosts virtuais default em dois ambientes diferentes, test e dev, contêm o mesmo alias de host example.com e o mesmo número de porta 9001. Essa é a causa dos erros 404.

    5. Se você encontrar vários hosts virtuais correspondentes 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 as mesmas combinações de alias e porta de host, atualize-os com um alias de host exclusivo.
  3. É possível atualizá-los usando a IU do Edge ou a API Management. As instruções podem ser encontradas em Como 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 tivesse esta aparência:
    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. Isso é atualizar o alias do host como example2.com.
    3. Verifique se o novo alias de host tem uma entrada DNS semelhante à do alias 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 maneira 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, colete as informações de diagnóstico a seguir 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
  • Conclua o comando curl 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:

  • Concluir a mensagem de erro observada para as solicitações com falha
  • Organização, nome do ambiente e nome do proxy de API em que você está observando erros 404
  • 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 ocorreram os erros 404