Il Gateway Applicazioni di Azure consente di avere un'app di App Service o un altro servizio multi-tenant come membro del pool di back-end. Questo articolo descrive come configurare un'app Servizio app con il gateway applicazione. La configurazione per il gateway applicazioni varia a seconda della modalità di accesso all'App Service.
- La prima opzione usa un dominio personalizzato sia nel gateway applicazione che nel servizio app nel back-end.
- La seconda opzione consiste nel fare in modo che Application Gateway acceda al servizio App Service usando il relativo dominio predefinito, con suffisso ".azurewebsite.net".
Questa configurazione è consigliata per gli scenari di livello di produzione e soddisfa la procedura di non modificare il nome host nel flusso di richiesta. È necessario disporre di un dominio personalizzato (e di un certificato associato) per evitare di dover fare affidamento sul valore predefinito ". Dominio Azurewebsite".
Utilizzando lo stesso nome di dominio sia per Application Gateway che per App Service nel pool di backend, il flusso di richieste non deve eseguire l'override del nome host. L'applicazione web back-end vede l'host originale utilizzato dal client.
Questa configurazione è la più semplice e non richiede un dominio personalizzato. Di conseguenza, consente una configurazione rapida.
Quando al servizio app non è associato un dominio personalizzato: l'intestazione host nella richiesta in ingresso nell'applicazione Web deve essere impostata sul dominio predefinito, suffisso con ".azurewebsites.net" oppure la piattaforma non sarà in grado di instradare correttamente la richiesta.
L'intestazione host nella richiesta originale ricevuta dall'Application Gateway è diversa dal nome host del servizio App di backend.
In questo articolo viene spiegato come:
- Configurare DNS
- Aggiungere il servizio app come pool back-end al gateway applicazione
- Configurare le impostazioni HTTP per la connessione al servizio app
- Configurare un listener HTTP
- Configurare una regola di routing delle richieste
Prerequisiti
Configurazione del DNS
Nel contesto di questo scenario, DNS è rilevante in due posizioni:
- Nome DNS, che l'utente o il client sta usando per il gateway applicazione e ciò che viene visualizzato in un browser
- Nome DNS, usato internamente dal gateway applicazione per accedere al servizio app nel back-end
Indirizzare l'utente o il client al gateway applicazione usando il dominio personalizzato. Configurare il DNS usando un alias CNAME a cui punta il DNS per il gateway applicazione. L'indirizzo DNS del gateway applicazione viene visualizzato nella pagina di panoramica dell'indirizzo IP pubblico associato. In alternativa, creare un record A che punta direttamente all'indirizzo IP. (Per il gateway applicazione V1, l'indirizzo VIP può cambiare se si arresta e si avvia il servizio, che rende questa opzione indesiderata).
Il servizio app deve essere configurato in modo da accettare il traffico dal gateway applicazione usando il nome di dominio personalizzato come host in ingresso. Per altre informazioni su come eseguire il mapping di un dominio personalizzato al servizio app, vedere Esercitazione: Eseguire il mapping di un nome DNS personalizzato esistente al servizio app di Azure Per verificare il dominio, il servizio app richiede solo l'aggiunta di un record TXT. Non è necessaria alcuna modifica nei record CNAME o A. La configurazione DNS per il dominio personalizzato rimane indirizzata a Application Gateway.
Per accettare connessioni al servizio app tramite HTTPS, configurarne l'associazione TLS. Per altre informazioni, vedere Proteggere un nome DNS personalizzato con un'associazione TLS/SSL nel servizio app di Azure Configurare il servizio app per eseguire il pull del certificato per il dominio personalizzato da Azure Key Vault.
Quando non è disponibile alcun dominio personalizzato, l'utente o il client può accedere al gateway applicazione usando l'indirizzo IP del gateway o il relativo indirizzo DNS. L'indirizzo DNS del gateway applicazione è disponibile nella pagina di panoramica dell'indirizzo IP pubblico associato. La mancata disponibilità di un dominio personalizzato implica che non è disponibile alcun certificato firmato pubblicamente per TLS nel gateway applicazione. I client sono limitati all'uso di HTTP o HTTPS con un certificato autofirmato, entrambi indesiderati.
Per connettersi al servizio app, il gateway applicazione usa il dominio predefinito fornito dal servizio app (con suffisso "azurewebsites.net").
Aggiungere il servizio app come pool back-end
Nel portale di Azure selezionare il gateway applicazione.
In Pool back-end, selezionare il pool back-end.
In Tipo di destinazione, selezionare Serviziapp.
In Destinazione selezionare il servizio app.
Note
L'elenco a discesa popola solo i servizi app che si trovano nella stessa sottoscrizione del gateway applicazione. Se si vuole utilizzare un App Service che si trova in una sottoscrizione diversa da quella in cui è situato l'Application Gateway, invece di scegliere App Services nell'elenco a discesa Destinazioni, scegliere l'opzione indirizzo IP o nome host e immettere il nome host (example.azurewebsites.net) del servizio app. Se si usano endpoint privati con il servizio app, è consigliabile usare invece l'FQDN o l'indirizzo IP dell'endpoint privato.
Selezionare Salva.
# 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
Modificare le impostazioni HTTP per il servizio app
È necessaria un'impostazione HTTP che indica al gateway applicazione di accedere al back-end del servizio app usando il nome di dominio personalizzato. L'impostazione HTTP, per impostazione predefinita, usa il probe di integrità predefinito. Mentre i probe di integrità predefiniti inoltrano le richieste con il nome host in cui viene ricevuto il traffico, i probe di integrità possono utilizzare 127.0.0.1 come nome host per il pool back-end perché non è stato definito in modo esplicito alcun nome host. Per questo motivo, è necessario creare un probe di integrità personalizzato configurato con il nome di dominio personalizzato corretto come nome host.
Ci si connette al back-end usando HTTPS.
- In Impostazioni HTTP selezionare un'impostazione HTTP esistente o aggiungerne una nuova.
- Quando si crea una nuova impostazione HTTP, assegnare un nome
- Selezionare HTTPS come protocollo back-end desiderato usando la porta 443
- Se il certificato è firmato da un'autorità nota, selezionare "Sì" per "Certificato CA noto utente". In alternativa, aggiungere certificati radice di autenticazione/attendibili dei server back-end
- Assicurarsi di impostare "Esegui override con il nuovo nome host" su "No"
- Selezionare il test di integrità HTTPS personalizzato nel menu a discesa per "Test personalizzato".
È necessaria un'impostazione HTTP che indica al gateway applicazione di accedere al back-end del servizio app usando il nome di dominio predefinito ("azurewebsites.net"). A tale scopo, l'impostazione HTTP sostituirà in modo esplicito il nome host.
- In Impostazioni HTTP selezionare un'impostazione HTTP esistente o aggiungerne una nuova.
- Quando si crea una nuova impostazione HTTP, assegnare un nome
- Selezionare HTTPS come protocollo back-end desiderato usando la porta 443
- Se il certificato è firmato da un'autorità nota, selezionare "Sì" per "Certificato CA noto utente". In alternativa, aggiungere certificati radice di autenticazione/attendibili dei server back-end
- Assicurarsi di impostare "Esegui override con il nuovo nome host" su "Sì"
- In "Override del nome host" selezionare "Scegli nome host dalla destinazione back-end". Questa impostazione fa sì che la richiesta verso il servizio app usi il nome host "azurewebsites.net", come configurato nel pool 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
Per accettare il traffico, è necessario configurare un listener. Per altre informazioni sul listener, vedere Configurazione del listener del gateway dell'applicazione.
- Aprire la sezione "Listener" e scegliere "Aggiungi listener" o selezionare un listener esistente da modificare
- Per un nuovo listener: assegnargli un nome
- Nell'"Indirizzo IP front-end", selezionare l'indirizzo IP su cui ascoltare.
- In "Porta" selezionare 443
- In "Protocollo" selezionare "HTTPS"
- In "Scegliere un certificato" selezionare "Scegliere un certificato da Key Vault". Per ulteriori informazioni, vedere Uso di Key Vault, dove è possibile trovare maggiori dettagli su come assegnare un'identità gestita e conferirle diritti sul vostro Key Vault.
- Assegnare un nome al certificato
- Selezionare l'identità gestita
- Selezionare l'insieme di credenziali delle chiavi da dove ottenere il certificato
- Selezionare il certificato
- In "Tipo listener" selezionare "Basic"
- Selezionare "Aggiungi" per aggiungere il listener
Supponendo che non sia disponibile alcun dominio personalizzato o certificato associato, configurare l'Application Gateway per instradare il traffico HTTP sulla porta 80. In alternativa, vedere le istruzioni su come creare un certificato autofirmato
- Aprire la sezione "Listener" e scegliere "Aggiungi listener" o selezionare un listener esistente da modificare
- Per un nuovo listener: assegnargli un nome
- Nell'"Indirizzo IP front-end", selezionare l'indirizzo IP su cui ascoltare.
- In "Porta" selezionare 80
- In "Protocollo" selezionare "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
In molti casi esiste un listener pubblico per HTTP sulla porta 80. Lo script seguente ne crea uno se questo non è ancora il 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
}
Usando il pool back-end configurato in precedenza e le impostazioni HTTP, è possibile configurare la regola di gestione delle richieste per accettare il traffico da un listener e instradarlo al pool back-end. Per questo motivo, assicurarsi di disporre di un listener HTTP o HTTPS non già associato a una regola di routing esistente.
- In "Regole", selezionare per aggiungere una nuova "Regola di routing della richiesta"
- Specificare la regola con un nome
- Selezionare un listener HTTP o HTTPS non ancora associato a una regola di routing esistente
- In "Destinazioni back-end" scegliere il pool back-end in cui è stato configurato il servizio app
- Configurare le impostazioni HTTP con cui il gateway applicazione deve connettersi al back-end del servizio app
- Selezionare "Aggiungi" per salvare questa configurazione
$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
Test
Prima di eseguire questa operazione, assicurarsi che l'integrità del back-end sia integra:
Aprire la sezione "Integrità back-end" e verificare che la colonna "Stato" indichi la combinazione per l'impostazione HTTP e il pool back-end come "Integro".
Passare ora all'applicazione Web usando l'indirizzo IP del gateway applicazione o il nome DNS associato per l'indirizzo IP. Entrambi sono disponibili nella pagina "Panoramica" del gateway applicazione come proprietà in "Essentials". In alternativa, la risorsa Indirizzo IP pubblico mostra anche l'indirizzo IP e il nome DNS associato.
Prestare attenzione all'elenco non esesauritivo seguente di potenziali sintomi durante il test dell'applicazione:
- reindirizzamenti che puntano direttamente a ".azurewebsite.net" anziché all'Application Gateway
- include reindirizzamenti di autenticazione che provano direttamente ad accedere a ".azurewebsite.net"
- cookie associati a dominio non passati al back-end
- includere l'uso dell'impostazione "Affinità ARR" nel servizio app
Le condizioni precedenti (descritte in modo più dettagliato in Centro architetture) indicano che l'applicazione Web non gestisce correttamente la riscrittura del nome host. Si tratta di una situazione che si riscontra spesso. Il modo consigliato per gestire questa operazione consiste nel seguire le istruzioni per la configurazione del gateway applicazione con il servizio app usando un dominio personalizzato. Vedere anche: Risolvere i problemi del servizio app nel gateway applicazione.
Aprire la sezione "Integrità back-end" e verificare che la colonna "Stato" indichi la combinazione per l'impostazione HTTP e il pool back-end come "Integro".
Passare ora all'applicazione Web usando il dominio personalizzato associato sia al gateway applicazione che al servizio app nel back-end.
Controllare se l'integrità back-end per il back-end e le impostazioni HTTP vengono visualizzate come "Integre":
$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
Per testare la configurazione, richiediamo il contenuto dal Servizio App tramite l'Application Gateway usando il dominio personalizzato:
$customDomainName = "<FQDN for custom domain pointing to Application Gateway>"
Invoke-WebRequest $customDomainName
Controllare se l'integrità back-end per il back-end e le impostazioni HTTP vengono visualizzate come "Integre":
$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
Per testare la configurazione, richiediamo contenuti dall'App Service tramite l'Application Gateway utilizzando l'indirizzo 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)"
Prestare attenzione all'elenco non esesauritivo seguente di potenziali sintomi durante il test dell'applicazione:
- reindirizzamenti che puntano direttamente a ".azurewebsites.net" anziché al gateway applicazione
- sono inclusi i reindirizzamenti dell'autenticazione del servizio app che provano direttamente ad accedere ad ".azurewebsites.net"
- cookie associati a dominio non passati al back-end
- ciò include l'uso dell'impostazione "Affinità ARR" nel servizio app
Le condizioni precedenti (descritte in modo più dettagliato in Centro architetture) indicano che l'applicazione Web non gestisce correttamente la riscrittura del nome host. Si tratta di una situazione che si riscontra spesso. Il modo consigliato per gestire questa condizione consiste nel seguire le istruzioni per la configurazione del gateway applicazione con il servizio app usando un dominio personalizzato. Vedere anche: Risolvere i problemi del servizio app nel gateway applicazione.
Limitare l'accesso
L'app Web distribuita in questi esempi usa indirizzi IP pubblici a cui è possibile accedere direttamente da Internet. Questo facilita la risoluzione dei problemi quando si sta imparando una nuova funzionalità e si provano le novità. Tuttavia, se si intende distribuire una funzionalità nell'ambiente di produzione, è necessario aggiungere altre restrizioni. Valutare le opzioni seguenti: