Konfigurieren von App Service mit Application Gateway
Artikel
Mit Application Gateway können Sie eine App Service-App oder einen anderen mehrinstanzenfähigen Dienst als Back-End-Poolmitglied einrichten. In diesem Artikel erfahren Sie, wie Sie eine App Service-App mit Application Gateway konfigurieren. Die Konfiguration für Application Gateway hängt davon ab, wie auf App Service zugegriffen wird:
Bei der ersten Option wird sowohl für Application Gateway als auch für App Service im Back-End eine benutzerdefinierte Domäne verwendet.
Die zweite Option besteht darin, dass Application Gateway mithilfe der Standarddomäne, die den Suffix „.azurewebsites.net“ aufweist, auf App Service zugreift.
Diese Konfiguration wird für Produktionsszenarien empfohlen und entspricht der Praxis, den Hostnamen im Anforderungsfluss nicht zu ändern. Sie müssen über eine benutzerdefinierte Domäne (und ein zugehöriges Zertifikat) verfügen, damit Sie nicht auf die Standarddomäne „.azurewebsites“ angewiesen sind.
Durch Zuordnung des gleichen Domänennamens zu Application Gateway und App Service im Back-End-Pool muss der Anforderungsflow den Hostnamen nicht außer Kraft setzen. Die Back-End-Webanwendung sieht den ursprünglichen Host so wie er vom Client verwendet wurde.
Diese Konfiguration ist am einfachsten und erfordert keine benutzerdefinierte Domäne. Daher ermöglicht es eine schnelle komfortable Einrichtung.
Wenn App Service keine benutzerdefinierte Domäne zugeordnet ist, muss der Hostheader für die eingehende Anforderung der Webanwendung auf die Standarddomäne mit dem Suffix „.azurewebsites.net“ festgelegt werden. Andernfalls kann die Plattform die Anforderung nicht ordnungsgemäß weiterleiten.
Der Hostheader, der in der von Application Gateway empfangenen ursprünglichen Anforderung enthalten ist, ist ein anderer als der von App Service im Back-End.
In diesem Artikel lernen Sie Folgendes:
Konfigurieren des DNS
Hinzufügen von App Service als Back-End-Pool zu Application Gateway
Konfigurieren von HTTP-Einstellungen für die Verbindung mit App Service
App Service: Wenn Sie noch nicht über eine App Service-App verfügen, lesen Sie die App Service-Dokumentation.
Ein benutzerdefinierter Domänenname und ein zugehöriges Zertifikat (signiert von einer bekannten Zertifizierungsstelle), die in Key Vault gespeichert sind. Weitere Informationen zum Speichern von Zertifikaten in Key Vault finden Sie unter Tutorial: Importieren eines Zertifikats in Azure Key Vault.
Leiten Sie den Benutzer oder Client mithilfe der benutzerdefinierten Domäne an Application Gateway weiter. Richten Sie das DNS mithilfe eines CNAME-Alias ein, der auf das DNS für Application Gateway zeigt. Die DNS-Adresse von Application Gateway wird auf der Übersichtsseite der zugehörigen öffentlichen IP-Adresse angezeigt. Alternativ können Sie einen A-Eintrag erstellen, der direkt auf die IP-Adresse verweist. (Bei Application Gateway V1 kann sich die VIP ändern, wenn Sie den Dienst beenden und starten, weshalb diese Option unerwünscht ist.)
App Service sollte so konfiguriert sein, dass Datenverkehr von Application Gateway mithilfe des benutzerdefinierten Domänennamens als eingehender Host akzeptiert wird. Weitere Informationen zum Zuordnen einer benutzerdefinierten Domäne zu App Service finden Sie unter Tutorial: Zuordnen eines vorhandenen benutzerdefinierten DNS-Namens zu Azure App Service. Um die Domäne zu überprüfen, muss App Service nur ein TXT-Eintrag hinzugefügt werden. Für CNAME- oder A-Einträge ist keine Änderung erforderlich. Die DNS-Konfiguration für die benutzerdefinierte Domäne bleibt auf Application Gateway ausgerichtet.
Wenn keine benutzerdefinierte Domäne verfügbar ist, kann der Benutzer oder Client mithilfe der IP-Adresse des Gateways oder seiner DNS-Adresse auf Application Gateway zugreifen. Die DNS-Adresse von Application Gateway finden Sie auf der Übersichtsseite der zugehörigen öffentlichen IP-Adresse. Wenn keine benutzerdefinierte Domäne verfügbar ist, bedeutet dies, dass kein öffentlich signiertes Zertifikat für TLS in Application Gateway verfügbar ist. Clients sind auf die Verwendung von HTTP oder HTTPS mit einem selbstsignierten Zertifikat beschränkt, die beide nicht erwünscht sind.
Um eine Verbindung mit App Service herzustellen, verwendet Application Gateway die von App Service bereitgestellte Standarddomäne (mit dem Suffix „azurewebsites.net“).
Wählen Sie im Azure-Portal Ihre Application Gateway-Instanz aus.
Wählen Sie unter Back-End-Poolsden Back-End-Pool aus.
Wählen Sie unter Zieltyp die Option App Services aus.
Wählen Sie unter Ziel Ihren App Service aus.
Hinweis
Die Dropdownliste wird nur mit den App Services aufgefüllt, die sich unter demselben Abonnement wie Ihr Application Gateway befinden. Wenn Sie eine App Service-Instanz verwenden möchten, die sich unter einem anderen Abonnement als dem Abonnement von Application Gateway befindet, sollten Sie anstelle von App Services in der Dropdownliste Ziele die Option IP-Adresse oder Hostname wählen und den Hostnamen der App Service-Instanz eingeben (z. B. „example.azurewebsites.net“).
Wählen Sie Speichern.
# 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
Eine HTTP-Einstellung ist erforderlich, die Application Gateway anweist, mithilfe des benutzerdefinierten Domänennamens auf das App Service-Back-End zuzugreifen. Die HTTP-Einstellung verwendet standardmäßig den Standardintegritätstest. Während Standardintegritätstests Anforderungen mit dem Hostnamen weiterleiten, unter dem Datenverkehr empfangen wird, verwenden die Integritätstests 127.0.0.1 als Hostnamen für den Back-End-Pool, da nicht explizit ein Hostname definiert wurde. Aus diesem Grund müssen Sie zunächst einen benutzerdefinierten Integritätstest erstellen, der mit dem richtigen benutzerdefinierten Domänennamen als Hostnamen konfiguriert ist.
Wir stellen über HTTPS eine Verbindung mit dem Back-End her.
Wählen Sie unter HTTP-Einstellungen eine vorhandene HTTP-Einstellung aus oder fügen Sie eine neue hinzu.
Wenn Sie eine neue HTTP-Einstellung erstellen, geben Sie ihr einen Namen.
Wählen Sie HTTPS als gewünschtes Back-End-Protokoll mit Port 443 aus.
Wenn das Zertifikat von einer bekannten Zertifizierungsstelle signiert wurde, klicken Sie bei „Dem Benutzer bekanntes Zertifizierungsstellenzertifikat“ auf „Ja“. Fügen Sie alternativ Authentifizierungs- bzw. vertrauenswürdige Stammzertifikate von Back-End-Servern hinzu, wie hier beschrieben wird.
Stellen Sie sicher, dass „Mit neuem Hostnamen außer Kraft setzen“ auf „Nein“ festgelegt ist.
Wählen Sie in der Dropdownliste „Benutzerdefinierter Test“ den benutzerdefinierten HTTPS-Integritätstest aus.
Eine HTTP-Einstellung ist erforderlich, die Application Gateway anweist, mithilfe des Standarddomänennamens („azurewebsites.net“) auf das App Service-Back-End zuzugreifen. Hierzu setzt die HTTP-Einstellung explizit den Hostnamen außer Kraft.
Wählen Sie unter HTTP-Einstellungen eine vorhandene HTTP-Einstellung aus oder fügen Sie eine neue hinzu.
Wenn Sie eine neue HTTP-Einstellung erstellen, geben Sie ihr einen Namen.
Wählen Sie HTTPS als gewünschtes Back-End-Protokoll mit Port 443 aus.
Wenn das Zertifikat von einer bekannten Zertifizierungsstelle signiert wurde, klicken Sie bei „Dem Benutzer bekanntes Zertifizierungsstellenzertifikat“ auf „Ja“. Fügen Sie alternativ Authentifizierungs- bzw. vertrauenswürdige Stammzertifikate von Back-End-Servern hinzu, wie hier beschrieben wird.
Stellen Sie sicher, dass „Mit neuem Hostnamen außer Kraft setzen“ auf „Ja“ festgelegt ist.
Klicken Sie unter „Hostnamen-Außerkraftsetzung“ auf „Hostnamen aus Back-End-Ziel auswählen“. Diese Einstellung bewirkt, dass eine Anforderung an App Service gesendet wird, den im Back-End-Pool konfigurierten Hostnamen „azurewebsites.net“ zu verwenden.
# 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
Öffnen Sie den Abschnitt „Listener“ und klicken Sie auf „Listener hinzufügen“ oder klicken Sie auf einen vorhandenen Listener, um diesen zu bearbeiten.
Für einen neuen Listener: Geben Sie ihm einen Namen.
Wählen Sie unter „Front-End-IP“ die IP-Adresse aus, an der gelauscht werden soll.
Wählen Sie unter „Port“ die Option „443“ aus.
Aktivieren Sie unter „Protokoll“ die Option „HTTPS“.
Aktivieren Sie unter „Zertifikat auswählen“ die Option „Zertifikat aus Key Vault auswählen“. Weitere Informationen finden Sie unter Verwenden von Key Vault. Dort finden Sie weitere Informationen zum Zuweisen einer verwalteten Identität und Ausstatten mit Rechten für Ihre Key Vault-Instanz.
Benennen Sie das Zertifikat.
Wählen Sie die verwaltete Identität aus.
Wählen Sie die Key Vault-Instanz aus, aus der das Zertifikat abgerufen werden soll.
Auswählen des Zertifikats
Wählen Sie unter „Listenertyp“ die Option „Grundlegend“ aus.
Klicken Sie auf „Hinzufügen“, um den Listener hinzuzufügen.
Vorausgesetzt, es ist keine benutzerdefinierte Domäne verfügbar oder kein zugehöriges Zertifikat vorhanden, konfigurieren wir Application Gateway, um an Port 80 auf HTTP-Datenverkehr zu lauschen. Lesen Sie sich anderenfalls die Anweisungen zum Erstellen eines selbstsignierten Zertifikats durch.
Öffnen Sie den Abschnitt „Listener“ und klicken Sie auf „Listener hinzufügen“ oder klicken Sie auf einen vorhandenen Listener, um diesen zu bearbeiten.
Für einen neuen Listener: Geben Sie ihm einen Namen.
Wählen Sie unter „Front-End-IP“ die IP-Adresse aus, an der gelauscht werden soll.
Wählen Sie unter „Port“ die Option „80“ aus.
Wählen Sie unter „Protokoll“ die Option „HTTPS“ aus.
# 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 vielen Fällen ist bereits ein öffentlicher Listener für HTTP an Port 80 vorhanden. Das folgende Skript erstellt ein Skript, wenn dies noch nicht der Fall ist.
$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
}
Konfigurieren einer Anforderungsroutingregel
Die Anforderungsroutingregel, die mit dem zuvor konfigurierten Back-End-Pool und dem HTTP-Einstellungen bereitgestellt wurde, kann so eingerichtet werden, dass Datenverkehr von einem Listener an den Back-End-Pool mithilfe der HTTP-Einstellungen weitergeleitet wird. Stellen Sie hierzu sicher, dass ein HTTP- oder HTTPS-Listener verfügbar ist, der nicht bereits an eine vorhandene Routingregel gebunden ist.
Öffnen Sie den Abschnitt „Back-End-Integrität“ und stellen Sie sicher, dass die Spalte „Status“ die Kombination für HTTP-Einstellung und Back-End-Pool als „Fehlerfrei“ angibt.
Navigieren Sie nun zur Webanwendung, indem Sie entweder die IP-Adresse von Application Gateway oder den zugehörigen DNS-Namen für die IP-Adresse verwenden. Beides finden Sie auf der Seite „Übersicht“ in Application Gateway als Eigenschaft unter „Zusammenfassung“. Alternativ zeigt die Ressource „Öffentliche IP-Adresse“ auch die IP-Adresse und den zugehörigen DNS-Namen an.
Achten Sie beim Testen der Anwendung auf die folgende unvollständige Liste möglicher Symptome:
Umleitungen, die direkt auf „.azurewebsites.net“ verweisen anstatt auf Application Gateway
Dies umfasst Authentifizierungsumleitungen, die versuchen, direkt auf „.azurewebsites.net“ zuzugreifen.
Domänengebundene Cookies, die nicht an das Back-End übergeben werden
Die oben genannten Bedingungen (die im Architecture Center ausführlicher erläutert werden) deuten darauf hin, dass Ihre Webanwendung nicht gut damit umgehen kann, den Hostnamen neu zu schreiben. Dies tritt häufig auf. Die empfohlene Vorgehensweise besteht darin, die Anweisungen für die Konfiguration von Application Gateway mit App Service mithilfe einer benutzerdefinierten Domäne zu befolgen. Weitere Informationen finden Sie im folgenden Artikel: Behandeln von App Service-Problemen in Application Gateway.
Öffnen Sie den Abschnitt „Back-End-Integrität“ und stellen Sie sicher, dass die Spalte „Status“ die Kombination für HTTP-Einstellung und Back-End-Pool als „Fehlerfrei“ angibt.
Navigieren Sie nun zur Webanwendung mithilfe der benutzerdefinierten Domäne, die Sie sowohl Application Gateway als auch App Service im Back-End zugeordnet haben.
Überprüfen Sie, ob die Back-End-Integrität für das Back-End und die HTTP-Einstellungen als „Fehlerfrei“ angezeigt wird:
$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
Zum Testen der Konfiguration fordern wir Inhalte von App Service über Application Gateway mithilfe der benutzerdefinierten Domäne an:
$customDomainName = "<FQDN for custom domain pointing to Application Gateway>"
Invoke-WebRequest $customDomainName
Überprüfen Sie, ob die Back-End-Integrität für das Back-End und die HTTP-Einstellungen als „Fehlerfrei“ angezeigt wird:
$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
Zum Testen der Konfiguration fordern wir Inhalte von App Service über Application Gateway mithilfe der IP-Adresse an:
$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)"
Achten Sie beim Testen der Anwendung auf die folgende unvollständige Liste möglicher Symptome:
Umleitungen, die direkt auf „.azurewebsites.net“ verweisen anstatt auf Application Gateway
Die oben genannten Bedingungen (die im Architecture Center ausführlicher erläutert werden) deuten darauf hin, dass Ihre Webanwendung nicht gut damit umgehen kann, den Hostnamen neu zu schreiben. Dies tritt häufig auf. Die empfohlene Vorgehensweise besteht darin, die Anweisungen für die Konfiguration von Application Gateway mit App Service mithilfe einer benutzerdefinierten Domäne zu befolgen. Weitere Informationen finden Sie im folgenden Artikel: Behandeln von App Service-Problemen in Application Gateway.
Beschränken des Zugriffs
Die in diesen Beispielen bereitgestellten Web-Apps verwenden öffentliche IP-Adressen, auf die aus dem Internet direkt zugegriffen werden kann. Es hilft bei der Problembehandlung, wenn Sie von einem neuen Feature erfahren und neue Dinge ausprobieren. Wenn Sie jedoch ein Feature in einer Produktionsumgebung bereitstellen möchten, ist es sinnvoll, stärkere Einschränkungen vorzusehen. Ziehen Sie folgende Möglichkeiten in Betracht:
Verwenden Sie Statische Azure App Service-IP-Einschränkungen. Beispielsweise können Sie die Web-App so einschränken, dass sie nur Datenverkehr vom Anwendungsgateway empfängt. Verwenden Sie die IP-Einschränkungsfunktion von App Service, um die Anwendungsgateway-VIP als einzige Adresse aufzulisten, auf die zugegriffen werden kann.