使用 Azure PowerShell 创建托管多个站点的应用程序网关

创建应用程序网关时可以使用 Azure Powershell 配置多个网站的托管。 本教程中使用虚拟机规模集创建后端池。 然后,基于所拥有的域配置侦听器和规则,以确保 Web 流量可到达池中的相应服务器。 本教程假定你拥有多个域,并使用示例 www.contoso.comwww.fabrikam.com

在本文中,学习如何:

  • 设置网络
  • 创建应用程序网关
  • 创建侦听器和路由规则
  • 使用后端池创建虚拟机规模集
  • 在域中创建 CNAME 记录

多站点路由示例

如果没有 Azure 订阅,请在开始之前创建一个试用帐户

如果选择在本地安装并使用 PowerShell,则本教程需要 Azure PowerShell 模块版本 3.6 或更高版本。 若要查找版本,请运行 Get-Module -ListAvailable AzureRM。 如果需要进行升级,请参阅 Install Azure PowerShell module(安装 Azure PowerShell 模块)。 如果在本地运行 PowerShell,则还需运行 Login-AzureRmAccount -EnvironmentName AzureChinaCloud 以创建与 Azure 的连接。

创建资源组

资源组是在其中部署和管理 Azure 资源的逻辑容器。 使用 New-AzureRmResourceGroup 创建 Azure 资源组。

New-AzureRmResourceGroup -Name myResourceGroupAG -Location chinanorth

创建网络资源

使用 New-AzureRmVirtualNetworkSubnetConfig 配置名为 myBackendSubnetmyAGSubnet 的子网。 使用 New-AzureRmVirtualNetwork 和子网配置创建名为 myVNet 的虚拟网络。 最后使用 New-AzureRmPublicIpAddress 创建名为 myAGPublicIPAddress 的公共 IP 地址。 这些资源用于提供与应用程序网关及其关联资源的网络连接。

$backendSubnetConfig = New-AzureRmVirtualNetworkSubnetConfig `
  -Name myBackendSubnet `
  -AddressPrefix 10.0.1.0/24
$agSubnetConfig = New-AzureRmVirtualNetworkSubnetConfig `
  -Name myAGSubnet `
  -AddressPrefix 10.0.2.0/24
$vnet = New-AzureRmVirtualNetwork `
  -ResourceGroupName myResourceGroupAG `
  -Location chinanorth `
  -Name myVNet `
  -AddressPrefix 10.0.0.0/16 `
  -Subnet $backendSubnetConfig, $agSubnetConfig
$pip = New-AzureRmPublicIpAddress `
  -ResourceGroupName myResourceGroupAG `
  -Location chinanorth `
  -Name myAGPublicIPAddress `
  -AllocationMethod Dynamic

创建应用程序网关

创建 IP 配置和前端端口

使用 New-AzureRmApplicationGatewayIPConfiguration 将前面创建的 myAGSubnet 关联到应用程序网关。 使用 New-AzureRmApplicationGatewayFrontendIPConfigmyAGPublicIPAddress 分配给应用程序网关。

$vnet = Get-AzureRmVirtualNetwork `
  -ResourceGroupName myResourceGroupAG `
  -Name myVNet
$subnet=$vnet.Subnets[0]
$gipconfig = New-AzureRmApplicationGatewayIPConfiguration `
  -Name myAGIPConfig `
  -Subnet $subnet
$fipconfig = New-AzureRmApplicationGatewayFrontendIPConfig `
  -Name myAGFrontendIPConfig `
  -PublicIPAddress $pip
$frontendport = New-AzureRmApplicationGatewayFrontendPort `
  -Name myFrontendPort `
  -Port 80

创建后端池和设置

使用 New-AzureRmApplicationGatewayBackendAddressPool 为应用程序网关创建名为 contosoPoolfabrikamPool 的后端池。 使用 New-AzureRmApplicationGatewayBackendHttpSettings 配置池的设置。

$contosoPool = New-AzureRmApplicationGatewayBackendAddressPool `
  -Name contosoPool 
$fabrikamPool = New-AzureRmApplicationGatewayBackendAddressPool `
  -Name fabrikamPool 
$poolSettings = New-AzureRmApplicationGatewayBackendHttpSettings `
  -Name myPoolSettings `
  -Port 80 `
  -Protocol Http `
  -CookieBasedAffinity Enabled `
  -RequestTimeout 120

创建侦听器和规则

应用程序网关需要侦听器才能适当地将流量路由到后端池。 在本教程中,将为两个域的每一个域创建侦听器。 在此示例中,将为域 www.contoso.comwww.fabrikam.com 创建侦听器。

使用 New-AzureRmApplicationGatewayHttpListener 以及前面创建的前端配置和前端端口创建名为 contosoListenerfabrikamListener 的侦听器。 侦听器需要使用规则来了解哪个后端池用于传入流量。 使用 New-AzureRmApplicationGatewayRequestRoutingRule 创建名为 contosoRulefabrikamRule 的基本规则。

$contosolistener = New-AzureRmApplicationGatewayHttpListener `
  -Name contosoListener `
  -Protocol Http `
  -FrontendIPConfiguration $fipconfig `
  -FrontendPort $frontendport `
  -HostName "www.contoso.com"
$fabrikamlistener = New-AzureRmApplicationGatewayHttpListener `
  -Name fabrikamListener `
  -Protocol Http `
  -FrontendIPConfiguration $fipconfig `
  -FrontendPort $frontendport `
  -HostName "www.fabrikam.com"
$contosoRule = New-AzureRmApplicationGatewayRequestRoutingRule `
  -Name contosoRule `
  -RuleType Basic `
  -HttpListener $contosoListener `
  -BackendAddressPool $contosoPool `
  -BackendHttpSettings $poolSettings
$fabrikamRule = New-AzureRmApplicationGatewayRequestRoutingRule `
  -Name fabrikamRule `
  -RuleType Basic `
  -HttpListener $fabrikamListener `
  -BackendAddressPool $fabrikamPool `
  -BackendHttpSettings $poolSettings

创建应用程序网关

现在已创建所需的支持资源,请使用 New-AzureRmApplicationGatewaySku 为名为 myAppGateway 的应用程序网关指定参数,然后再使用 New-AzureRmApplicationGateway 创建它。

$sku = New-AzureRmApplicationGatewaySku `
  -Name Standard_Medium `
  -Tier Standard `
  -Capacity 2
$appgw = New-AzureRmApplicationGateway `
  -Name myAppGateway `
  -ResourceGroupName myResourceGroupAG `
  -Location chinanorth `
  -BackendAddressPools $contosoPool, $fabrikamPool `
  -BackendHttpSettingsCollection $poolSettings `
  -FrontendIpConfigurations $fipconfig `
  -GatewayIpConfigurations $gipconfig `
  -FrontendPorts $frontendport `
  -HttpListeners $contosoListener, $fabrikamListener `
  -RequestRoutingRules $contosoRule, $fabrikamRule `
  -Sku $sku

创建虚拟机规模集

在此示例中,将创建两个虚拟机规模集以支持所创建的两个后端池。 创建的规模集分别名为 myvmss1myvmss2。 每个规模集包含两个在其上安装了 IIS 的虚拟机实例。 配置 IP 设置时将规模集分配给后端池。

$vnet = Get-AzureRmVirtualNetwork `
  -ResourceGroupName myResourceGroupAG `
  -Name myVNet
$appgw = Get-AzureRmApplicationGateway `
  -ResourceGroupName myResourceGroupAG `
  -Name myAppGateway
$contosoPool = Get-AzureRmApplicationGatewayBackendAddressPool `
  -Name contosoPool `
  -ApplicationGateway $appgw
$fabrikamPool = Get-AzureRmApplicationGatewayBackendAddressPool `
  -Name fabrikamPool `
  -ApplicationGateway $appgw
for ($i=1; $i -le 2; $i++)
{
  if ($i -eq 1) 
  {
    $poolId = $contosoPool.Id
  }
  if ($i -eq 2)
  {
    $poolId = $fabrikamPool.Id
  }
  $ipConfig = New-AzureRmVmssIpConfig `
    -Name myVmssIPConfig$i `
    -SubnetId $vnet.Subnets[1].Id `
    -ApplicationGatewayBackendAddressPoolsId $poolId
  $vmssConfig = New-AzureRmVmssConfig `
    -Location chinanorth `
    -SkuCapacity 2 `
    -SkuName Standard_DS2 `
    -UpgradePolicyMode Automatic
  Set-AzureRmVmssStorageProfile $vmssConfig `
    -ImageReferencePublisher MicrosoftWindowsServer `
    -ImageReferenceOffer WindowsServer `
    -ImageReferenceSku 2016-Datacenter `
    -ImageReferenceVersion latest
  Set-AzureRmVmssOsProfile $vmssConfig `
    -AdminUsername azureuser `
    -AdminPassword "Azure123456!" `
    -ComputerNamePrefix myvmss$i
  Add-AzureRmVmssNetworkInterfaceConfiguration `
    -VirtualMachineScaleSet $vmssConfig `
    -Name myVmssNetConfig$i `
    -Primary $true `
    -IPConfiguration $ipConfig
  New-AzureRmVmss `
    -ResourceGroupName myResourceGroupAG `
    -Name myvmss$i `
    -VirtualMachineScaleSet $vmssConfig
}

安装 IIS

$publicSettings = @{ "fileUris" = (,"https://raw.githubusercontent.com/davidmu1/samplescripts/master/appgatewayurl.ps1"); 
  "commandToExecute" = "powershell -ExecutionPolicy Unrestricted -File appgatewayurl.ps1" }

for ($i=1; $i -le 2; $i++)
{
  $vmss = Get-AzureRmVmss `
    -ResourceGroupName myResourceGroupAG `
    -VMScaleSetName myvmss$i
  Add-AzureRmVmssExtension -VirtualMachineScaleSet $vmss `
    -Name "customScript" `
    -Publisher "Microsoft.Compute" `
    -Type "CustomScriptExtension" `
    -TypeHandlerVersion 1.8 `
    -Setting $publicSettings
  Update-AzureRmVmss `
    -ResourceGroupName myResourceGroupAG `
    -Name myvmss$i `
    -VirtualMachineScaleSet $vmss
}

在域中创建 CNAME 记录

使用其公共 IP 地址创建应用程序网关后,可以获取 DNS 地址并使用它在域中创建 CNAME 记录。 可以使用 Get-AzureRmPublicIPAddress 获取应用程序网关的 DNS 地址。 复制 DNSSettings 的 fqdn 值并使用它作为所创建的 CNAME 记录的值。 不建议使用 A 记录,因为重新启动应用程序网关后 VIP 可能会变化。

Get-AzureRmPublicIPAddress -ResourceGroupName myResourceGroupAG -Name myAGPublicIPAddress

测试应用程序网关

在浏览器的地址栏中输入域名。 例如,http://www.contoso.com。

在应用程序网关中测试 contoso 站点

将地址更改为其他域,应看到类似下例所示的内容:

在应用程序网关中测试 fabrikam 站点

后续步骤

本文介绍了如何执行以下操作:

  • 设置网络
  • 创建应用程序网关
  • 创建侦听器和路由规则
  • 使用后端池创建虚拟机规模集
  • 在域中创建 CNAME 记录