O Gateway de Aplicativo do Azure permite que você tenha um aplicativo do Serviço de Aplicativo ou outro serviço multilocatário como um membro do pool de back-end. Neste artigo, você aprenderá a configurar um aplicativo do Serviço de Aplicativos com o Gateway de Aplicações. A configuração do Gateway de Aplicativo difere dependendo de como o Serviço de Aplicativo pode ser acessado:
- A primeira opção usa um domínio personalizado no Gateway de Aplicativo e no Serviço de Aplicativo no back-end.
- A segunda opção é fazer com que o Gateway de Aplicativo acesse o Serviço de Aplicativo usando seu domínio padrão, com o sufixo ".azurewebsite.net".
Essa configuração é recomendada para cenários de nível de produção e atende à prática de não alterar o nome do host no fluxo de solicitação. Você precisa ter um domínio personalizado (e o certificado associado) disponível para evitar depender do domínio padrão ".azurewebsites.net".
O mesmo nome de domínio para o Gateway de Aplicativo e o Serviço de Aplicativo no pool de back-end, o fluxo de solicitação não precisa substituir o nome do host. O aplicativo Web de back-end vê o host original como foi usado pelo cliente.
Essa configuração é a mais fácil e não requer um domínio personalizado. Assim, é possível fazer uma configuração rápida e conveniente.
Quando o serviço de aplicativo não tem um domínio personalizado associado a ele, o cabeçalho do host na solicitação de entrada no aplicativo web precisa ser definido como o domínio padrão, terminado em ".azurewebsites.net"; caso contrário, a plataforma não conseguirá rotear corretamente a solicitação.
O cabeçalho do host na solicitação original recebida pelo Gateway de Aplicativo é diferente do nome do host do Serviço de Aplicativo de back-end.
Neste artigo, você aprenderá a:
- Configurar DNS
- Adicione o Serviço de Aplicativo como pool de back-end do Gateway de Aplicativo
- Defina as configurações HTTP para a conexão com o Serviço de Aplicativo
- Configurar um ouvinte HTTP
- Configurar uma regra de roteamento de solicitação
Pré-requisitos
Configuração do DNS
No contexto desse cenário, o DNS é relevante em dois locais:
- O nome DNS, que o usuário ou cliente está usando para Gateway de Aplicativo e o que é mostrado em um navegador
- O nome DNS, que o Gateway de Aplicativo está usando internamente para acessar o Serviço de Aplicativo no back-end
Roteie o usuário ou o cliente para o Gateway de Aplicativo usando o domínio personalizado. Configure o DNS usando um alias CNAME apontado para o DNS para o Gateway de Aplicativo. O DNS do Gateway de Aplicativo é mostrado na página de visão geral do endereço IP público associado. Como alternativa, crie um registro A apontando diretamente para o endereço IP. (Para o Gateway de Aplicativo V1, o VIP poderá mudar se você parar e iniciar o serviço, o que torna essa opção indesejável.)
O App Service deve ser configurado para aceitar tráfego proveniente do Application Gateway usando o nome de domínio personalizado como host de entrada. Para obter mais informações sobre como mapear um domínio personalizado para o Serviço de Aplicativo, consulte Tutorial: mapear um nome DNS personalizado existente para o Serviço de Aplicativo do Azure Para verificar o domínio, o Serviço de Aplicativo requer apenas a adição de um registro TXT. Nenhuma alteração é necessária em CNAME ou registros A. A configuração de DNS para o domínio personalizado permanece direcionada para o Application Gateway.
Para aceitar conexões com o Serviço de Aplicativo por HTTPS, configure sua associação TLS. Para obter mais informações, consulte Proteger um nome DNS personalizado com uma associação TLS/SSL no Serviço de Aplicativo do Azure configurar o Serviço de Aplicativo para efetuar pull do certificado para o domínio personalizado do Azure Key Vault.
Quando nenhum domínio personalizado está disponível, o usuário ou o cliente pode acessar o Gateway de Aplicativo usando o endereço IP do gateway ou seu endereço DNS. O DNS do Gateway de Aplicativo pode ser encontrado na página de visão geral do endereço IP público associado. Não ter um domínio personalizado disponível implica que nenhum certificado assinado publicamente não está disponível para TLS no Gateway de Aplicativo. Os clientes estão restritos a usar HTTP ou HTTPS com um certificado autoassinado, ambos indesejáveis.
Para se conectar ao Serviço de Aplicativo, o Gateway de Aplicativo usa o domínio padrão, conforme fornecido pelo Serviço de Aplicativo (com sufixo "azurewebsites.net").
Adicionar serviço de Aplicativo como pool de back-end
No portal do Azure, selecione o gateway de aplicativo.
Em Pools de back-end, selecione o pool de back-end.
Em Tipo de destino, selecione Serviços de Aplicativos.
Em Destino, selecione o Serviço de Aplicativo.
Observação
A lista suspensa popula apenas os serviços de aplicativo que estão na mesma assinatura que o Gateway de Aplicativo. Se você quiser usar um serviço de aplicativo que está em uma assinatura diferente daquela em que o Gateway de Aplicativo está, em vez de escolher Serviços de Aplicativos na lista suspensa de Destinos, escolha a opção Endereço IP ou nome do host e insira o nome do host (example.azurewebsites.net) do serviço de aplicativo. Caso esteja usando pontos de extremidade privados com o Serviço de Aplicativo, deverá usar o FQDN ou o endereço IP do ponto de extremidade privado.
Selecione Salvar.
# Fully qualified default domain name of the web app:
$webAppFQDN = "<nameofwebapp>.azurewebsite.net"
# For Application Gateway: both name, resource group and name for the backend pool to create:
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$appGwBackendPoolNameForAppSvc = "<name for backend pool to be added>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Add a new Backend Pool with App Service in there:
Add-AzApplicationGatewayBackendAddressPool -Name $appGwBackendPoolNameForAppSvc -ApplicationGateway $gw -BackendFqdns $webAppFQDN
# Update Application Gateway with the new added Backend Pool:
Set-AzApplicationGateway -ApplicationGateway $gw
Editar configurações de HTTP para o Serviço de Aplicativo
É necessária uma configuração HTTP que instrui o Gateway de Aplicativo a acessar o back-end do Serviço de Aplicativo usando o nome de domínio personalizado. A configuração HTTP, por padrão, usa a sonda de saúde padrão. Embora as sondas de integridade padrão encaminhem solicitações com o nome do host no qual o tráfego é recebido, as sondas de integridade podem utilizar 127.0.0.1 como o nome do host para o pool de back-end, já que nenhum nome de host foi definido explicitamente. Por esse motivo, é preciso criar uma investigação de integridade personalizada configurada com o nome de domínio personalizado correto como seu nome de host.
Nos conectamos ao back-end usando HTTPS.
- Em Configurações HTTP, selecione uma configuração HTTP existente ou adicione uma nova.
- Ao criar uma nova Configuração HTTP, dê a ela um nome
- Selecione HTTPS como o protocolo de back-end desejado usando a porta 443
- Se o certificado for assinado por uma autoridade conhecida, selecione "Sim" para "Certificado de Autoridade de Certificação conhecido pelo usuário". Como alternativa, defina Adicionar os certificados de autenticação/certificados raiz confiáveis dos servidores de back-end
- Certifique-se de definir "Substituir por novo nome de host" como "Não"
- Selecione a investigação de integridade HTTPS personalizada no menu suspenso para "Investigação personalizada".
É necessária uma Configuração HTTP que instrui o Gateway de Aplicativo a acessar o back-end do Serviço de Aplicativo usando o nome de domínio ("azurewebsites.net") padrão. Para fazer isso, a Configuração HTTP substituirá explicitamente o nome do host.
- Em Configurações HTTP, selecione uma configuração HTTP existente ou adicione uma nova.
- Ao criar uma nova Configuração HTTP, dê a ela um nome
- Selecione HTTPS como o protocolo de back-end desejado usando a porta 443
- Se o certificado for assinado por uma autoridade conhecida, selecione "Sim" para "Certificado de autoridade de certificação conhecido pelo usuário". Como alternativa, adicione certificados de autenticação ou certificados raiz confiáveis dos servidores de back-end.
- Certifique-se de definir "Substituir por novo nome de host" como "Sim"
- Em "Substituição do nome do host", selecione "Escolher nome do host do destino de back-end". Essa configuração faz com que a solicitação para o Serviço de Aplicativo use o nome do host "azurewebsites.net", conforme configurado no Pool de Back-end.
# Configure Application Gateway to connect to App Service using the incoming hostname
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$customProbeName = "<name for custom health probe>"
$customDomainName = "<FQDN for custom domain associated with App Service>"
$httpSettingsName = "<name for http settings to be created>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Add custom health probe using custom domain name:
Add-AzApplicationGatewayProbeConfig -Name $customProbeName -ApplicationGateway $gw -Protocol Https -HostName $customDomainName -Path "/" -Interval 30 -Timeout 120 -UnhealthyThreshold 3
$probe = Get-AzApplicationGatewayProbeConfig -Name $customProbeName -ApplicationGateway $gw
# Add HTTP Settings to use towards App Service:
Add-AzApplicationGatewayBackendHttpSettings -Name $httpSettingsName -ApplicationGateway $gw -Protocol Https -Port 443 -Probe $probe -CookieBasedAffinity Disabled -RequestTimeout 30
# Update Application Gateway with the new added HTTP settings and probe:
Set-AzApplicationGateway -ApplicationGateway $gw
# Configure Application Gateway to connect to backend using default App Service hostname
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$httpSettingsName = "<name for http settings to be created>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Add HTTP Settings to use towards App Service:
Add-AzApplicationGatewayBackendHttpSettings -Name $httpSettingsName -ApplicationGateway $gw -Protocol Https -Port 443 -PickHostNameFromBackendAddress -CookieBasedAffinity Disabled -RequestTimeout 30
# Update Application Gateway with the new added HTTP settings and probe:
Set-AzApplicationGateway -ApplicationGateway $gw
Para aceitar o tráfego, precisamos configurar um Ouvinte. Para obter mais informações sobre o ouvinte, consulte a configuração do ouvinte do Gateway de Aplicações.
- Abra a seção "Ouvintes" e escolha "Adicionar ouvinte" ou selecione um existente para editar
- Para um novo ouvinte: dê a ele um nome
- Em "IP de front-end", selecione o endereço IP a ser escutado
- Em "Porta", selecione 443
- Em "Protocolo", selecione "HTTPS"
- Em "Escolher um certificado", selecione "Escolher um certificado no Key Vault". Para obter mais informações, consulte Usando o Key Vault em que você encontra mais informações sobre como atribuir uma identidade gerenciada e fornecer direitos ao seu Key Vault.
- Dê um nome ao certificado
- Selecionar a identidade gerenciada
- Selecione o Key Vault de onde obter o certificado
- Selecionar o certificado
- Em "Tipo de Ouvinte", selecione "Básico"
- Selecione "Adicionar" para adicionar o ouvinte
Supondo que não haja nenhum domínio personalizado disponível ou certificado associado, configure o Gateway de Aplicativo para escutar o tráfego HTTP na porta 80. Como alternativa, confira as instruções de como Criar um certificado autoassinado
- Abra a seção "Ouvintes" e escolha "Adicionar ouvinte" ou selecione um existente para editar
- Para um novo ouvinte: dê a ele um nome
- Em "IP de front-end", selecione o endereço IP a ser escutado
- Em "Porta", selecione 80
- Em "Protocolo", selecione "HTTP"
# This script assumes that:
# - a certificate was imported in Azure Key Vault already
# - a managed identity was assigned to Application Gateway with access to the certificate
# - there is no HTTP listener defined yet for HTTPS on port 443
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$appGwSSLCertificateName = "<name for ssl cert to be created within Application Gateway"
$appGwSSLCertificateKeyVaultSecretId = "<key vault secret id for the SSL certificate to use>"
$httpListenerName = "<name for the listener to add>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Create SSL certificate object for Application Gateway:
Add-AzApplicationGatewaySslCertificate -Name $appGwSSLCertificateName -ApplicationGateway $gw -KeyVaultSecretId $appGwSSLCertificateKeyVaultSecretId
$sslCert = Get-AzApplicationGatewaySslCertificate -Name $appGwSSLCertificateName -ApplicationGateway $gw
# Fetch public ip associated with Application Gateway:
$ipAddressResourceId = $gw.FrontendIPConfigurations.PublicIPAddress.Id
$ipAddressResource = Get-AzResource -ResourceId $ipAddressResourceId
$publicIp = Get-AzPublicIpAddress -ResourceGroupName $ipAddressResource.ResourceGroupName -Name $ipAddressResource.Name
$frontendIpConfig = $gw.FrontendIpConfigurations | Where-Object {$_.PublicIpAddress -ne $null}
$port = New-AzApplicationGatewayFrontendPort -Name "port_443" -Port 443
Add-AzApplicationGatewayFrontendPort -Name "port_443" -ApplicationGateway $gw -Port 443
Add-AzApplicationGatewayHttpListener -Name $httpListenerName -ApplicationGateway $gw -Protocol Https -FrontendIPConfiguration $frontendIpConfig -FrontendPort $port -SslCertificate $sslCert
# Update Application Gateway with the new HTTPS listener:
Set-AzApplicationGateway -ApplicationGateway $gw
Em muitos casos, existe um ouvinte público para HTTP na porta 80. O script abaixo criará um, se ainda não for o caso.
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$httpListenerName = "<name for the listener to add if not exists yet>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Check if HTTP listener on port 80 already exists:
$port = $gw.FrontendPorts | Where-Object {$_.Port -eq 80}
$listener = $gw.HttpListeners | Where-Object {$_.Protocol.ToString().ToLower() -eq "http" -and $_.FrontendPort.Id -eq $port.Id}
if ($listener -eq $null){
$frontendIpConfig = $gw.FrontendIpConfigurations | Where-Object {$_.PublicIpAddress -ne $null}
Add-AzApplicationGatewayHttpListener -Name $httpListenerName -ApplicationGateway $gw -Protocol Http -FrontendIPConfiguration $frontendIpConfig -FrontendPort $port
# Update Application Gateway with the new HTTPS listener:
Set-AzApplicationGateway -ApplicationGateway $gw
}
O pool de back-end configurado anteriormente e as configurações HTTP, a regra de roteamento de solicitação pode ser configurada para pegar o tráfego de um ouvinte e encaminhá-lo para o pool de back-end usando as configurações HTTP. Para isso, verifique se você tem um ouvinte HTTP ou HTTPS disponível que ainda não esteja associado a uma regra de roteamento existente.
- Em "Regras", selecione para adicionar uma nova "Regra de roteamento de solicitação"
- Forneça a regra com um nome
- Selecione um ouvinte HTTP ou HTTPS que ainda não esteja associado a uma regra de roteamento existente
- Em "Destinos de back-end", escolha o pool de back-end em que o Serviço de Aplicativo foi configurado
- Defina as configurações HTTP com as quais o Gateway de Aplicativo deve se conectar ao back-end do Serviço de Aplicativo
- Selecione "Adicionar" para salvar esta configuração
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$httpListenerName = "<name for existing http listener (without rule) to route traffic from>"
$httpSettingsName = "<name for http settings to use>"
$appGwBackendPoolNameForAppSvc = "<name for backend pool to route to>"
$reqRoutingRuleName = "<name for request routing rule to be added>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Get HTTP Settings:
$httpListener = Get-AzApplicationGatewayHttpListener -Name $httpListenerName -ApplicationGateway $gw
$httpSettings = Get-AzApplicationGatewayBackendHttpSettings -Name $httpSettingsName -ApplicationGateway $gw
$backendPool = Get-AzApplicationGatewayBackendAddressPool -Name $appGwBackendPoolNameForAppSvc -ApplicationGateway $gw
# Add routing rule:
Add-AzApplicationGatewayRequestRoutingRule -Name $reqRoutingRuleName -ApplicationGateway $gw -RuleType Basic -BackendHttpSettings $httpSettings -HttpListener $httpListener -BackendAddressPool $backendPool
# Update Application Gateway with the new routing rule:
Set-AzApplicationGateway -ApplicationGateway $gw
Testando
Antes de fazermos isso, certifique-se de que a integridade do back-end seja mostrada como íntegra:
Abra a seção "Integridade do back-end" e verifique se a coluna "Status" indica a combinação de Configuração HTTP e Pool de back-end como "Íntegra".
Agora, navegue até o aplicativo Web usando o endereço IP do Gateway de Aplicativo ou o nome DNS associado para o endereço IP. Ambos podem ser encontrados na página "Visão geral" do Gateway de Aplicações como uma propriedade em "Essenciais". Como alternativa, o recurso de Endereço IP Público também mostra o endereço IP e o nome DNS associado.
Preste atenção à seguinte lista não completa de possíveis sintomas ao testar o aplicativo:
- redirecionamentos apontando para ".azurewebsite.net" diretamente em vez de para o Gateway de Aplicações
- inclui redirecionamentos de autenticação que tentam acessar ".azurewebsite.net" diretamente
- cookies com limite de domínio que não estão sendo passados para o back-end
- incluir o uso da configuração de "afinidade ARR" no Serviço de Aplicativo
As condições acima (explicadas mais detalhadamente no Centro de arquitetura) indicarão que o seu aplicativo Web não lida bem com a reescrita do nome do host. Isso é comumente visto. A maneira recomendada de lidar com isso é seguir as instruções de configuração do Gateway de Aplicativo com o Serviço de Aplicativo usando um domínio personalizado. Consulte também: Solucionar problemas do Serviço de Aplicações no Gateway de Aplicação.
Abra a seção "Integridade do back-end" e verifique se a coluna "Status" indica a combinação de Configuração HTTP e Pool de back-end como "Íntegra".
Agora, navegue até o aplicativo Web usando o domínio personalizado que você associou ao Gateway de Aplicativo e ao Serviço de Aplicativo no back-end.
Verifique se a integridade do backend referente ao backend e às Configurações HTTP aparece como "Saudável":
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Check health:
Get-AzApplicationGatewayBackendHealth -ResourceGroupName $rgName -Name $appGwName
Para testar a configuração, solicitamos conteúdo do Serviço de Aplicativo por meio do Gateway de Aplicativo usando o domínio personalizado:
$customDomainName = "<FQDN for custom domain pointing to Application Gateway>"
Invoke-WebRequest $customDomainName
Verifique se a integridade do backend referente ao backend e às Configurações HTTP aparece como "Saudável":
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Check health:
Get-AzApplicationGatewayBackendHealth -ResourceGroupName $rgName -Name $appGwName
Para testar a configuração, solicitamos conteúdo do Serviço de Aplicativo por meio do Gateway de Aplicativo usando o endereço IP:
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Get ip address:
$ipAddressResourceId = $gw.FrontendIPConfigurations.PublicIPAddress.Id
$ipAddressResource = Get-AzResource -ResourceId $ipAddressResourceId
$publicIp = Get-AzPublicIpAddress -ResourceGroupName $ipAddressResource.ResourceGroupName -Name $ipAddressResource.Name
Write-Host "Public ip address for Application Gateway is $($publicIp.IpAddress)"
Invoke-WebRequest "http://$($publicIp.IpAddress)"
Preste atenção à seguinte lista não completa de possíveis sintomas ao testar o aplicativo:
- redirecionamentos apontando para ".azurewebsites.net" diretamente em vez de para o Application Gateway
- isso inclui redirecionamentos de Autenticação de Serviço de Aplicativo que tentam acessar ".azurewebsites.net" diretamente
- cookies com limite de domínio que não estão sendo passados para o back-end
- isso inclui o uso da configuração de "Afinidade do ARR" no Serviço de Aplicativo
As condições acima (explicadas mais detalhadamente no Centro de arquitetura) indicarão que o seu aplicativo Web não lida bem com a reescrita do nome do host. Isso é comumente visto. A maneira recomendada de lidar com essa condição é seguir as instruções de configuração do Gateway de Aplicativo com o Serviço de Aplicativo usando um domínio personalizado. Consulte também: Solucionar problemas do Serviço de Aplicações no Gateway de Aplicação.
Restringir acesso
Os aplicativos Web implantados nesses exemplos usam endereços IP públicos que podem ser acessados diretamente da internet. Isso ajuda com solução de problemas quando você estiver aprendendo sobre um novo recurso e tentar novas coisas. Porém, se você pretende implantar uma funcionalidade em produção, convém adicionar mais restrições. Considere as seguintes opções: