Skip to content

Application Gateway Multi-Application Routing Guidance

This document provides best practices for using Azure Application Gateway to route traffic to multiple backend applications, including listener configuration, path-based routing, and host-based routing patterns.

Application Gateway Architecture

Core Components

text Clients | v [Application Gateway] | +-- Frontend IP (Public) +-- Listeners +-- Rules +-- Backend Pools +-- HTTP Settings +-- Probestext

Key components:

  • Frontend IP: Public IP receiving incoming requests
  • Listeners: Port and protocol binding (HTTP/HTTPS)
  • Routing Rules: HTTP(S) rules mapping listeners to backend pools
  • Backend Pools: Groups of backend resources (VMs, App Service, containers)
  • HTTP Settings: Connection protocol, timeout, cookie affinity
  • Health Probes: Monitor backend health; remove unhealthy instances

SKU Selection

Choose based on throughput and features:

SKU Max Throughput WAF Multi-Site Auto-Scale
Standard 1,250 Mbps No Yes No
Standard_v2 2,500 Mbps No Yes Yes
WAF_v2 2,500 Mbps Yes Yes Yes

Multi-Application Routing Patterns

Pattern 1: Host-Based Routing

Route based on Host header (hostname):

```powershell

Backend pools for each app

$pool1 = New-AzApplicationGatewayBackendAddressPool -Name 'web-app-pool' -BackendAddresses @('10.0.1.10') $pool2 = New-AzApplicationGatewayBackendAddressPool -Name 'api-pool' -BackendAddresses @('10.0.2.10') $pool3 = New-AzApplicationGatewayBackendAddressPool -Name 'admin-pool' -BackendAddresses @('10.0.3.10')

HTTP listeners for each hostname

$listener1 = New-AzApplicationGatewayHttpListener -Name 'web-listener' -FrontendIPConfiguration $fipConfig -FrontendPort $port -Protocol 'Http' ` -HostName 'www.example.com'

$listener2 = New-AzApplicationGatewayHttpListener -Name 'api-listener' -FrontendIPConfiguration $fipConfig -FrontendPort $port -Protocol 'Http' ` -HostName 'api.example.com'

Rules mapping listeners to pools

$rule1 = New-AzApplicationGatewayRequestRoutingRule -Name 'web-rule' -RuleType 'Basic' -HttpListener $listener1 -BackendAddressPool $pool1 ` -HttpSettings $httpSettings

$rule2 = New-AzApplicationGatewayRequestRoutingRule -Name 'api-rule' -RuleType 'Basic' -HttpListener $listener2 -BackendAddressPool $pool2 ` -HttpSettings $httpSettings ```text

Pattern 2: Path-Based Routing

Route based on URL path (/api/, /admin/, etc.):

```powershell

URL path map defines routing by prefix

$urlPathMap = New-AzApplicationGatewayUrlPathMap -Name 'url-path-map' -DefaultBackendAddressPool $defaultPool ` -DefaultBackendHttpSettings $httpSettings

Add path rules

$pathRule1 = New-AzApplicationGatewayPathRule -Name 'api-path' -Paths '/api/*' -BackendAddressPool $apiPool -BackendHttpSettings $httpSettings

$pathRule2 = New-AzApplicationGatewayPathRule -Name 'admin-path' -Paths '/admin/*' -BackendAddressPool $adminPool -BackendHttpSettings $httpSettings

$urlPathMap = Update-AzApplicationGatewayUrlPathMap -ApplicationGateway $appGw -UrlPathMap $urlPathMap ` -PathRules @($pathRule1, $pathRule2)

Create path-based routing rule

$rule = New-AzApplicationGatewayRequestRoutingRule -Name 'path-routing-rule' -RuleType 'PathBasedRouting' -HttpListener $listener -UrlPathMap $urlPathMap ```text

Pattern 3: Multi-Site Host-Based with HTTPS

Route HTTPS traffic to multiple applications by hostname:

```powershell

Load SSL certificate

$cert = New-AzApplicationGatewaySslCertificate -Name 'appgw-cert' -CertificateFile 'C:\certs\certificate.pfx' ` -Password (ConvertTo-SecureString 'password' -AsPlainText -Force)

HTTPS frontend port

$httpsPort = New-AzApplicationGatewayFrontendPort -Name 'https' -Port 443 ` -Protocol 'Https'

HTTPS listeners for each application

$listener1 = New-AzApplicationGatewayHttpListener -Name 'web-https-listener' -FrontendIPConfiguration $fipConfig -FrontendPort $httpsPort -Protocol 'Https' -SslCertificate $cert -HostName 'www.example.com'

$listener2 = New-AzApplicationGatewayHttpListener -Name 'api-https-listener' -FrontendIPConfiguration $fipConfig -FrontendPort $httpsPort -Protocol 'Https' -SslCertificate $cert -HostName 'api.example.com'

Redirect HTTP to HTTPS

$rule = New-AzApplicationGatewayRequestRoutingRule -Name 'redirect-rule' -RuleType 'Basic' -HttpListener $httpListener -RedirectConfiguration (New-AzApplicationGatewayRedirectConfiguration -Name 'http-to-https' -RedirectType 'Permanent' -TargetListener $listener1 -IncludePath $true ` -IncludeQueryString $true) ```text

Advanced Routing Configurations

Health Probes for Backend Monitoring

Define probes to detect unhealthy backends:

```powershell

Custom probe for API backend

$probe = New-AzApplicationGatewayProbeConfig -Name 'api-probe' -Protocol 'Http' -HostName 'api.example.com' -Path '/health' -Interval 30 -Timeout 10 -UnhealthyThreshold 3 -PickHostNameFromBackendHttpSettings $true

Associate probe with HTTP settings

$httpSettings = New-AzApplicationGatewayBackendHttpSettings -Name 'api-settings' -Port 80 -Protocol 'Http' -CookieBasedAffinity 'Disabled' -Probe $probe -RequestTimeout 30

Backend health check

Get-AzApplicationGatewayBackendHealth -ResourceGroupName 'prod-rg' -ApplicationGatewayName 'app-gateway' ```text

Session Affinity (Sticky Sessions)

Ensure user requests route to same backend:

```powershell

Enable cookie-based affinity

$httpSettings = New-AzApplicationGatewayBackendHttpSettings -Name 'sticky-settings' -Port 80 -Protocol 'Http' -CookieBasedAffinity 'Enabled' -CookieName 'APPGWROUTE' -RequestTimeout 30 ```text

Request Rewriting

Rewrite headers and URL paths before sending to backend:

```powershell

Add custom header indicating request came through gateway

$rewriteRuleSet = New-AzApplicationGatewayRewriteRuleSet ` -Name 'add-headers'

$rule = New-AzApplicationGatewayRewriteRule -Name 'add-x-forwarded' -RuleSequence 100 -ActionSet (New-AzApplicationGatewayRewriteRuleActionSet -RequestHeaderConfiguration @(@{Header = 'X-Forwarded-For'; Value = '{var_client_ip}'}) ` -ResponseHeaderConfiguration @(@{Header = 'X-Gateway-Version'; Value = 'v2'}))

Path rewriting example: /old-path/ -> /new-path/

$pathRewriteRule = New-AzApplicationGatewayRewriteRule -Name 'rewrite-path' -RuleSequence 200 -Condition (New-AzApplicationGatewayRewriteRuleCondition -Variable 'url_path' -Pattern '^/old-path/(.*)$') -ActionSet (New-AzApplicationGatewayRewriteRuleActionSet ` -UrlConfiguration @{ModifiedPath = '/new-path/$1'}) ```text

High Availability Configuration

Multi-Region Failover

Deploy Application Gateway across multiple regions with Traffic Manager:

```powershell

Traffic Manager profile routes between regions

$profile = New-AzTrafficManagerProfile -Name 'app-global' -ResourceGroupName 'prod-rg' -ProfileStatus 'Enabled' -TrafficRoutingMethod 'Geographic'

Add endpoints for each region

Add-AzTrafficManagerEndpointConfig -EndpointName 'east-us' -EndpointStatus 'Enabled' -EndpointType 'AzureEndpoints' -ResourceId "/subscriptions/.../resourceGroups/prod-rg-east/providers/Microsoft.Network/applicationGateways/app-gateway-east" -GeoMapping @('US', 'CA') -TrafficManagerProfile $profile

Geographic routing ensures users connect to nearest region

```text

Auto-Scaling Configuration

```powershell

Auto-scale from 2 to 10 instances based on capacity units

$autoScaleConfig = New-AzApplicationGatewayAutoscaleConfiguration -MinCapacity 2 -MaxCapacity 10

Monitor capacity units

Get-AzApplicationGatewayAutoscaleConfiguration ` -ApplicationGateway $appGw | Select-Object MinCapacity, MaxCapacity ```text

Security: Web Application Firewall (WAF)

Enable WAF_v2 with OWASP Rules

```powershell

Create WAF policy

$wafPolicy = New-AzWebApplicationFirewallPolicy -Name 'app-gateway-waf' -ResourceGroupName 'prod-rg' -ManagedRules (New-AzWebApplicationFirewallPolicyManagedRuleSet -ManagedRuleSetType 'OWASP' -ManagedRuleSetVersion '3.2' -Exclusion @( New-AzWebApplicationFirewallPolicyManagedRuleExclusion -MatchVariable 'RequestHeaderNames' -SelectorMatchOperator 'Equals' -Selector 'X-Forwarded-For'))

Associate WAF policy with gateway

$appGw = Update-AzApplicationGateway -ApplicationGateway $appGw -WebApplicationFirewallPolicyId $wafPolicy.Id ```text

Monitoring and Diagnostics

Application Insights Integration

```csharp // Instrument backend application to correlate requests using Microsoft.ApplicationInsights; using Microsoft.ApplicationInsights.DataContracts;

public class ApiController : ControllerBase { private readonly TelemetryClient _telemetry;

public ApiController(TelemetryClient telemetry)
{
    _telemetry = telemetry;
}

[HttpGet("/api/data")]
public IActionResult GetData()
{
    var requestProps = new Dictionary<string, string>
    {
        { "AppGW-RuleId", Request.Headers["X-AppGW-Rule"].ToString() },
        { "BackendPool", Request.Headers["X-Backend-Pool"].ToString() }
    };

    _telemetry.TrackEvent("APIRequest", requestProps);

    return Ok(new { message = "Success" });
}

} ```text

Metrics and Alerts

```powershell

Alert when backend health degrades

$condition = New-AzMetricAlertRuleV2Criteria -MetricName 'HealthyHostCount' -MetricNamespace 'Microsoft.Network/applicationGateways' -Name 'HealthyHostCount' -Operator 'LessThan' -Threshold 1 -TimeAggregation 'Average'

New-AzMetricAlertRuleV2 -Name 'AppGW-UnhealthyBackend' -ResourceGroupName 'prod-rg' -TargetResourceId "/subscriptions/.../resourceGroups/prod-rg/providers/Microsoft.Network/applicationGateways/app-gateway" -Criteria $condition -ActionGroup $actionGroup.Id -Frequency 00:05:00 ` -WindowSize 00:10:00 ```text

Base Coat Assets

  • Agent: agents/basecoat-10-core-middleware-dev.agent.md
  • Skill: skills/azure-compute/
  • Instruction: instructions/routing-patterns.instructions.md

References