转:Windows Azure Application Gateway 应用程序网关

原文:http://winhe.blog.51cto.com/7547741/1742487

 本文主要介绍Windows Azure 应用程序网关三种主要功能介绍:Http负载平衡基于cookie会话连接SSL卸载

技术分享
Azure应用程序网关(Azure Application Gateway
基础环境准备,在虚拟网络中为应用程序网关创建一个子网,在本文中使用AppGateway-1子网。
技术分享

New-AzureApplicationGateway -Name WinAppGW -VnetName AppGatewayVnet -Subnets AppGateway-1

#新建应用程序网关,命名为WinAppGW ,放置在虚拟网络AppGatewayVnet 子网AppGateway-1
#此时不会开始计收网关的费用。计费将在后面已成功启动网关时开始
技术分享

Get-AzureApplicationGateway

#获取网关的详细信息
技术分享

Start-AzureApplicationGateway -Name WinAppGW

#尝试启动网关,提示“由于没有进行任何配置,无法启动”
技术分享
既然这样,我们先配置“Http负载平衡”的功能。
Part.1HTTP load balancingHttp负载平衡)

1.  对比Azure负载平衡器 VS Azure应用程序网关
Azure Load Balancer,工作在传输层工作,TCP/UDP,提供4负载均衡
Azure Application Gateway 提供Http流量的路由规则,进一步对7http流量进行负载均衡
技术分享
2.Application Gateway 通过配置,可以将Http流量路由至虚拟机、云服务、web app外部IP
3.实验过程:
 
使用两台虚拟机作为后端web服务器集群:winappgatevm-1(10.0.0.4)winappgatevm-2(10.0.1.4)
 
技术分享
管理配置应用程序网关需要使用xml文件,使用如下xml文件,配置80端口的负载平衡:

<?xml version=”1.0″ encoding=”utf-8″?>

<ApplicationGatewayConfiguration xmlns:i=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/windowsazure”>

<!–FrontendPorts用来定义应用程序网关上的公网端口,我们要测试http负载均衡,所以定义FrontendPort180端口–>

<FrontendPorts>

        <FrontendPort>

            <Name>FrontendPort1</Name>

            <Port>80</Port>

        </FrontendPort>

    </FrontendPorts>

<!–BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.410.0.1.4两个AzureVM–>

    <BackendAddressPools>

        <BackendAddressPool>

            <Name>BackendPool1</Name>

            <IPAddresses>

                <IPAddress>10.0.0.4</IPAddress>

                <IPAddress>10.0.1.4</IPAddress>

            </IPAddresses>

        </BackendAddressPool>

    </BackendAddressPools>

<!–BackendHttpSettingsList用来定义端口、协议、cookie-based affinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-based affinity(如果启用Cookie Based Session Affinity,我的PC将会连续访问同一台后端的web服务器,将无法看出负载平衡的效果,所以暂时禁用)–>

    <BackendHttpSettingsList>

        <BackendHttpSettings>

            <Name>BackendSetting1</Name>

            <Port>80</Port>

            <Protocol>Http</Protocol>

            <CookieBasedAffinity>Disabled</CookieBasedAffinity>

        </BackendHttpSettings>

    </BackendHttpSettingsList>

    <!–HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort180),使用Http协议–>

    <HttpListeners>

        <HttpListener>

            <Name>HTTPListener1</Name>

            <FrontendPort>FrontendPort1</FrontendPort>

            <Protocol>Http</Protocol>

        </HttpListener>

    </HttpListeners>

        <!–HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener1(监听FrontendPort180),使用Http协议),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM),所以HttpLoadBalancingRules可以说是所有信息的汇总->

    <HttpLoadBalancingRules>

        <HttpLoadBalancingRule>

            <Name>HttpLBRule1</Name>

            <Type>basic</Type>

            <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

            <Listener>HTTPListener1</Listener>

            <BackendAddressPool>BackendPool1</BackendAddressPool>

        </HttpLoadBalancingRule>

    </HttpLoadBalancingRules>

</ApplicationGatewayConfiguration>

#通过Azure Powershell,使用如下命令上传xml文件到应用程序网关完成配置

Set-AzureApplicationGatewayConfig -Name WinAppGW -ConfigFile D:\web-80app.xml

#对应参数是应用程序网关的名字、xml文件的路径
技术分享
#网关设置好了之后,通过以下命令启动网关
Start-AzureApplicationGateway -Name WinAppGW
技术分享
 
#获取网关详细信息,网关的公网IP已经生成:139.217.27.22
Get-AzureApplicationGateway -Name WinAppGW
技术分享
 
我之前在winappgatevm-110.0.0.4)和winappgatevm-210.0.1.4)上分别配置了两个简单的网站,随着刷新页面,我们发现轮询的负载均衡已经生效。
 
技术分享
技术分享
Part.2Cookie Based Session Affinity 基于cookie会话连接
1.应用场景:某些应用需要相同用户需要连接到不变的后台虚拟机,例如购物车应用、网页邮件服务器,基于cookie会话连接功能,可以使同一个的客户端session请求route 到相同的后端服务器,实现此类需求。
2.实验过程:
为了测试基于cookie会话连接,我们使用如下xml文件:
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用来定义应用程序网关上的公网端口,我们要测试http负载均衡+Cookie Based Session Affinity ,所以定义FrontendPort180端口–>

<FrontendPorts>

        <FrontendPort>

            <Name>FrontendPort1</Name>

            <Port>80</Port>

        </FrontendPort>

    </FrontendPorts>

<!–BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.410.0.1.4两个AzureVM–>

    <BackendAddressPools>

        <BackendAddressPool>

            <Name>BackendPool1</Name>

            <IPAddresses>

                <IPAddress>10.0.0.4</IPAddress>

                <IPAddress>10.0.1.4</IPAddress>

            </IPAddresses>

        </BackendAddressPool>

    </BackendAddressPools>

<!–BackendHttpSettingsList用来定义端口、协议、cookie-based affinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-based affinity(如果启用Cookie Based Session Affinity,我的PC将会连续访问同一台后端的web服务器,将无法看出负载平衡的效果,所以暂时禁用)–>

    <BackendHttpSettingsList>

        <BackendHttpSettings>

            <Name>BackendSetting1</Name>

            <Port>80</Port>

            <Protocol>Http</Protocol>

            <CookieBasedAffinity>Enabled</CookieBasedAffinity>

        </BackendHttpSettings>

    </BackendHttpSettingsList>

    <!–HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort180),使用Http协议–>

    <HttpListeners>

        <HttpListener>

            <Name>HTTPListener1</Name>

            <FrontendPort>FrontendPort1</FrontendPort>

            <Protocol>Http</Protocol>

        </HttpListener>

    </HttpListeners>

        <!–HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener1(监听FrontendPort180),使用Http协议),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM),所以HttpLoadBalancingRules可以说是所有信息的汇总->

    <HttpLoadBalancingRules>

        <HttpLoadBalancingRule>

            <Name>HttpLBRule1</Name>

            <Type>basic</Type>

            <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

            <Listener>HTTPListener1</Listener>

            <BackendAddressPool>BackendPool1</BackendAddressPool>

        </HttpLoadBalancingRule>

    </HttpLoadBalancingRules>

</ApplicationGatewayConfiguration>

按照Part.1Azure Powershell命令上传配置,我们发现我的PC可以访问139.217.27.22
抓取访问139.217.27.22的数据包,返现服务器在三次握手后首次返回的http报文中带有Set-cookie的内容如下ARRAffinity=b2b030bd049b3ae07c0c65419246492734f60ad3ec994bb9cb6414062dc14199\r\n
技术分享
紧接着我再次访问139.217.27.22时,我的http请求中带着之前服务器给我返回的cookie,致使我不断的刷新也只会访问首次访问的服务器。Cookie依旧是 ARRAffinity=b2b030bd049b3ae07c0c65419246492734f60ad3ec994bb9cb6414062dc14199\r\n
技术分享
Part.3SSL OffloadSSL卸载)
Application Gateway起到了SSL加解密的作用,客户端跟App Gateway之间SSL Session 交互,不需要跟后台的所有的web 服务器分别建立SSL session,所有的SSL行为和SSL证书统一在App Gateway 设备上统一管理维护,相当于为后端VM卸载掉SSL加密的任务量,释放了后端VM的消耗在SSL加密上的资源。
首先你需要有一张CA颁发的服务器端的*.pfx证书,关于制作证书,不在此赘述。

#上传证书到应用程序网关

Add-AzureApplicationGatewaySslCertificate  -Name WinAppGW -CertificateName GWCert -Password qwer1234! -CertificateFile D:\httpscert.pfx

#需要分别指定网关名称、证书名称、密码、证书路径
技术分享
接下来我们需要配置xml文件,参考如下:

<?xml version=”1.0″ encoding=”utf-8″?>

<ApplicationGatewayConfiguration xmlns:i=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/windowsazure”>

   <FrontendIPConfigurations />

<!–FrontendPorts用来定义应用程序网关上的公网端口,我们要测试SSL Offload,所以定义FrontendPort1443端口–>

    <FrontendPorts>

        <FrontendPort>

            <Name>FrontendPort1</Name>

            <Port>443</Port>

        </FrontendPort>

    </FrontendPorts>

<!–BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.410.0.1.4两个AzureVM–>

    <BackendAddressPools>

        <BackendAddressPool>

            <Name>BackendPool1</Name>

            <IPAddresses>

                <IPAddress>10.0.0.4</IPAddress>

                <IPAddress>10.0.1.4</IPAddress>

            </IPAddresses>

        </BackendAddressPool>

    </BackendAddressPools>

<!–BackendHttpSettingsList用来定义端口、协议、cookie-based affinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-based affinity–>

    <BackendHttpSettingsList>

        <BackendHttpSettings>

            <Name>BackendSetting1</Name>

            <Port>80</Port>

            <Protocol>Http</Protocol>

            <CookieBasedAffinity>Disabled</CookieBasedAffinity>

        </BackendHttpSettings>

    </BackendHttpSettingsList>

<!–HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort1443),使用Https协议、证书名字是GWCert–>

    <HttpListeners>

        <HttpListener>

            <Name>HTTPListener1</Name>

            <FrontendPort>FrontendPort1</FrontendPort>

            <Protocol>Https</Protocol>

            <SslCert>GWCert</SslCert>

        </HttpListener>

    </HttpListeners>

<!–HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener1(监听FrontendPort1443),使用Https协议、证书名字是GWCert),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM),所以HttpLoadBalancingRules可以说是所有信息的汇总,让我们完成SSL Offload+负载均衡–>

    <HttpLoadBalancingRules>

        <HttpLoadBalancingRule>

            <Name>HttpLBRule1</Name>

            <Type>basic</Type>

            <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

            <Listener>HTTPListener1</Listener>

            <BackendAddressPool>BackendPool1</BackendAddressPool>

        </HttpLoadBalancingRule>

    </HttpLoadBalancingRules>

</ApplicationGatewayConfiguration>

#通过修改好的xml配置应用程序网关,使我们的证书生效

Set-AzureApplicationGatewayConfig -Name WinAppGW -ConfigFile D:\ssloffloadhttplb.xml

技术分享
访问 https://139.217.27.22/ ,已经可以访问,并且可以负载均衡。证书为自己手工制作的自签名证书,此处不受信可以也不影响https的测试访问。
技术分享
技术分享
Part.4】细节强化
1. 网关大小:Small, Medium and Large
其中Small仅仅用于测试。
2.限制
Global:一个订阅50个应用程序网关,每个应用程序网关最多10个实例(此处实例是指后端的虚拟机个数)。
China:一个订阅10个应用程序网关

修改网关大小和后端实例实数参考:

Update-AzureApplicationGateway -Name “WinAppGW” -InstanceCount 5 -GatewaySize “Large” -Description “Updated application gateway”

技术分享
3.监测
应用程序网关每隔30秒发出probe报文来监视监控后端服务器的健康情况,返回code200-399确认http服务正常。如果发现某个后台服务器不能及时响应导致probe失败之后,此台后台的VM会从健康实例池中移除,直到其能及时响应probe探测为止。
4.同时使 http 80负载平衡、https 443负载平衡生效的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用来定义应用程序网关上的公网端口,我们定义了http80端口、https443端口–>

    <FrontendPorts>

        <FrontendPort>

            <Name>FrontendPort1</Name>

            <Port>80</Port>

        </FrontendPort>

        <FrontendPort>

            <Name>FrontendPort2</Name>

            <Port>443</Port>

        </FrontendPort>

    </FrontendPorts>

<!–BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.410.0.1.4两个AzureVM–>

    <BackendAddressPools>

        <BackendAddressPool>

            <Name>BackendPool1</Name>

            <IPAddresses>

                <IPAddress>10.0.0.4</IPAddress>

                <IPAddress>10.0.1.4</IPAddress>

            </IPAddresses>

        </BackendAddressPool>

    </BackendAddressPools>

<!–BackendHttpSettingsList用来定义端口、协议、cookie-based affinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-based affinity–>

    <BackendHttpSettingsList>

        <BackendHttpSettings>

            <Name>BackendSetting1</Name>

            <Port>80</Port>

            <Protocol>Http</Protocol>

            <CookieBasedAffinity>Disabled</CookieBasedAffinity>

        </BackendHttpSettings>

    </BackendHttpSettingsList>

<!–HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort180),使用Http协议;HTTPListener1、监听FrontendPort2443),使用Https协议,证书名字是GWCert–>

    <HttpListeners>

        <HttpListener>

            <Name>HTTPListener1</Name>

            <FrontendPort>FrontendPort1</FrontendPort>

            <Protocol>Http</Protocol>

        </HttpListener>

        <HttpListener>

            <Name>HTTPListener2</Name>

            <FrontendPort>FrontendPort2</FrontendPort>

            <Protocol>Https</Protocol>

            <SslCert>GWCert</SslCert>

        </HttpListener>

    </HttpListeners>

<!–HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener1(监听FrontendPort180),使用Http协议),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM;定义一个规则名为HttpLBRule2,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener2(监听FrontendPort1443),使用Https协议、证书名字是GWCert),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM. 所以HttpLoadBalancingRules可以说是所有信息的汇总,这两个规则可以完成 http 80网站负载均衡+SSL Offload负载均衡–>

    <HttpLoadBalancingRules>

       <HttpLoadBalancingRule>

            <Name>HttpLBRule1</Name>

            <Type>basic</Type>

            <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

            <Listener>HTTPListener1</Listener>

            <BackendAddressPool>BackendPool1</BackendAddressPool>

        </HttpLoadBalancingRule>

        <HttpLoadBalancingRule>

            <Name>HttpLBRule2</Name>

            <Type>basic</Type>

            <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

            <Listener>HTTPListener2</Listener>

            <BackendAddressPool>BackendPool1</BackendAddressPool>

        </HttpLoadBalancingRule>

    </HttpLoadBalancingRules>

</ApplicationGatewayConfiguration>

发表评论