Partilhar via


Resolução de problemas de erros de gateway incorreto no Gateway de Aplicação

Saiba como solucionar erros de gateway incorreto (502) recebidos ao usar o Gateway de Aplicativo do Azure.

Nota

Recomendamos que utilize o módulo Azure Az do PowerShell para interagir com o Azure. Para começar, consulte Instalar o Azure PowerShell. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

Descrição geral

Depois de configurar um gateway de aplicativo, um dos erros que você pode ver é Erro de servidor: 502 - O servidor Web recebeu uma resposta inválida enquanto atuava como um gateway ou servidor proxy. Este erro pode acontecer pelas seguintes razões principais:

Grupo de Segurança de Rede, Rota Definida pelo Usuário ou Problema de DNS Personalizado

Motivo

Se o acesso ao back-end estiver bloqueado devido a um NSG, UDR ou DNS personalizado, as instâncias do gateway de aplicativo não poderão acessar o pool de back-end. Esse problema causa falhas de teste, resultando em 502 erros.

O NSG/UDR pode estar presente na sub-rede do gateway de aplicativo ou na sub-rede onde as VMs do aplicativo são implantadas.

Da mesma forma, a presença de um DNS personalizado na VNet também pode causar problemas. Um FQDN usado para membros do pool de back-end pode não ser resolvido corretamente pelo servidor DNS configurado pelo usuário para a rede virtual.

Solução

Valide a configuração de NSG, UDR e DNS seguindo as seguintes etapas:

  1. Verifique os NSGs associados à sub-rede do gateway de aplicativo. Certifique-se de que a comunicação com o back-end não esteja bloqueada. Para obter mais informações, consulte Grupos de segurança de rede.

  2. Verifique UDR associado à sub-rede do gateway de aplicativo. Certifique-se de que o UDR não está direcionando o tráfego para fora da sub-rede de back-end. Por exemplo, verifique se há roteamento para dispositivos virtuais de rede ou rotas padrão que estão sendo anunciadas para a sub-rede do gateway de aplicativo via ExpressRoute/VPN.

    $vnet = Get-AzVirtualNetwork -Name vnetName -ResourceGroupName rgName
    Get-AzVirtualNetworkSubnetConfig -Name appGwSubnet -VirtualNetwork $vnet
    
  3. Verifique o NSG efetivo e roteie com a VM de back-end

    Get-AzEffectiveNetworkSecurityGroup -NetworkInterfaceName nic1 -ResourceGroupName testrg
    Get-AzEffectiveRouteTable -NetworkInterfaceName nic1 -ResourceGroupName testrg
    
  4. Verifique a presença de DNS personalizado na rede virtual. O DNS pode ser verificado observando os detalhes das propriedades da VNet na saída.

    Get-AzVirtualNetwork -Name vnetName -ResourceGroupName rgName 
    DhcpOptions            : {
                               "DnsServers": [
                                 "x.x.x.x"
                               ]
                             }
    
  5. Se estiver presente, verifique se o servidor DNS pode resolver corretamente o FQDN do membro do pool de back-ends.

Problemas com a sonda de integridade padrão

Motivo

Os erros 502 também podem ser indicadores frequentes de que o teste de integridade padrão não pode alcançar VMs de back-end.

Quando uma instância de gateway de aplicativo é provisionada, ela configura automaticamente uma investigação de integridade padrão para cada BackendAddressPool usando propriedades de BackendHttpSetting. Nenhuma entrada do usuário é necessária para definir essa sonda. Especificamente, quando uma regra de balanceamento de carga é configurada, uma associação é feita entre um BackendHttpSetting e um BackendAddressPool. Um teste padrão é configurado para cada uma dessas associações e o gateway de aplicativo inicia uma conexão periódica de verificação de integridade para cada instância no BackendAddressPool na porta especificada no elemento BackendHttpSetting.

A tabela a seguir lista os valores associados à sonda de integridade padrão:

Propriedade da sonda valor Description
URL da sonda http://127.0.0.1/ Caminho do URL
Intervalo 30 Intervalo da sonda em segundos
Limite de Tempo Excedido 30 Tempo limite da sonda em segundos
Limiar com funcionamento incorreto 3 Contagem de novas tentativas da sonda. O servidor back-end é marcado para baixo depois que a contagem de falhas de teste consecutivas atinge o limite não íntegro.

Solução

  • O valor do host da solicitação será definido como 127.0.0.1. Verifique se um site padrão está configurado e escutando em 127.0.0.1.
  • O protocolo da solicitação é determinado pelo protocolo BackendHttpSetting.
  • O caminho do URI será definido como /.
  • Se BackendHttpSetting especificar uma porta diferente de 80, o site padrão deverá ser configurado para escutar nessa porta.
  • A chamada para protocol://127.0.0.1:port deve retornar um código de resultado HTTP de 200. Esse código deve ser retornado dentro do período de tempo limite de 30 segundos.
  • Verifique se a porta configurada está aberta e se não há regras de firewall ou Grupos de Segurança de Rede do Azure bloqueando o tráfego de entrada ou de saída na porta configurada.
  • Se as VMs clássicas do Azure ou o Serviço de Nuvem forem usados com um FQDN ou um IP público, verifique se o ponto de extremidade correspondente está aberto.
  • Se a VM estiver configurada por meio do Gerenciador de Recursos do Azure e estiver fora da VNet onde o gateway de aplicativo é implantado, um Grupo de Segurança de Rede deverá ser configurado para permitir o acesso na porta desejada.

Para obter mais informações, consulte Configuração da infraestrutura do Application Gateway.

Problemas com a sonda de integridade personalizada

Motivo

As sondas de integridade personalizadas permitem flexibilidade adicional ao comportamento de sondagem padrão. Ao usar testes personalizados, você pode configurar o intervalo de teste, a URL, o caminho para testar e quantas respostas com falha aceitar antes de marcar a instância do pool de back-end como não íntegra.

As seguintes propriedades adicionais são adicionadas:

Propriedade da sonda Description
Name Nome da sonda. Esse nome é usado para se referir à sonda nas configurações HTTP de back-end.
Protocolo Protocolo usado para enviar a sonda. O teste usa o protocolo definido nas configurações HTTP de back-end
Host Nome do host para enviar a sonda. Aplicável somente quando o multissite está configurado no gateway de aplicativo. Isso é diferente do nome do host da VM.
Caminho Caminho relativo da sonda. O caminho válido começa em '/'. O teste é enviado para <protocol>://<host>:<port><path>
Intervalo Intervalo da sonda em segundos. Este é o intervalo de tempo entre duas sondas consecutivas.
Limite de Tempo Excedido Tempo limite da sonda em segundos. Se uma resposta válida não for recebida dentro desse período de tempo limite, a sonda será marcada como falha.
Limiar com funcionamento incorreto Contagem de novas tentativas da sonda. O servidor back-end é marcado para baixo depois que a contagem de falhas de teste consecutivas atinge o limite não íntegro.

Solução

Valide se a Sonda de Integridade Personalizada está configurada corretamente, conforme mostrado na tabela anterior. Além das etapas de solução de problemas anteriores, verifique também o seguinte:

  • Certifique-se de que a sonda está especificada corretamente de acordo com o guia.
  • Se o gateway de aplicativo estiver configurado para um único site, por padrão, o nome do host deverá ser especificado como 127.0.0.1, a menos que configurado de outra forma na sonda personalizada.
  • Certifique-se de que uma chamada para o caminho> http://< host>:<port><retorne um código de resultado HTTP de 200.
  • Certifique-se de que Interval, Timeout e UnhealtyThreshold estejam dentro dos intervalos aceitáveis.
  • Se estiver usando uma sonda HTTPS, certifique-se de que o servidor back-end não exija SNI configurando um certificado de fallback no próprio servidor back-end.

Tempo limite de solicitação

Motivo

Quando recebe um pedido do utilizador, o gateway de aplicação aplica as regras configuradas ao pedido e encaminha-o para uma instância de conjunto de back-end. Este aguarda um intervalo de tempo configurável para obter uma resposta da instância de back-end. Por padrão, esse intervalo é de 20 segundos. No Gateway de Aplicação v1, se o gateway de aplicação não receber uma resposta da aplicação de back-end neste intervalo, o pedido do utilizador receberá um erro 502. No Application Gateway v2, se o gateway de aplicativo não receber uma resposta do aplicativo back-end nesse intervalo, a solicitação será tentada contra um segundo membro do pool de back-end. Se a segunda solicitação falhar, a solicitação do usuário receberá um erro 504.

Solução

O Application Gateway permite que você defina essa configuração por meio do BackendHttpSetting, que pode ser aplicado a pools diferentes. Pools de back-end diferentes podem ter BackendHttpSetting diferente e um tempo limite de solicitação diferente configurado.

    New-AzApplicationGatewayBackendHttpSettings -Name 'Setting01' -Port 80 -Protocol Http -CookieBasedAffinity Enabled -RequestTimeout 60

BackendAddressPool vazio

Motivo

Se o gateway de aplicativo não tiver VMs ou conjunto de escala de máquina virtual configurado no pool de endereços de back-end, ele não poderá rotear nenhuma solicitação do cliente e enviará um erro de gateway incorreto.

Solução

Verifique se o pool de endereços de back-end não está vazio. Isso pode ser feito via PowerShell, CLI ou portal.

Get-AzApplicationGateway -Name "SampleGateway" -ResourceGroupName "ExampleResourceGroup"

A saída do cmdlet anterior deve conter pool de endereços de back-end não vazio. O exemplo a seguir mostra dois pools retornados que são configurados com um FQDN ou um endereço IP para as VMs de back-end. O estado de provisionamento do BackendAddressPool deve ser 'Succeeded'.

BackendAddressPoolsText:

[{
    "BackendAddresses": [{
        "ipAddress": "10.0.0.10",
        "ipAddress": "10.0.0.11"
    }],
    "BackendIpConfigurations": [],
    "ProvisioningState": "Succeeded",
    "Name": "Pool01",
    "Etag": "W/\"00000000-0000-0000-0000-000000000000\"",
    "Id": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/applicationGateways/<application gateway name>/backendAddressPools/pool01"
}, {
    "BackendAddresses": [{
        "Fqdn": "xyx.cloudapp.net",
        "Fqdn": "abc.cloudapp.net"
    }],
    "BackendIpConfigurations": [],
    "ProvisioningState": "Succeeded",
    "Name": "Pool02",
    "Etag": "W/\"00000000-0000-0000-0000-000000000000\"",
    "Id": "/subscriptions/<subscription id>/resourceGroups/<resource group name>/providers/Microsoft.Network/applicationGateways/<application gateway name>/backendAddressPools/pool02"
}]

Instâncias não íntegras em BackendAddressPool

Motivo

Se todas as instâncias de BackendAddressPool não estiverem íntegras, o gateway de aplicativo não terá nenhum back-end para encaminhar a solicitação do usuário. Isso também pode ser o caso quando as instâncias de back-end estão íntegras, mas não têm o aplicativo necessário implantado.

Solução

Verifique se as instâncias estão íntegras e se o aplicativo está configurado corretamente. Verifique se as instâncias de back-end podem responder a um ping de outra VM na mesma VNet. Se configurado com um ponto de extremidade público, verifique se uma solicitação do navegador para o aplicativo Web é útil.

O certificado SSL upstream não corresponde

Motivo

O certificado TLS instalado em servidores back-end não corresponde ao nome do host recebido no cabeçalho da solicitação do host.

Em cenários onde o TLS de ponta a ponta está habilitado, uma configuração que é obtida editando as "Configurações HTTP de back-end" apropriadas e alterando a configuração da configuração de "Protocolo de back-end" para HTTPS, é obrigatório garantir que o CNAME do certificado TLS instalado nos servidores back-end corresponda ao nome do host que vem para o back-end na solicitação de cabeçalho de host HTTP.

Como lembrete, o efeito de habilitar nas "Configurações HTTP de back-end" a opção de protocolo HTTPS em vez de HTTP, será que a segunda parte da comunicação que acontece entre as instâncias do Application Gateway e os servidores de back-end será criptografada com TLS.

Devido ao fato de que, por padrão, o Application Gateway envia o mesmo cabeçalho de host HTTP para o back-end que recebe do cliente, você precisará garantir que o certificado TLS instalado no servidor de back-end seja emitido com um CNAME que corresponda ao nome do host recebido por esse servidor de back-end no cabeçalho de host HTTP. Lembre-se de que, a menos que especificado de outra forma, esse nome de host seria o mesmo que o recebido do cliente.

Por exemplo:

Imagine que você tem um Application Gateway para atender às solicitações https para www.contoso.com de domínio. Você pode ter o domínio contoso.com delegado a uma Zona Pública de DNS do Azure e um registro DNS A nessa zona apontando www.contoso.com para o IP público do Gateway de Aplicativo específico que atenderá às solicitações.

Nesse Application Gateway, você deve ter um ouvinte para o host www.contoso.com com uma regra que tenha a "Configuração HTTP com backup" forçada a usar o protocolo HTTPS (garantindo TLS de ponta a ponta). Essa mesma regra poderia ter configurado um pool de back-end com duas VMs executando o IIS como servidores Web.

Como sabemos, habilitar HTTPS na "Configuração HTTP com backup" da regra fará com que a segunda parte da comunicação que acontece entre as instâncias do Application Gateway e os servidores no back-end use TLS.

Se os servidores back-end não tiverem um certificado TLS emitido para o CNAME www.contoso.com ou *.contoso.com, a solicitação falhará com Erro do servidor: 502 - O servidor Web recebeu uma resposta inválida ao agir como um gateway ou servidor proxy porque o certificado SSL upstream (o certificado instalado nos servidores back-end) não corresponderá ao nome do host no cabeçalho do host, e, portanto, a negociação TLS falhará.

www.contoso.com --> APP GW front-end IP --> Ouvinte com uma regra que configura "Configurações HTTP de back-end" para usar o protocolo HTTPS em vez de HTTP --> Pool de back-end --> Servidor Web (precisa ter um certificado TLS instalado para www.contoso.com)

Solução

é necessário que o CNAME do certificado TLS instalado no servidor back-end, corresponda ao nome do host configurado nas configurações de back-end HTTP, caso contrário, a segunda parte da comunicação de ponta a ponta que acontece entre as instâncias do Application Gateway e o back-end, falhará com "O certificado SSL Upstream não corresponde" e lançará de volta um erro do servidor: 502 - O servidor Web recebeu uma resposta inválida ao agir como um gateway ou servidor proxy

Próximos passos

Se as etapas anteriores não resolverem o problema, abra um tíquete de suporte.