Back to Blog
3 min read

Azure Application Gateway v2: Advanced Load Balancing

Application Gateway v2 provides advanced L7 load balancing. URL routing, SSL termination, WAF, and autoscaling—all in one service.

v2 Improvements

Featurev1v2
AutoscalingManualAutomatic
Zone redundancyNoYes
Header rewriteNoYes
WAF 3.0NoYes
PerformanceGood5x better

Create Application Gateway v2

# Create subnet
az network vnet subnet create \
    --resource-group myRG \
    --vnet-name myVNet \
    --name AppGatewaySubnet \
    --address-prefix 10.0.2.0/24

# Create public IP
az network public-ip create \
    --resource-group myRG \
    --name appgw-pip \
    --sku Standard \
    --allocation-method Static

# Create Application Gateway
az network application-gateway create \
    --name myAppGateway \
    --resource-group myRG \
    --location eastus \
    --sku Standard_v2 \
    --capacity 2 \
    --vnet-name myVNet \
    --subnet AppGatewaySubnet \
    --public-ip-address appgw-pip \
    --http-settings-cookie-based-affinity Enabled \
    --frontend-port 443 \
    --http-settings-port 80 \
    --http-settings-protocol Http \
    --servers 10.0.1.4 10.0.1.5

SSL Termination

# Add SSL certificate
az network application-gateway ssl-cert create \
    --resource-group myRG \
    --gateway-name myAppGateway \
    --name myCert \
    --cert-file /path/to/cert.pfx \
    --cert-password "password"

# Create HTTPS listener
az network application-gateway http-listener create \
    --resource-group myRG \
    --gateway-name myAppGateway \
    --name httpsListener \
    --frontend-port 443 \
    --ssl-cert myCert

URL-Based Routing

# Create backend pool for API
az network application-gateway address-pool create \
    --resource-group myRG \
    --gateway-name myAppGateway \
    --name apiPool \
    --servers 10.0.1.10 10.0.1.11

# Create URL path map
az network application-gateway url-path-map create \
    --resource-group myRG \
    --gateway-name myAppGateway \
    --name pathMap \
    --paths /api/* \
    --address-pool apiPool \
    --default-address-pool webPool \
    --http-settings appGatewayBackendHttpSettings

# Create path rule
az network application-gateway url-path-map rule create \
    --resource-group myRG \
    --gateway-name myAppGateway \
    --path-map-name pathMap \
    --name apiRule \
    --paths /api/* \
    --address-pool apiPool

Header Rewrite

# Create rewrite rule set
az network application-gateway rewrite-rule set create \
    --resource-group myRG \
    --gateway-name myAppGateway \
    --name rewriteRules

# Add rewrite rule
az network application-gateway rewrite-rule create \
    --resource-group myRG \
    --gateway-name myAppGateway \
    --rule-set-name rewriteRules \
    --name addSecurityHeaders \
    --response-headers 'X-Frame-Options=DENY' 'X-Content-Type-Options=nosniff' \
    --request-headers 'X-Forwarded-For={var_add_x_forwarded_for_proxy}'

Autoscaling

# Configure autoscale
az network application-gateway update \
    --resource-group myRG \
    --name myAppGateway \
    --min-capacity 2 \
    --max-capacity 10

Health Probes

# Create custom health probe
az network application-gateway probe create \
    --resource-group myRG \
    --gateway-name myAppGateway \
    --name healthProbe \
    --protocol Http \
    --host-name-from-http-settings true \
    --path /health \
    --interval 30 \
    --timeout 30 \
    --threshold 3 \
    --match-status-codes 200-399

WAF Integration

# Create WAF policy
az network application-gateway waf-policy create \
    --name myWAFPolicy \
    --resource-group myRG

# Enable managed rules
az network application-gateway waf-policy managed-rule rule-set add \
    --policy-name myWAFPolicy \
    --resource-group myRG \
    --type OWASP \
    --version 3.2

# Associate with gateway
az network application-gateway update \
    --name myAppGateway \
    --resource-group myRG \
    --waf-policy myWAFPolicy

Connection Draining

az network application-gateway update \
    --resource-group myRG \
    --name myAppGateway \
    --connection-draining-timeout 60

Application Gateway v2: enterprise-grade L7 load balancing.

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.