Application Gateway le permite tener una aplicación de App Service u otro servicio multiinquilino como miembro del grupo de back-end. En este artículo, aprenderá a configurar una aplicación de App Service con Application Gateway. La configuración de Application Gateway variará en función de cómo se acceda a App Service:
- La primera opción usa un dominio personalizado tanto en Application Gateway como en App Service en back-end.
- La segunda opción es hacer que Application Gateway acceda a App Service mediante su dominio predeterminado, con el sufijo ".azurewebsites.net".
Esta configuración se recomienda para escenarios de nivel de producción y cumple la práctica de no cambiar el nombre de host en el flujo de solicitud. Debe tener un dominio personalizado (y un certificado asociado) disponible para evitar tener que confiar en el dominio ".azurewebsites" predeterminado.
Al asociar el mismo nombre de dominio a Application Gateway y App Service en el grupo de back-end, el flujo de solicitud no necesita invalidar el nombre de host. La aplicación web de back-end verá el host original tal como lo usó el cliente.
Esta configuración es la más sencilla y no requiere un dominio personalizado. Por lo tanto, permite una configuración rápida y cómoda.
Cuando App Service no tiene un dominio personalizado asociado, el encabezado de host de la solicitud entrante en la aplicación web deberá establecerse en el dominio predeterminado, con el sufijo ".azurewebsites.net", o la plataforma no podrá enrutar correctamente la solicitud.
El encabezado de host en la solicitud original recibida por Application Gateway será diferente del nombre de host de App Service de back-end.
En este artículo, aprenderá a:
- Configurar el DNS
- Agregar App Service como grupo de back-end a Application Gateway
- Configurar los valores de HTTP para la conexión a App Service
- Configurar un agente de escucha HTTP
- Configurar una regla de enrutamiento de solicitud
Requisitos previos
Configuring DNS (Configuración de DNS)
En el contexto de este escenario, DNS es relevante en dos lugares:
- El nombre DNS, que el usuario o el cliente está usando para Application Gateway y se muestra en un explorador
- El nombre DNS, que Application Gateway utiliza internamente para acceder a App Service en back-end
Enrute el usuario o el cliente a Application Gateway mediante el dominio personalizado. Configure DNS mediante un alias CNAME que apunte al DNS para Application Gateway. La dirección DNS de Application Gateway se muestra en la página de información general de la dirección IP pública asociada. También puede crear un registro A que apunte directamente a la dirección IP. (Para Application Gateway V1, la dirección VIP puede cambiar si detiene e inicia el servicio, lo que hace que esta opción no sea recomendable).
App Service debe configurarse para que acepte el tráfico de Application Gateway mediante el nombre de dominio personalizado como host entrante. Para obtener más información sobre cómo asignar un dominio personalizado a App Service, consulte Tutorial: Asignación de un nombre DNS personalizado existente a Azure App Service Para verificar el dominio, App Service solo requiere agregar un registro TXT. No se requiere ningún cambio en los registros A o CNAME. La configuración de DNS para el dominio personalizado permanecerá dirigida a Application Gateway.
Para aceptar conexiones a App Service a través de HTTPS, configure su enlace TLS. Para obtener más información, consulte Protección de un nombre DNS personalizado con un enlace TLS/SSL en Azure App Service Configure App Service para extraer el certificado para el dominio personalizado de Azure Key Vault.
Cuando no hay ningún dominio personalizado disponible, el usuario o cliente puede acceder a Application Gateway mediante la dirección IP de la puerta de enlace o su dirección DNS. La dirección DNS de Application Gateway puede encontrarse en la página de información general de la dirección IP pública asociada. No tener un dominio personalizado disponible implica que no habrá ningún certificado firmado públicamente disponible para TLS en Application Gateway. Los clientes están restringidos a usar HTTP o HTTPS con un certificado autofirmado, ambas opciones no son recomendables.
Para conectarse a App Service, Application Gateway utiliza el dominio predeterminado proporcionado por App Service (con el sufijo "azurewebsites.net").
Agregación de servicio de aplicaciones como grupo de back-end
En Azure Portal, seleccione el recurso de Application Gateway.
En Grupos de back-end, seleccione el grupo de back-end.
En Tipo de destino, seleccione App Services.
En Destino seleccione la instancia de App Service.
Nota:
La lista desplegable solo rellenará los App Services que se encuentren en la misma suscripción que Application Gateway. Si quiere usar un servicio de aplicaciones que está en una suscripción diferente de aquella en la que se encuentra Application Gateway, en lugar de seleccionar App Services en la lista desplegable Destinos, elija la opción Nombre de host o dirección IP y escriba el nombre de host (example.azurewebsites.net) de App Service.
Seleccione Guardar.
# 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
Edición de una configuración de HTTP para App Service
Se requiere una configuración HTTP que indique a Application Gateway que debe acceder a App Service de back-end mediante el nombre de dominio personalizado. La configuración HTTP usará de forma predeterminada el sondeo de estado predeterminado. Aunque los sondeos de estado predeterminados reenviarán las solicitudes con el nombre de host en el que se recibe el tráfico, los sondeos de estado usarán 127.0.0.1 como nombre de host al grupo de back-end, ya que no se ha definido explícitamente ningún nombre de host. Por este motivo, necesitamos crear un sondeo de estado personalizado que esté configurado con el nombre de dominio personalizado correcto como nombre de host.
Nos conectaremos al back-end mediante HTTPS.
- En Configuración de HTTP, seleccione una configuración HTTP existente o agregue una nueva.
- Al crear una nueva configuración de HTTP, asígnele un nombre
- Seleccione HTTPS como protocolo de back-end deseado mediante el puerto 443
- Si el certificado está firmado por una entidad conocida, seleccione "Sí" en "User well known CA certificate" (Certificado de entidad de certificación conocido del usuario). Alternativamente, agregue certificados de autenticación o raíz de confianza de servidores back-end
- Asegúrese de establecer "Invalidar con nuevo nombre de host" en "No"
- Seleccione el sondeo de mantenimiento HTTPS personalizado en la lista desplegable de "Sondeo de mantenimiento".
Se requiere una configuración HTTP que indique a Application Gateway que debe acceder al back-end de App Service mediante el nombre de dominio ("azurewebsites.net") personalizado. Para ello, la configuración de HTTP invalidará explícitamente el nombre de host.
- En Configuración de HTTP, seleccione una configuración HTTP existente o agregue una nueva.
- Al crear una nueva configuración de HTTP, asígnele un nombre
- Seleccione HTTPS como protocolo de back-end deseado mediante el puerto 443
- Si el certificado está firmado por una entidad conocida, seleccione "Sí" en "User well known CA certificate" (Certificado de entidad de certificación conocido del usuario). Alternativamente, agregue certificados de autenticación o raíz de confianza de servidores back-end
- Asegúrese de establecer "Invalidar con nuevo nombre de host" en "Sí"
- En "Reemplazo del nombre de host", seleccione "Seleccionar el nombre de host del destino de back-end". Esta configuración hará que la solicitud hacia App Service utilice el nombre de host "azurewebsites.net", tal como está configurado en el grupo 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 aceptar el tráfico, es necesario configurar un agente de escucha. Para obtener más información, consulte Configuración del agente de escucha de Application Gateway.
- Abra la sección "Agentes de escucha" y elija "Agregar agente de escucha" o haga clic en uno existente para editarlo
- Para un nuevo agente de escucha: asígnele un nombre
- En "IP de front-end", seleccione la dirección IP en la que desea escuchar
- En "Puerto", seleccione 443
- En "Protocolo", seleccione "HTTPS"
- En "Elegir un certificado", seleccione "Elegir un certificado de Key Vault". Para obtener más información, consulte Uso de Key Vault, donde encontrará más información sobre cómo asignar una identidad administrada y proporcionar derechos a Key Vault.
- Asigne un nombre al certificado
- Selección de la identidad administrada
- Seleccione el Key Vault desde donde se va a obtener el certificado
- Seleccionar el certificado
- En "Tipo de agente de escucha", seleccione "Básico"
- Haga clic en "Agregar" para agregar el agente de escucha
Suponiendo que no haya ningún dominio personalizado disponible o certificado asociado, configuraremos Application Gateway para escuchar el tráfico HTTP en el puerto 80. Alternativamente, consulte las instrucciones sobre cómo realizar la Creación de un certificado autofirmado
- Abra la sección "Agentes de escucha" y elija "Agregar agente de escucha" o haga clic en uno existente para editarlo
- Para un nuevo agente de escucha: asígnele un nombre
- En "IP de front-end", seleccione la dirección IP en la que desea escuchar
- En "Puerto", seleccione 80
- En "Protocolo", seleccione "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
En muchos casos, ya existirá un agente de escucha público para HTTP en el puerto 80. El script siguiente creará uno si esto no es así.
$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
}
Use el grupo de back-end configurado anteriormente y la configuración de HTTP, la regla de enrutamiento de solicitudes se puede configurar para que asuma el tráfico de un cliente de escucha y lo enrute al grupo de back-end mediante la configuración de HTTP. Para ello, asegúrese de que tiene disponible un agente de escucha HTTP o HTTPS que aún no está enlazado a una regla de enrutamiento existente.
- En "Reglas", haga clic para agregar una nueva "Regla de enrutamiento de solicitud"
- Proporcione un nombre a la regla
- Seleccione un agente de escucha HTTP o HTTPS que aún no esté enlazado a una regla de enrutamiento existente
- En "Destinos de back-end", elija el grupo de back-end en el que se ha configurado App Service
- Configure las opciones HTTP con las que Application Gateway debe conectarse al back-end de App Service
- Seleccione "Agregar" para guardar esta configuración
$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
Prueba
Antes de hacerlo, asegúrese de que el estado del back-end se muestra como correcto:
Abra la sección "Estado del back-end" y asegúrese de que la columna "Estado" indica que la combinación de configuración de HTTP y grupo de back-end se muestra en estado "Correcto".
Ahora vaya a la aplicación web mediante la dirección IP de Application Gateway o el nombre DNS asociado para la dirección IP. Ambos se pueden encontrar en la página de "Información general" de Application Gateway, como una propiedad en "Essentials". Como alternativa, el recurso de la dirección IP pública también muestra la dirección IP y el nombre DNS asociado.
Preste atención a la siguiente lista no exhaustiva de posibles síntomas al probar la aplicación:
- redirecciones que apuntan a ".azurewebsites.net" directamente en lugar de a Application Gateway
- esto incluye redirecciones de autenticación que intentan acceder directamente a ".azurewebsites.net"
- cookies enlazadas a un dominio que no se pasan al back-end
- esto incluye el uso de la configuración de "Afinidad ARR" en App Service
Las condiciones anteriores (que se explican con más detalle en el Centro de arquitectura) indicarán que la aplicación web no gestiona bien la reescritura del nombre de host. Esto se suele ver. La manera recomendada de lidiar con esto es seguir las instrucciones de configuración de Application Gateway con App Service utilizando un dominio personalizado. Consulte también: Solución de problemas de App Service en Application Gateway.
Abra la sección "Estado del back-end" y asegúrese de que la columna "Estado" indica que la combinación de configuración de HTTP y grupo de back-end se muestra en estado "Correcto".
Ahora, vaya a la aplicación web mediante el dominio personalizado que asoció con Application Gateway y App Service en el back-end.
Compruebe si el estado del back-end para el back-end y la configuración de HTTP se muestra en estado "Correcto":
$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 probar la configuración, solicitaremos contenido de App Service a Application Gateway mediante el dominio personalizado:
$customDomainName = "<FQDN for custom domain pointing to Application Gateway>"
Invoke-WebRequest $customDomainName
Compruebe si el estado del back-end para el back-end y la configuración de HTTP se muestra en estado "Correcto":
$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 probar la configuración, solicitaremos contenido de App Service a Application Gateway mediante la dirección 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 atención a la siguiente lista no exhaustiva de posibles síntomas al probar la aplicación:
- redirecciones que apuntan a ".azurewebsites.net" directamente en lugar de a Application Gateway
- esto incluye redirecciones de Autenticación de App Service que intentan acceder directamente a ".azurewebsites.net"
- cookies enlazadas a un dominio que no se pasan al back-end
- esto incluye el uso de la configuración de "Afinidad ARR" en App Service
Las condiciones anteriores (que se explican con más detalle en el Centro de arquitectura) indicarán que la aplicación web no gestiona bien la reescritura del nombre de host. Esto se suele ver. La manera recomendada de lidiar con esto es seguir las instrucciones de configuración de Application Gateway con App Service utilizando un dominio personalizado. Consulte también: Solución de problemas de App Service en Application Gateway.
Restricción del acceso
Las aplicaciones web implementadas en estos ejemplos usan direcciones IP públicas a las que se puede acceder directamente desde Internet. Esto ayuda a solucionar los problemas cuando se está aprendiendo una nueva característica y se prueban cosas nuevas. Pero si va a implementar una característica en un entorno de producción, tendrá que agregar más restricciones. Considere las opciones siguientes: