Freigeben über


Problembehandlung bei Gateway (502)-Fehlern an der Azure-Anwendungsgateway

Zusammenfassung

Erfahren Sie, wie Sie Gatewayfehler (502) in Azure-Anwendungsgateway beheben, um den zuverlässigen Zugriff auf Ihre Web-Apps schnell wiederherzustellen.

Hinweis

Es wird empfohlen, das Azure Az PowerShell-Modul für die Interaktion mit Azure zu verwenden. Informationen zu den ersten Schritten finden Sie unter Install Azure PowerShell. Informationen zum Migrieren zum Az PowerShell-Modul finden Sie unter Migrate Azure PowerShell von AzureRM zu Az.

Überblick

Nachdem Sie ein Anwendungsgateway konfiguriert haben, ist einer der Fehler, die Sie möglicherweise sehen, serverfehler: 502 – Webserver erhielt eine ungültige Antwort, während sie als Gateway oder Proxyserver fungiert. Dieser Fehler kann aus den folgenden Hauptgründen auftreten:

Netzwerksicherheitsgruppe, benutzerdefinierte Route oder benutzerdefiniertes DNS-Problem

Ursache

Wenn der Zugriff auf das Back-End aufgrund eines NSG-, UDR- oder benutzerdefinierten DNS blockiert wird, können Anwendungsgatewayinstanzen den Back-End-Pool nicht erreichen. Dieses Problem verursacht Probefehler, was zu 502 Fehlern führt.

Der NSG/UDR kann entweder im Anwendungsgateway-Subnetz oder im Subnetz vorhanden sein, in dem die Anwendungs-VMs bereitgestellt werden.

Ebenso kann das Vorhandensein eines benutzerdefinierten DNS im VNet ebenfalls Probleme verursachen. Ein FQDN, der für Back-End-Poolmitglieder verwendet wird, kann vom vom Benutzer konfigurierten DNS-Server für das VNet möglicherweise nicht ordnungsgemäß aufgelöst werden.

Lösung

Überprüfen Sie die NSG-, UDR- und DNS-Konfiguration, indem Sie die folgenden Schritte ausführen:

  1. Überprüfen Sie NSGs, die dem Anwendungsgateway-Subnetz zugeordnet sind. Stellen Sie sicher, dass die Kommunikation mit dem Back-End nicht blockiert wird. Weitere Informationen finden Sie unter Netzwerksicherheitsgruppen.

  2. Überprüfen Sie das UDR, das dem Anwendungsgateway-Subnetz zugeordnet ist. Stellen Sie sicher, dass die benutzerdefinierte Route (UDR) nicht den ausgehenden Datenverkehr vom Back-End-Subnetz umleitet. Überprüfen Sie z. B. das Routing an virtuelle Netzwerkgeräte oder Standardrouten, die über ExpressRoute/VPN an das Anwendungsgateway-Subnetz angekündigt werden.

    $vnet = Get-AzVirtualNetwork -Name vnetName -ResourceGroupName rgName
    Get-AzVirtualNetworkSubnetConfig -Name appGwSubnet -VirtualNetwork $vnet
    
  3. Überprüfen Sie die effektive NSG und die Route mit der Back-End-VM.

    Get-AzEffectiveNetworkSecurityGroup -NetworkInterfaceName nic1 -ResourceGroupName testrg
    Get-AzEffectiveRouteTable -NetworkInterfaceName nic1 -ResourceGroupName testrg
    
  4. Überprüfen Des Vorhandenseins von benutzerdefiniertem DNS im VNet. DNS kann überprüft werden, indem Details der VNet-Eigenschaften in der Ausgabe überprüft werden.

    Get-AzVirtualNetwork -Name vnetName -ResourceGroupName rgName 
    DhcpOptions            : {
                               "DnsServers": [
                                 "x.x.x.x"
                               ]
                             }
    
  5. Wenn vorhanden, stellen Sie sicher, dass der DNS-Server den FQDN des Mitglieds des Backend-Pools ordnungsgemäß auflösen kann.

Probleme mit der Standard-Health-Probe

Ursache

502 Fehler können auch häufige Indikatoren sein, dass die Standardintegritätssonde keine Back-End-VMs erreichen kann.

Wenn eine Anwendungsgatewayinstanz bereitgestellt wird, konfiguriert sie automatisch einen Standardintegritätstest für jeden Back-EndAddressPool mithilfe von Eigenschaften des Back-EndHttpSetting. Zum Festlegen dieses Prüfpunkts ist keine Benutzereingabe erforderlich. Wenn eine Lastenausgleichsregel konfiguriert ist, wird eine Zuordnung zwischen einem Back-EndHttpSetting und einem Back-EndAddressPool hergestellt. Für jede dieser Zuordnungen wird eine Standardprüfung konfiguriert, und das Anwendungsgateway startet eine periodische Integritätsprüfungsverbindung zu jeder Instanz im BackendAddressPool an dem im BackendHttpSetting-Element angegebenen Port.

In der folgenden Tabelle sind die Werte aufgeführt, die der Standardintegritätssonde zugeordnet sind:

Sondeneigenschaft Wert Description
Überprüfungs-URL http://127.0.0.1/ URL-Pfad
Intervall 30 Probeintervall in Sekunden
Zeitüberschreitung 30 Timeout der Probe in Sekunden
Ungesunder Schwellenwert 3 Anzahl der Wiederholungsversuche der Überprüfung Der Back-End-Server wird als ausgefallen markiert, wenn die Anzahl aufeinanderfolgender fehlerhafter Prüfungen den Fehlerschwellenwert erreicht.

Lösung

  • Der Hostwert der Anforderung ist auf 127.0.0.1 festgelegt. Stellen Sie sicher, dass eine Standardwebsite konfiguriert ist und auf 127.0.0.1 läuft.
  • Das Protokoll der Anforderung wird durch das Back-EndHttpSetting-Protokoll bestimmt.
  • Der URI-Pfad ist auf / gesetzt.
  • Wenn BackendHttpSetting einen anderen Port als 80 angibt, sollte die Standardwebsite so konfiguriert werden, dass sie an diesem Port abgehört wird.
  • Der Aufruf von protocol://127.0.0.1:port sollte einen HTTP-Ergebniscode von 200 zurückgeben. Dieser Code sollte innerhalb des 30-Sekunden-Timeoutzeitraums zurückgegeben werden.
  • Stellen Sie sicher, dass der konfigurierte Port geöffnet ist und es keine Firewallregeln oder Azure Netzwerksicherheitsgruppen gibt, die eingehenden oder ausgehenden Datenverkehr für den Port blockieren.
  • Wenn Azure klassische VMs oder ein Cloud-Dienst mit einem FQDN oder einer öffentlichen IP-Adresse verwendet wird, stellen Sie sicher, dass der entsprechende Endpunkt geöffnet ist.
  • Wenn der virtuelle Computer über Azure Resource Manager konfiguriert ist und sich außerhalb des VNet befindet, in dem das Anwendungsgateway bereitgestellt wird, muss eine Network-Sicherheitsgruppe so konfiguriert werden, dass der Zugriff auf den gewünschten Port zulässig ist.

Weitere Informationen finden Sie unter Konfiguration der Application Gateway-Infrastruktur.

Probleme mit der benutzerdefinierten Gesundheitsüberprüfung

Ursache

Benutzerdefinierte Gesundheitsprüfungen ermöglichen zusätzliche Flexibilität für das standardmäßige Überwachungsverhalten. Wenn Sie benutzerdefinierte Probes verwenden, können Sie das Probeintervall, die URL, den zu testenden Pfad und die Anzahl der fehlgeschlagenen Antworten konfigurieren, die akzeptiert werden sollen, bevor Sie die Back-End-Poolinstanz als fehlerhaft markieren.

Die folgenden zusätzlichen Eigenschaften werden hinzugefügt:

Sondeneigenschaft Description
Name Name der Sonde. Dieser Name wird verwendet, um auf den Prüfpunkt in den Back-End-HTTP-Einstellungen zu verweisen.
Protokoll Das Protokoll, das zum Senden der Probe verwendet wurde. Der Prüfpunkt verwendet das protokoll, das in den Back-End-HTTP-Einstellungen definiert ist.
Host Host-Name für das Senden der Probe. Gilt nur, wenn mehrere Standorte auf dem Anwendungsgateway konfiguriert sind. Dies unterscheidet sich vom VM-Hostnamen.
Pfad Relativer Pfad der Messsonde. Der gültige Pfad beginnt mit '/'. Die Probe wird an <protocol>://<host>:<port><path> gesendet.
Intervall Überprüfungsintervall in Sekunden Dies ist das Zeitintervall zwischen zwei aufeinander folgenden Probes.
Zeitüberschreitung Abfragezeitlimit in Sekunden. Wenn innerhalb dieses Timeoutzeitraums keine gültige Antwort empfangen wird, wird der Prüfpunkt als fehlgeschlagen markiert.
Ungesunder Schwellenwert Anzahl der Wiederholungsversuche der Überprüfung Der Back-End-Server wird als ausgefallen markiert, wenn die Anzahl aufeinanderfolgender fehlerhafter Prüfungen den Fehlerschwellenwert erreicht.

Lösung

Überprüfen Sie, ob der benutzerdefinierte Integritätstest ordnungsgemäß konfiguriert ist, wie in der vorherigen Tabelle dargestellt. Stellen Sie zusätzlich zu den vorherigen Problembehandlungsschritten auch Folgendes sicher:

  • Stellen Sie sicher, dass die Sonde gemäß dem Leitfaden korrekt angegeben ist.
  • Wenn das Anwendungsgateway für eine einzelne Website konfiguriert ist, sollte standardmäßig der Hostname als 127.0.0.1 angegeben werden, es sei denn, dies ist in einem benutzerdefinierten Prüfpunkt anders konfiguriert.
  • Stellen Sie sicher, dass ein Aufruf von http://<host>:<port><pfad> einen HTTP-Ergebniscode von 200 zurückgibt.
  • Stellen Sie sicher, dass Intervall, Timeout und UnhealthyThreshold innerhalb der zulässigen Bereiche liegen.
  • Stellen Sie bei Verwendung eines HTTPS-Prüfpunkts sicher, dass der Back-End-Server SNI nicht erfordert, indem Sie ein Fallbackzertifikat auf dem Back-End-Server selbst konfigurieren.

Anforderungstimeout

Ursache

Wenn eine Benutzeranforderung empfangen wird, wendet das Anwendungsgateway die konfigurierten Regeln auf die Anforderung an und leitet sie an eine Back-End-Poolinstanz weiter. Es wartet auf ein konfigurierbares Zeitintervall für eine Antwort aus der Back-End-Instanz. Dieses Intervall beträgt standardmäßig 20 Sekunden. Wenn das Anwendungsgateway v1 in diesem Intervall keine Antwort von der Back-End-Anwendung empfängt, erhält die Benutzeranforderung einen Fehler von 502. Wenn das Anwendungsgateway v2 in diesem Intervall keine Antwort von der Back-End-Anwendung empfängt, wird die Anforderung an ein zweites Back-End-Poolmitglied weitergeleitet. Wenn die zweite Anforderung fehlschlägt, erhält die Benutzeranforderung einen Fehler von 504.

Lösung

Mit dem Anwendungsgateway können Sie diese Einstellung über das Back-EndHttpSetting konfigurieren, das dann auf verschiedene Pools angewendet werden kann. Verschiedene Back-End-Pools können unterschiedliche Back-EndHttpSetting und ein anderes Anforderungstimeout konfiguriert haben.

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

Leerer Backend-Adresspool

Ursache

Wenn das Anwendungsgateway keine VMs oder VM-Skalierungsgruppen im Back-End-Adresspool konfiguriert hat, kann es keine Kundenanfrage weiterleiten und eine Bad Gateway-Fehlermeldung senden.

Lösung

Stellen Sie sicher, dass der Back-End-Adresspool nicht leer ist. Dies kann entweder über PowerShell, CLI oder Portal erfolgen.

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

Die Ausgabe des vorangehenden Cmdlets sollte einen nicht-leeren Backend-Adresspool enthalten. Das folgende Beispiel zeigt zwei zurückgegebene Pools, die mit einem FQDN oder einer IP-Adresse für die Back-End-VMs konfiguriert sind. Der Bereitstellungsstatus des Back-EndAddressPools muss "Succeeded" sein.

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"
}]

Fehlerhafte Instanzen im Backend-Adresspool

Ursache

Wenn alle Instanzen von BackendAddressPool fehlerhaft sind, hat das Anwendungsgateway keinen Backend-Server, um Benutzeranforderungen weiterzuleiten. Dies kann auch der Fall sein, wenn Back-End-Instanzen fehlerfrei sind, die erforderliche Anwendung jedoch nicht bereitgestellt wird.

Lösung

Stellen Sie sicher, dass die Instanzen fehlerfrei sind und die Anwendung ordnungsgemäß konfiguriert ist. Überprüfen Sie, ob die Back-End-Instanzen auf einen Ping von einem anderen virtuellen Computer im selben VNet reagieren können. Wenn sie mit einem öffentlichen Endpunkt konfiguriert ist, stellen Sie sicher, dass eine Browseranforderung an die Webanwendung dienstbar ist.

Vorgelagertes SSL-Zertifikat stimmt nicht überein

Ursache

Das auf Back-End-Servern installierte TLS-Zertifikat stimmt nicht mit dem hostnamen überein, der im Hostanforderungsheader empfangen wurde.

In Szenarien, in denen End-to-End-TLS aktiviert ist, eine Konfiguration, die durch Bearbeiten der entsprechenden "Back-End-HTTP-Einstellungen" erreicht wird und die Konfiguration der Einstellung "Back-End-Protokoll" auf HTTPS geändert wird, ist es obligatorisch, sicherzustellen, dass der DNS-NAME des tls-Zertifikats, das auf Back-End-Servern installiert ist, dem Hostnamen entspricht, der in der HTTP-Hostheaderanforderung zum Back-End kommt.

Wenn Sie als Erinnerung in den 'Backend-HTTP-Einstellungen' die Option für das Protokoll HTTPS anstelle von HTTP aktivieren, wird der zweite Teil der Kommunikation zwischen den Instanzen des Anwendungsgateways und den Back-End-Servern mit TLS verschlüsselt.

Aufgrund der Tatsache, dass das Anwendungsgateway standardmäßig denselben HTTP-Hostheader an das Back-End sendet, wie er vom Client empfängt, müssen Sie sicherstellen, dass das auf dem Back-End-Server installierte TLS-Zertifikat mit einem DNS-NAMEN ausgegeben wird, der dem Hostnamen entspricht, der vom Back-End-Server im HTTP-Hostheader empfangen wird. Denken Sie daran, dass dieser Hostname, sofern nicht anders angegeben, mit dem vom Client empfangenen Hostnamen identisch ist.

Beispiel:

Stellen Sie sich vor, Sie verfügen über ein Anwendungsgateway, das die HTTPS-Anforderungen für die Domäne www.contoso.combedient. Sie könnten die Domäne contoso.com an eine Azure DNS öffentliche Zone delegiert haben, und einen DNS-Eintrag in dieser Zone, der www.contoso.com auf die öffentliche IP des spezifischen Anwendungsgateways verweist, das die Anforderungen bedient.

Auf diesem Anwendungsgateway sollten Sie einen Listener für den Host www.contoso.com mit einer Regel haben, die die "Backend-HTTP-Einstellung" zwingt, das Protokoll HTTPS zu verwenden (um End-to-End-TLS sicherzustellen). Dieselbe Regel könnte einen Back-End-Pool mit zwei virtuellen Computern konfiguriert haben, auf denen IIS als Webserver ausgeführt wird.

Wie wir wissen, aktiviert die Aktivierung von HTTPS in der "Backed HTTP-Einstellung" der Regel, dass der zweite Teil der Kommunikation zwischen den Anwendungsgatewayinstanzen und den Servern im Backend TLS verwendet.

Wenn die Back-End-Server kein TLS-Zertifikat für den DNS-NAMEN www.contoso.com oder *.contoso.com ausgestellt haben, schlägt die Anforderung mit Dem Serverfehler 502 fehl: Webserver hat eine ungültige Antwort erhalten, während sie als Gateway oder Proxyserver fungiert , da das upstream-SSL-Zertifikat (das auf den Back-End-Servern installierte Zertifikat) nicht mit dem Hostnamen im Hostheader übereinstimmt. daher schlägt die TLS-Aushandlung fehl.

www.contoso.com --> APP GW Front-End-IP --> Listener mit einer Regel, die die "Back-End-HTTP-Einstellungen" so konfiguriert, dass das Protokoll HTTPS anstelle von HTTP verwendet wird --> Back-End-Pool --> Webserver (muss über ein installiertes TLS-Zertifikat für www.contoso.com verfügen)

Lösung

Es ist erforderlich, dass der DNS-NAME des auf dem Back-End-Server installierten TLS-Zertifikats mit dem Hostnamen übereinstimmt, der in den HTTP-Back-End-Einstellungen konfiguriert ist, andernfalls der zweite Teil der End-to-End-Kommunikation, die zwischen den Instanzen des Anwendungsgateways und dem Back-End erfolgt, schlägt mit "Upstream SSL-Zertifikat stimmt nicht überein", und löst einen Serverfehler zurück: 502 – Webserver erhielt eine ungültige Antwort, während sie als Gateway- oder Proxyserver fungiert