Risoluzione degli errori del gateway non valido nel gateway applicazioneTroubleshooting bad gateway errors in Application Gateway

Informazioni su come risolvere gli errori di gateway non valido (502) ricevuti durante l'uso di un gateway applicazione.Learn how to troubleshoot bad gateway (502) errors received when using application gateway.

PanoramicaOverview

Dopo aver configurato un gateway applicazione, uno degli errori che gli utenti possono riscontrare è "Errore del server: 502 - Risposta non valida ricevuta dal server Web in funzione come server proxy o gateway".After configuring an application gateway, one of the errors that users may encounter is "Server Error: 502 - Web server received an invalid response while acting as a gateway or proxy server". Questo errore può verificarsi a causa dei principali motivi seguenti:This error may happen due to the following main reasons:

Problema di gruppo di sicurezza di rete, route definita dall'utente o DNS personalizzatoNetwork Security Group, User Defined Route, or Custom DNS issue

CausaCause

Se l'accesso al back-end è bloccato a causa della presenza di un gruppo di sicurezza di rete, di una route definita dall'utente o di un DNS personalizzato, le istanze del gateway applicazione non saranno in grado di raggiungere il pool back-end e daranno origine a problemi di probe, causando errori 502.If access to backend is blocked due to presence of NSG, UDR or custom DNS, Application Gateway instances will not be able to reach the backend pool and would result in probe failures causing 502 errors. Si noti che possono essere presenti gruppi di sicurezza di rete/route definite dall'utente sia nella subnet del gateway applicazione, sia nella subnet in cui vengono distribuite le macchine virtuali delle applicazioni.Note that the NSG/UDR could be present either in Application Gateway subnet or the subnet where the application VMs are deployed. In modo analogo, anche la presenza di un DNS personalizzato nella rete virtuale potrebbe causare problemi se si usa un nome di dominio completo per i membri del pool back-end e tale nome non viene risolto correttamente dal server DNS configurato dall'utente per la rete virtuale.Similarly presence of custom DNS in the VNET could also cause issues if FQDN is used for backend pool members and is not resolved correctly by the user configured DNS server for the VNET.

SoluzioneSolution

Convalidare la configurazione di gruppo di sicurezza di rete, route definita dall'utente o DNS personalizzato tramite i passaggi seguenti:Validate NSG, UDR, and DNS configuration by going through the following steps:

  • Controllare i gruppi di sicurezza di rete associati alla subnet del gateway applicazione.Check NSGs associated with Application Gateway subnet. Verificare che la comunicazione con il back-end non sia bloccata.Ensure that communication to backend is not blocked.
  • Controllare la route definita dall'utente associata alla subnet del gateway applicazione.Check UDR associated with Application Gateway subnet. Assicurarsi che la route definita dall'utente non indirizzi il traffico fuori dalla subnet del back-end. Controllare, ad esempio, che il routing verso appliance virtuali di rete o route predefinite venga annunciato alla subnet del gateway applicazione tramite ExpressRoute/VPN.Ensure that UDR is not directing traffic away from backend subnet - for example check for routing to network virtual appliances or default routes being advertised to Application Gateway subnet via ExpressRoute/VPN.
$vnet = Get-AzureRmVirtualNetwork -Name vnetName -ResourceGroupName rgName
Get-AzureRmVirtualNetworkSubnetConfig -Name appGwSubnet -VirtualNetwork $vnet
  • Controllare il gruppo di sicurezza di rete e la route effettivi nella macchina virtuale back-endCheck effective NSG and route with the backend VM
Get-AzureRmEffectiveNetworkSecurityGroup -NetworkInterfaceName nic1 -ResourceGroupName testrg
Get-AzureRmEffectiveRouteTable -NetworkInterfaceName nic1 -ResourceGroupName testrg
  • Controllare se è presente un DNS personalizzato nella rete virtuale.Check presence of custom DNS in the VNet. È possibile eseguire questo controllo esaminando i dettagli delle proprietà della rete virtuale nell'output.DNS can be checked by looking at details of the VNet properties in the output.
Get-AzureRmVirtualNetwork -Name vnetName -ResourceGroupName rgName 
DhcpOptions            : {
                           "DnsServers": [
                             "x.x.x.x"
                           ]
                         }

Se presente, assicurarsi che il server DNS sia in grado di risolvere correttamente il nome di dominio completo del membro del pool back-end.If present, ensure that the DNS server is able to resolve backend pool member's FQDN correctly.

Problemi con il probe di integrità predefinitoProblems with default health probe

CausaCause

Gli errori 502 possono anche indicare frequentemente che il probe di integrità predefinito non riesce a raggiungere le VM back-end.502 errors can also be frequent indicators that the default health probe is not able to reach back-end VMs. Quando viene eseguito il provisioning di un'istanza del gateway applicazione, viene automaticamente configurato il probe di integrità predefinito per ogni BackendAddressPool tramite le proprietà del BackendHttpSetting.When an Application Gateway instance is provisioned, it automatically configures a default health probe to each BackendAddressPool using properties of the BackendHttpSetting. Per impostare il probe non è necessaria alcuna azione da parte dell'utente.No user input is required to set this probe. In particolare, quando viene configurata una regola di bilanciamento del carico, viene creata un'associazione tra BackendHttpSetting e BackendAddressPool.Specifically, when a load balancing rule is configured, an association is made between a BackendHttpSetting and BackendAddressPool. Il probe predefinito viene configurato per ognuna di queste associazioni e il gateway applicazione avvia una connessione di controllo di integrità periodica su ogni istanza nel BackendAddressPool, sulla porta specificata nell'elemento BackendHttpSetting.A default probe is configured for each of these associations and Application Gateway initiates a periodic health check connection to each instance in the BackendAddressPool at the port specified in the BackendHttpSetting element. La tabella seguente elenca i valori associati al probe di integrità predefinito.Following table lists the values associated with the default health probe.

Proprietà probeProbe property ValoreValue DescrizioneDescription
URL probeProbe URL http://127.0.0.1/http://127.0.0.1/ Percorso URLURL path
IntervalInterval 3030 Intervallo di probe in secondiProbe interval in seconds
TimeoutTime-out 3030 Timeout di probe in secondiProbe time-out in seconds
Soglia non integraUnhealthy threshold 33 Numero di tentativi di probe.Probe retry count. Il server back-end viene contrassegnato come inattivo dopo che il numero di errori di probe consecutivi ha raggiunto una soglia non integra.The back-end server is marked down after the consecutive probe failure count reaches the unhealthy threshold.

SoluzioneSolution

  • Verificare che sia stato configurato un sito predefinito e che sia in ascolto su 127.0.0.1.Ensure that a default site is configured and is listening at 127.0.0.1.
  • Se BackendHttpSetting specifica una porta diversa da 80, il sito predefinito deve essere configurato per ascoltare tale porta.If BackendHttpSetting specifies a port other than 80, the default site should be configured to listen at that port.
  • La chiamata a http://127.0.0.1:port deve restituire un codice risultato HTTP di 200.The call to http://127.0.0.1:port should return an HTTP result code of 200. Questo valore deve essere restituito entro il periodo di timeout di 30 secondi.This should be returned within the 30 sec time-out period.
  • Verificare che la porta configurata sia aperta e che non esistano regole del firewall o gruppi di sicurezza di rete di Azure che bloccano il traffico in ingresso o in uscita sulla porta configurata.Ensure that port configured is open and that there are no firewall rules or Azure Network Security Groups, which block incoming or outgoing traffic on the port configured.
  • Se le macchine virtuali classiche di Azure o il servizio cloud vengono usati con indirizzi FQDN o IP pubblici, verificare che l' endpoint corrispondente sia aperto.If Azure classic VMs or Cloud Service is used with FQDN or Public IP, ensure that the corresponding endpoint is opened.
  • Se la macchina virtuale è stata configurata tramite Azure Resource Manager e si trova all'esterno della rete virtuale in cui è distribuito il gateway applicazione, è necessario configurare un Gruppo di sicurezza di rete per consentire l'accesso alla porta desiderata.If the VM is configured via Azure Resource Manager and is outside the VNet where Application Gateway is deployed, Network Security Group must be configured to allow access on the desired port.

Problemi con il probe di integrità personalizzatoProblems with custom health probe

CausaCause

Il probe di integrità personalizzato consente una maggiore flessibilità per la ricerca di comportamenti predefiniti del probe.Custom health probes allow additional flexibility to the default probing behavior. Quando si usano probe personalizzati, gli utenti possono configurare l'intervallo di probe, l'URL e il percorso da testare, nonché il numero di risposte non riuscite da accettare prima di contrassegnare l'istanza del pool back-end come non integra.When using custom probes, users can configure the probe interval, the URL, and path to test, and how many failed responses to accept before marking the back-end pool instance as unhealthy. Vengono aggiunte le seguenti proprietà aggiuntive.The following additional properties are added.

Proprietà probeProbe property DescrizioneDescription
NomeName Nome del probe.Name of the probe. Questo nome viene usato per fare riferimento al probe nelle impostazioni HTTP back-endThis name is used to refer to the probe in back-end HTTP settings.
ProtocolProtocol Protocollo usato per inviare il probe.Protocol used to send the probe. Il probe usa il protocollo definito nelle impostazioni HTTP del back-end.The probe uses the protocol defined in the back-end HTTP settings
HostHost Nome host per inviare il probe.Host name to send the probe. Applicabile solo quando vengono configurati più siti nel gateway applicazione.Applicable only when multi-site is configured on Application Gateway. Questo nome è diverso dal nome host della macchina virtuale.This is different from VM host name.
PathPath Percorso relativo del probe.Relative path of the probe. Il percorso valido inizia da "/".The valid path starts from '/'. Il probe viene inviato a <protocollo>://<host>:<porta><percorso>The probe is sent to <protocol>://<host>:<port><path>
IntervalInterval Intervallo di probe in secondi.Probe interval in seconds. Si tratta dell'intervallo di tempo tra due probe consecutivi.This is the time interval between two consecutive probes.
TimeoutTime-out Timeout del probe in secondi.Probe time-out in seconds. Se non viene ricevuta una risposta valida entro questo periodo di timeout, il probe viene contrassegnato come non riuscito.If a valid response is not received within this time-out period, the probe is marked as failed.
Soglia non integraUnhealthy threshold Numero di tentativi di probe.Probe retry count. Il server back-end viene contrassegnato come inattivo dopo che il numero di errori di probe consecutivi ha raggiunto una soglia non integra.The back-end server is marked down after the consecutive probe failure count reaches the unhealthy threshold.

SoluzioneSolution

Verificare che il probe di integrità personalizzato sia configurato correttamente in base alla tabella precedente.Validate that the Custom Health Probe is configured correctly as the preceding table. In aggiunta alle procedure di risoluzione dei problemi precedenti, verificare anche quanto segue:In addition to the preceding troubleshooting steps, also ensure the following:

  • Verificare che il probe sia specificato correttamente secondo le istruzioni della guida.Ensure that the probe is correctly specified as per the guide.
  • Se il gateway applicazione è configurato per un singolo sito, per impostazione predefinita il nome dell'host deve essere specificato come "127.0.0.1", se non diversamente configurato nel probe personalizzato.If Application Gateway is configured for a single site, by default the Host name should be specified as '127.0.0.1', unless otherwise configured in custom probe.
  • Verificare che la chiamata a http://<host>:<porta><percorso> restituisca un codice risultato HTTP di 200.Ensure that a call to http://<host>:<port><path> returns an HTTP result code of 200.
  • Assicurarsi che Intervallo, Timeout e Soglia non integra siano compresi in intervalli accettabili.Ensure that Interval, Time-out and UnhealtyThreshold are within the acceptable ranges.
  • Se si usa un probe HTTPS, assicurarsi che il server back-end non richieda SNI configurando un certificato di fallback nello stesso server back-end.If using an HTTPS probe, make sure that the backend server doesn't require SNI by configuring a fallback certificate on the backend server itself.
  • Assicurarsi che i valori di Interval, Time-out e UnhealtyThreshold siano compresi in intervalli accettabili.Ensure that Interval, Time-out, and UnhealtyThreshold are within the acceptable ranges.

Timeout della richiestaRequest time-out

CausaCause

Quando viene ricevuta una richiesta dell'utente, il gateway applicazione applica le regole configurate alla richiesta e la instrada a un'istanza del pool back-end.When a user request is received, Application Gateway applies the configured rules to the request and routes it to a back-end pool instance. Attende quindi la risposta dall'istanza back-end per un intervallo di tempo configurabile.It waits for a configurable interval of time for a response from the back-end instance. Per impostazione predefinita, l'intervallo è impostato su 30 secondi.By default, this interval is 30 seconds. Se il gateway applicazione non riceve una risposta dall'applicazione back-end in questo intervallo, alla richiesta dell'utente viene assegnato un errore 502.If Application Gateway does not receive a response from back-end application in this interval, user request would see a 502 error.

SoluzioneSolution

Il gateway applicazione consente agli utenti di configurare questa impostazione tramite BackendHttpSetting, applicabile a pool diversi.Application Gateway allows users to configure this setting via BackendHttpSetting, which can be then applied to different pools. I diversi pool back-end possono avere BackendHttpSetting differenti e quindi una diversa configurazione del timeout della richiesta.Different back-end pools can have different BackendHttpSetting and hence different request time-out configured.

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

BackendAddressPool vuotoEmpty BackendAddressPool

CausaCause

Se nel pool di indirizzi back-end non sono presenti macchine virtuali o set di scalabilità di macchine virtuali configurati, il gateway applicazione non può instradare le richieste del cliente e genera un errore di gateway non valido.If the Application Gateway has no VMs or virtual machine scale set configured in the back-end address pool, it cannot route any customer request and throws a bad gateway error.

SoluzioneSolution

Verificare che il pool di indirizzi back-end non sia vuoto.Ensure that the back-end address pool is not empty. A tale scopo è possibile usare PowerShell, l'interfaccia della riga di comando o il portale.This can be done either via PowerShell, CLI, or portal.

Get-AzureRmApplicationGateway -Name "SampleGateway" -ResourceGroupName "ExampleResourceGroup"

L'output del cmdlet precedente dovrebbe contenere un pool di indirizzi back-end non vuoto.The output from the preceding cmdlet should contain non-empty back-end address pool. Di seguito è riportato un esempio in cui vengono restituiti due pool configurati con indirizzi IP o FQDN (nome di dominio completo) per le macchine virtuali back-end.Following is an example where two pools are returned which are configured with FQDN or IP addresses for backend VMs. Lo stato del provisioning di BackendAddressPool deve essere "Succeeded".The provisioning state of the BackendAddressPool must be 'Succeeded'.

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

Istanze non integre in BackendAddressPoolUnhealthy instances in BackendAddressPool

CausaCause

Se tutte le istanze di BackendAddressPool non sono integre, il gateway applicazione non avrà back-end a cui instradare la richiesta dell'utente.If all the instances of BackendAddressPool are unhealthy, then Application Gateway would not have any back-end to route user request to. Questo potrebbe anche verificarsi quando le istanze back-end sono integre ma non è stata distribuita l'applicazione necessaria.This could also be the case when back-end instances are healthy but do not have the required application deployed.

SoluzioneSolution

Verificare che le istanze siano integre e che l'applicazione sia configurata correttamente.Ensure that the instances are healthy and the application is properly configured. Controllare se le istanze back-end riescono a rispondere a un ping da un'altra VM nella stessa rete virtuale.Check if the back-end instances are able to respond to a ping from another VM in the same VNet. Se configurato con un endpoint pubblico, verificare che sia valida la richiesta del browser per l'applicazione Web.If configured with a public end point, ensure that a browser request to the web application is serviceable.

Passaggi successiviNext steps

Se i passaggi precedenti non risolvono il problema, aprire un ticket di supporto.If the preceding steps do not resolve the issue, open a support ticket.