关于Azure Application Gateway的使用方法,请参考下面的几个链接:
中文链接:
Introduction: http://www.windowsazure.cn/home/features/application-gateway
Configuration: http://www.windowsazure.cn/documentation/articles/application-gateway-create-gateway
英文链接:
Introduction: https://azure.microsoft.com/en-us/documentation/articles/application-gateway-introduction/
Http LB: https://azure.microsoft.com/en-us/documentation/articles/application-gateway-create-gateway/?cdn=disable
SSL Offload: https://azure.microsoft.com/en-us/documentation/articles/application-gateway-ssl/?cdn=disable
ILB: https://azure.microsoft.com/en-us/documentation/articles/application-gateway-ilb/
一篇比较好的Blog:
http://www.redbaronofazure.com/?p=4281
从官方的介绍里面,我们看到Application Gateway主要有三个应用场景或者说特点:
HTTP load balancing(在应用层的负载均衡)
Cookie based session affinity(基于Cookie的会话保持功能)
SSL offload(SSL卸载,即通过applicationgateway实现ssl配置以减轻服务器压力)
另外除了配置SLB外,也可以使用Application Gateway实现ILB,即Application Gateway作为ILB中的Loadbalancer。(这个作为第四点实验)
针对上面的四种情况,我们后面会分别进行实验。
准备工作:
我们首先需要一个虚拟网络,创建拓扑大致如下(子网数量无要求):
AppSubnet用于放置ApplicationGateway,这个是根据官网上面的要求,Application Gateway需要放在独立的子网中。
Subnet-1/2/3用来部署虚拟机。(Gateway子网为VPN所使用,这里请忽略)
子网中虚拟机的分布情况:
HTTP load balancing和Cookie based session affinity:
首先针对负载均衡进行最基本的配置,即实现HTTP负载均衡:
我们先在两台虚拟机中搭建两个HTTP站点。
然后我们使用下面的命令创建一个Application Gateway(高亮的为参数需要修改):
New-AzureApplicationGateway –Name DanAppGwTest –VnetName DanEastVNET -Subnets AppSubnet
创建过程可能需要一段时间。
创建完成后使用下面的命令可以查看到Application Gateway的信息,包括其公网IP,DNS名称,所属的虚拟网络名称和子网名称,Size等等:
Get-AzureApplicationGateway -Name DanAppGwTest
创建完成Application Gateway后,我们需要使用XML文件进行配置(推荐),或者使用Powershell Object进行配置(步骤较多,比较繁琐,不推荐)。
XML配置文件基本内容如下:
xml version="1.0" encoding="utf-8"?>
<ApplicationGatewayConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/windowsazure">
<FrontendPorts>
<FrontendPort>
<Name>FrontendPort1Name>
<Port>80Port>
FrontendPort>
FrontendPorts>
<BackendAddressPools>
<BackendAddressPool>
<Name>BackendPool1Name>
<IPAddresses>
<IPAddress>10.0.0.8IPAddress>
<IPAddress>10.0.0.36IPAddress>
IPAddresses>
BackendAddressPool>
BackendAddressPools>
<BackendHttpSettingsList>
<BackendHttpSettings>
<Name>BackendSetting1Name>
<Port>80Port>
<Protocol>HttpProtocol>
<CookieBasedAffinity>EnabledCookieBasedAffinity>
BackendHttpSettings>
BackendHttpSettingsList>
<HttpListeners>
<HttpListener>
<Name>HTTPListener1Name>
<FrontendPort>FrontendPort1FrontendPort>
<Protocol>HttpProtocol>
HttpListener>
HttpListeners>
<HttpLoadBalancingRules>
<HttpLoadBalancingRule>
<Name>HttpLBRule1Name>
<Type>basicType>
<BackendHttpSettings>BackendSetting1BackendHttpSettings>
<Listener>HTTPListener1Listener>
<BackendAddressPool>BackendPool1BackendAddressPool>
HttpLoadBalancingRule>
HttpLoadBalancingRules>
ApplicationGatewayConfiguration>
关于FrontendPort,BackendAddressPool,BackendHttpSettings,HttpListener,HttpLoadBalancingRule的对应关系,可以参考下面这个对应关系图:
按照上面的编辑完成后,我们实现了下面的一些功能:
10.0.0.8和10.0.0.36两台虚拟机80端口的http负载均衡(基于轮询)
启用了基于Cookie的保持会话功能(Enable了CookieBasedAffinity这个选项)
然后我们将上面的xml文件保存,在Azure Powershell中通过如下命令将xml文件的配置上传到Application Gateway中(C:\Users\han.xu3\Desktop\AppGWCfg.xml为xml文件路径,DanAppGwTest为ApplicationGateway的名称):
Set-AzureApplicationGatewayConfig -Name DanAppGwTest -ConfigFile C:\Users\han.xu3\Desktop\AppGWCfg.xml
配置完成后,我们就可以在浏览器里使用Application Gateway的DNS名称来访问其80端口的服务了:
通过抓取http报文,可以看到在第一次访问的时候,服务器返回的报文中会有一个SetCookie字段,告诉客户端保存ARRAffinity的Cookie并在下次请求时携带次Cookie:
然后客户端再次请求页面的时候就会带上该Cookie:
这个Cookie就是用来保持会话的Cookie,通过这个Cookie,Application Gateway可以保证在Cookie过期前始终将来自同一个客户端的请求始终转发到同一台后端的server上。
关于ARRAffinity的相关说明请参考下面的链接:
http://blogs.msdn.com/b/azchina/archive/2013/11/21/disabling-arr-s-instance-affinity-in-windows-azure-web-sites.aspx
要禁用回话保持功能,有两种不同的方法可以实现:
可以在虚拟机Web站点的WebConfig.xml文件中添加下面的配置项(修改完要restart iis中的website):
或者可以将我们前面对Application Gateway配置的xml文件中的CookieBasedAffinity的值修改为Disabled:
<CookieBasedAffinity>DisabledCookieBasedAffinity>
然后再重新对Application Gateway应用配置:
Set-AzureApplicationGatewayConfig -NameDanAppGwTest -ConfigFile C:\Users\han.xu3\Desktop\AppGWCfg.xml
上面两种方法的任意一种配置完成后,清空本地的Cache或者换一台机器再次访问,抓包可以看到,已经没有ARRAffinity的Cookie了:
SSL offload配置实验:
完成实验前,我们需要一个pfx证书,如果没有公共CA颁发的证书,可以通过makecert工具自己创建一个用于实验,需要用到makecert和pvk2pfx工具。
创建脚本如下:
makecert -r -pe -n "CN=64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn"-sky exchange ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.cer"-sv ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.pvk"
pvk2pfx -pvk ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.pvk"-spc ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.cer"-pfx ".\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.pfx"-pi 1qaz2wsxE
其中64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn是我们ApplicationGateway的DNS名称,1qaz2wsxE是我们为这个证书设置的密码。
设置完成后,我们通过Azure Powershell将生成的pfx证书上传到Application Gateway中:
Add-AzureApplicationGatewaySslCertificate-Name DanAppGwTest-CertificateName GWCert-Password 1qaz2wsxE-CertificateFile C:\Users\han.xu3\Desktop\64dc1ad1-29ad-4bca-bed6-5fc25efaede4.chinacloudapp.cn.pfx
(其中GWCert是证书名称)
上传完成后,使用下面的命令可以查看上传的pfx证书信息:
Get-AzureApplicationGatewaySslCertificate-Name DanAppGwTest
上传完成后我们需要进一步修改前面配置Application Gateway的xml文件:
xml version="1.0" encoding="utf-8"?>
<ApplicationGatewayConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/windowsazure">
<FrontendPorts>
<FrontendPort>
<Name>FrontendPort1Name>
<Port>80Port>
FrontendPort>
<FrontendPort>
<Name>FrontendPort2Name>
<Port>443Port>
FrontendPort>
FrontendPorts>
<BackendAddressPools>
<BackendAddressPool>
<Name>BackendPool1Name>
<IPAddresses>
<IPAddress>10.0.0.8IPAddress>
<IPAddress>10.0.0.36IPAddress>
IPAddresses>
BackendAddressPool>
BackendAddressPools>
<BackendHttpSettingsList>
<BackendHttpSettings>
<Name>BackendSetting1Name>
<Port>80Port>
<Protocol>HttpProtocol>
<CookieBasedAffinity>EnabledCookieBasedAffinity>
BackendHttpSettings>
BackendHttpSettingsList>
<HttpListeners>
<HttpListener>
<Name>HTTPListener1Name>
<FrontendPort>FrontendPort1FrontendPort>
<Protocol>HttpProtocol>
HttpListener>
<HttpListener>
<Name>HTTPListener2Name>
<FrontendPort>FrontendPort2FrontendPort>
<Protocol>HttpsProtocol>
<SslCert>GWCertSslCert>
HttpListener>
HttpListeners>
<HttpLoadBalancingRules>
<HttpLoadBalancingRule>
<Name>HttpLBRule1Name>
<Type>basicType>
<BackendHttpSettings>BackendSetting1BackendHttpSettings>
<Listener>HTTPListener1Listener>
<BackendAddressPool>BackendPool1BackendAddressPool>
HttpLoadBalancingRule>
<HttpLoadBalancingRule>
<Name>HttpLBRule2Name>
<Type>basicType>
<BackendHttpSettings>BackendSetting1BackendHttpSettings>
<Listener>HTTPListener2Listener>
<BackendAddressPool>BackendPool1BackendAddressPool>
HttpLoadBalancingRule>
HttpLoadBalancingRules>
ApplicationGatewayConfiguration>
上面高亮的部分是我们修改的部分,其中添加了443作为HTTPS的前端端口,HTTPListener2与该端口进行绑定,并绑定了我们上传的证书,HttpLBRule2将server及服务端口,Listener进行了绑定。由于是测试,所以我们没有移除HTTP的配置,所以此时使用HTTP和HTTPS都可以正常访问,并且server端都是使用80端口响应。
然后通过Azure Powershell将配置文件更新:
Set-AzureApplicationGatewayConfig -Name DanAppGwTest -ConfigFile C:\Users\han.xu3\Desktop\AppGWCfg.xml
更新完成后,可以通过https来访问了(由于是我们自签名的证书,所以不受信任会显示Certificate Error):
可以查看网页的证书看到正是我们上传的pfx证书:
ILB配置实验:
这里我们继续在前面的基础上修改xml文件来实现ILB。配置文件修改如下:
xml version="1.0" encoding="utf-8"?>
<ApplicationGatewayConfiguration xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/windowsazure">
<FrontendIPConfigurations>
<FrontendIPConfiguration>
<Name>fip1Name>
<Type>PrivateType>
<StaticIPAddress>10.0.0.109StaticIPAddress>
FrontendIPConfiguration>
FrontendIPConfigurations>
<FrontendPorts>
<FrontendPort>
<Name>FrontendPort1Name>
<Port>80Port>
FrontendPort>
<FrontendPort>
<Name>FrontendPort2Name>
<Port>443Port>
FrontendPort>
FrontendPorts>
<BackendAddressPools>
<BackendAddressPool>
<Name>BackendPool1Name>
<IPAddresses>
<IPAddress>10.0.0.8IPAddress>
<IPAddress>10.0.0.36IPAddress>
IPAddresses>
BackendAddressPool>
BackendAddressPools>
<BackendHttpSettingsList>
<BackendHttpSettings>
<Name>BackendSetting1Name>
<Port>80Port>
<Protocol>HttpProtocol>
<CookieBasedAffinity>EnabledCookieBasedAffinity>
BackendHttpSettings>
BackendHttpSettingsList>
<HttpListeners>
<HttpListener>
<Name>HTTPListener1Name>
<FrontendIP>fip1FrontendIP>
<FrontendPort>FrontendPort1FrontendPort>
<Protocol>HttpProtocol>
HttpListener>
<HttpListener>
<Name>HTTPListener2Name>
<FrontendIP>fip1FrontendIP>
<FrontendPort>FrontendPort2FrontendPort>
<Protocol>HttpsProtocol>
<SslCert>GWCertSslCert>
HttpListener>
HttpListeners>
<HttpLoadBalancingRules>
<HttpLoadBalancingRule>
<Name>HttpLBRule1Name>
<Type>basicType>
<BackendHttpSettings>BackendSetting1BackendHttpSettings>
<Listener>HTTPListener1Listener>
<BackendAddressPool>BackendPool1BackendAddressPool>
HttpLoadBalancingRule>
<HttpLoadBalancingRule>
<Name>HttpLBRule2Name>
<Type>basicType>
<BackendHttpSettings>BackendSetting1BackendHttpSettings>
<Listener>HTTPListener2Listener>
<BackendAddressPool>BackendPool1BackendAddressPool>
HttpLoadBalancingRule>
HttpLoadBalancingRules>
ApplicationGatewayConfiguration>
这里在重新配置Application Gateway之前,先做一个实验,我们从网络划分中看到Application Gateway的DIP范围是在10.0.0.108-10.0.0.110之间的,所以我们找一台虚拟网络内的虚拟机测试一下,发现Application Gateway的DIP是该子网内的第一个IP:
同时也可以访问80和443的服务:
我们将xml配置文件更新到Application Gateway中(使用Azure Powershell)之后,就可以使用10.0.0.109来访问80和443的服务了,此时10.0.0.108仍然可以访问,并且我们ping一下10.0.0.109发现无法连通:
这说明我们修改配置文件并不是重置Application Gateway的DIP,只是实现了转发功能而已。
以上为关于Application Gateway的全部实验内容,基本覆盖了所有的功能特性,具体的使用案例可以在具体遇到问题时进行解决。
如果有什么不清楚的地方,欢迎随时讨论。