使用 Azure PowerShell 创建托管多个网站的应用程序网关
创建应用程序网关时,可以使用 Azure Powershell 配置多个网站的托管。 本文使用虚拟机规模集定义后端地址池。 然后,基于所拥有的域配置侦听器和规则,以确保 Web 流量可到达池中的相应服务器。 本文假定你拥有多个域,并使用示例 www.contoso.com
和 www.fabrikam.com
。
在本文中,学习如何:
- 设置网络
- 创建应用程序网关
- 创建后端侦听器
- 创建路由规则
- 使用后端池创建虚拟机规模集
- 在域中创建 CNAME 记录
如果没有 Azure 订阅,可在开始前创建一个试用帐户。
注意
建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az。
如果选择在本地安装并使用 PowerShell,则本文需要 Azure PowerShell 模块 1.0.0 或更高版本。 若要查找版本,请运行 Get-Module -ListAvailable Az
。 如果需要进行升级,请参阅 Install Azure PowerShell module(安装 Azure PowerShell 模块)。 如果在本地运行 PowerShell,则还需运行 Connect-AzAccount -Environment AzureChinaCloud
以创建与 Azure 的连接。
创建资源组
资源组是在其中部署和管理 Azure 资源的逻辑容器。 使用 New-AzResourceGroup 创建 Azure 资源组。
New-AzResourceGroup -Name myResourceGroupAG -Location chinanorth2
创建网络资源
使用 New-AzVirtualNetworkSubnetConfig 创建子网配置。 使用 New-AzVirtualNetwork 和子网配置创建虚拟网络。 最后使用 New-AzPublicIpAddress 创建公共 IP 地址。 这些资源用于提供与应用程序网关及其关联资源的网络连接。
$backendSubnetConfig = New-AzVirtualNetworkSubnetConfig `
-Name myBackendSubnet `
-AddressPrefix 10.0.1.0/24
$agSubnetConfig = New-AzVirtualNetworkSubnetConfig `
-Name myAGSubnet `
-AddressPrefix 10.0.2.0/24
$vnet = New-AzVirtualNetwork `
-ResourceGroupName myResourceGroupAG `
-Location chinanorth2 `
-Name myVNet `
-AddressPrefix 10.0.0.0/16 `
-Subnet $backendSubnetConfig, $agSubnetConfig
$pip = New-AzPublicIpAddress `
-ResourceGroupName myResourceGroupAG `
-Location chinanorth2 `
-Name myAGPublicIPAddress `
-AllocationMethod Dynamic
创建应用程序网关
创建 IP 配置和前端端口
使用 New-AzApplicationGatewayIPConfiguration 将前面创建的子网关联到应用程序网关。 使用 New-AzApplicationGatewayFrontendIPConfig 将公共 IP 地址分配给应用程序网关。
$vnet = Get-AzVirtualNetwork `
-ResourceGroupName myResourceGroupAG `
-Name myVNet
$subnet=$vnet.Subnets[0]
$gipconfig = New-AzApplicationGatewayIPConfiguration `
-Name myAGIPConfig `
-Subnet $subnet
$fipconfig = New-AzApplicationGatewayFrontendIPConfig `
-Name myAGFrontendIPConfig `
-PublicIPAddress $pip
$frontendport = New-AzApplicationGatewayFrontendPort `
-Name myFrontendPort `
-Port 80
创建后端池和设置
使用 New-AzApplicationGatewayBackendAddressPool 为应用程序网关创建第一个后端地址池。 使用 New-AzApplicationGatewayBackendHttpSettings 配置池的设置。
$contosoPool = New-AzApplicationGatewayBackendAddressPool `
-Name contosoPool
$fabrikamPool = New-AzApplicationGatewayBackendAddressPool `
-Name fabrikamPool
$poolSettings = New-AzApplicationGatewayBackendHttpSettings `
-Name myPoolSettings `
-Port 80 `
-Protocol Http `
-CookieBasedAffinity Enabled `
-RequestTimeout 120
创建侦听器和规则
应用程序网关需要侦听器才能适当地将流量路由到后端地址池。 在本文中,将为两个域创建两个侦听器。 侦听器是为 contoso.com 和 fabrikam.com 域创建的。
使用 New-AzApplicationGatewayHttpListener 以及前面创建的前端配置和前端端口创建第一个侦听器。 侦听器需要使用规则来了解哪个后端池使用传入流量。 使用 New-AzApplicationGatewayRequestRoutingRule 创建一个名为 contosoRule 的基本规则。
注意
通过应用程序网关或 WAF v2 SKU,你还可为每个侦听器配置最多 5 个主机名,并且可在主机名中使用通配符。 要了解详细信息,请参阅侦听器中的通配符主机名。
若要通过 Azure PowerShell 在侦听器中使用多个主机名和通配符,则必须使用 -HostNames
而不是 -HostName
。 使用 HostNames 时,可通过逗号分隔值的形式提及最多 5 个主机名。 例如: -HostNames "*.contoso.com","*.fabrikam.com"
$contosolistener = New-AzApplicationGatewayHttpListener `
-Name contosoListener `
-Protocol Http `
-FrontendIPConfiguration $fipconfig `
-FrontendPort $frontendport `
-HostName "www.contoso.com"
$fabrikamlistener = New-AzApplicationGatewayHttpListener `
-Name fabrikamListener `
-Protocol Http `
-FrontendIPConfiguration $fipconfig `
-FrontendPort $frontendport `
-HostName "www.fabrikam.com"
$contosoRule = New-AzApplicationGatewayRequestRoutingRule `
-Name contosoRule `
-RuleType Basic `
-HttpListener $contosoListener `
-BackendAddressPool $contosoPool `
-BackendHttpSettings $poolSettings
$fabrikamRule = New-AzApplicationGatewayRequestRoutingRule `
-Name fabrikamRule `
-RuleType Basic `
-HttpListener $fabrikamListener `
-BackendAddressPool $fabrikamPool `
-BackendHttpSettings $poolSettings
向路由规则添加优先级
$contosoRule = New-AzApplicationGatewayRequestRoutingRule `
-Name wccontosoRule `
-RuleType Basic `
-Priority 200 `
-HttpListener $wccontosoListener `
-BackendAddressPool $wccontosoPool `
-BackendHttpSettings $poolSettings
$fabrikamRule = New-AzApplicationGatewayRequestRoutingRule `
-Name shopcontosoRule `
-RuleType Basic `
-Priority 100 `
-HttpListener $shopcontosoListener `
-BackendAddressPool $shopcontosoPool `
-BackendHttpSettings $poolSettings
创建应用程序网关
现在已创建所需的支持资源,请使用 New-AzApplicationGatewaySku 为应用程序网关指定参数,然后再使用 New-AzApplicationGateway 创建它。
$sku = New-AzApplicationGatewaySku `
-Name Standard_Medium `
-Tier Standard `
-Capacity 2
$appgw = New-AzApplicationGateway `
-Name myAppGateway `
-ResourceGroupName myResourceGroupAG `
-Location chinanorth2 `
-BackendAddressPools $contosoPool, $fabrikamPool `
-BackendHttpSettingsCollection $poolSettings `
-FrontendIpConfigurations $fipconfig `
-GatewayIpConfigurations $gipconfig `
-FrontendPorts $frontendport `
-HttpListeners $contosoListener, $fabrikamListener `
-RequestRoutingRules $contosoRule, $fabrikamRule `
-Sku $sku
创建虚拟机规模集
在此示例中,将创建两个虚拟机规模集以支持所创建的两个后端池。 创建的规模集分别名为 myvmss1 和 myvmss2。 每个规模集包含两个在其上安装了 IIS 的虚拟机实例。 配置 IP 设置时将规模集分配给后端池。
$vnet = Get-AzVirtualNetwork `
-ResourceGroupName myResourceGroupAG `
-Name myVNet
$appgw = Get-AzApplicationGateway `
-ResourceGroupName myResourceGroupAG `
-Name myAppGateway
$contosoPool = Get-AzApplicationGatewayBackendAddressPool `
-Name contosoPool `
-ApplicationGateway $appgw
$fabrikamPool = Get-AzApplicationGatewayBackendAddressPool `
-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-AzVmssIpConfig `
-Name myVmssIPConfig$i `
-SubnetId $vnet.Subnets[1].Id `
-ApplicationGatewayBackendAddressPoolsId $poolId
$vmssConfig = New-AzVmssConfig `
-Location chinanorth2 `
-SkuCapacity 2 `
-SkuName Standard_DS2 `
-UpgradePolicyMode Automatic
Set-AzVmssStorageProfile $vmssConfig `
-ImageReferencePublisher MicrosoftWindowsServer `
-ImageReferenceOffer WindowsServer `
-ImageReferenceSku 2016-Datacenter `
-ImageReferenceVersion latest `
-OsDiskCreateOption FromImage
Set-AzVmssOsProfile $vmssConfig `
-AdminUsername azureuser `
-AdminPassword "Azure123456!" `
-ComputerNamePrefix myvmss$i
Add-AzVmssNetworkInterfaceConfiguration `
-VirtualMachineScaleSet $vmssConfig `
-Name myVmssNetConfig$i `
-Primary $true `
-IPConfiguration $ipConfig
New-AzVmss `
-ResourceGroupName myResourceGroupAG `
-Name myvmss$i `
-VirtualMachineScaleSet $vmssConfig
}
安装 IIS
$publicSettings = @{ "fileUris" = (,"https://raw.githubusercontent.com/Azure/azure-docs-powershell-samples/master/application-gateway/iis/appgatewayurl.ps1");
"commandToExecute" = "powershell -ExecutionPolicy Unrestricted -File appgatewayurl.ps1" }
for ($i=1; $i -le 2; $i++)
{
$vmss = Get-AzVmss `
-ResourceGroupName myResourceGroupAG `
-VMScaleSetName myvmss$i
Add-AzVmssExtension -VirtualMachineScaleSet $vmss `
-Name "customScript" `
-Publisher "Microsoft.Compute" `
-Type "CustomScriptExtension" `
-TypeHandlerVersion 1.8 `
-Setting $publicSettings
Update-AzVmss `
-ResourceGroupName myResourceGroupAG `
-Name myvmss$i `
-VirtualMachineScaleSet $vmss
}
在域中创建 CNAME 记录
使用其公共 IP 地址创建应用程序网关后,可以获取 DNS 地址并使用它在域中创建 CNAME 记录。 可以使用 Get-AzPublicIPAddress 获取应用程序网关的 DNS 地址。 复制 DNSSettings 的 fqdn 值并使用它作为所创建的 CNAME 记录的值。 建议不要使用 A 记录,因为在 V1 SKU 中重启应用程序网关后 VIP 可能会变化。
Get-AzPublicIPAddress -ResourceGroupName myResourceGroupAG -Name myAGPublicIPAddress
测试应用程序网关
在浏览器的地址栏中输入域名。 例如 http://www.contoso.com.
将地址更改为其他域,应看到类似下例所示的内容:
清理资源
如果不再需要资源组、应用程序网关和所有相关资源,可以使用 Remove-AzResourceGroup 将其删除。
Remove-AzResourceGroup -Name myResourceGroupAG