kernelsky 发表于 2018-6-15 13:59:09

Windows Azure Application Gateway 应用程序网关

本文主要介绍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.1】HTTP load balancing(Http负载平衡)
  1.对比Azure负载平衡器 VS Azure应用程序网关
  Azure Load Balancer,工作在传输层工作,TCP/UDP,提供4层负载均衡
  Azure Application Gateway 提供Http流量的路由规则,进一步对7层的http流量进行负载均衡


  2.Application Gateway 通过配置,可以将Http流量路由至虚拟机、云服务、web app、外部IP。

  3.实验过程:
  使用两台虚拟机作为后端web服务器集群:winappgatevm-1(10.0.0.4)和winappgatevm-2(10.0.1.4)



拓扑:

  管理配置应用程序网关需要使用xml文件,使用如下xml文件,配置80端口的负载平衡:

<?xmlversion="1.0" encoding="utf-8"?>
<ApplicationGatewayConfigurationxmlns:i="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://schemas.microsoft.com/windowsazure">

  <!--FrontendPorts用来定义应用程序网关上的公网端口,我们要测试http负载均衡,所以定义FrontendPort1为80端口-->
<FrontendPorts>
      <FrontendPort>
         <Name>FrontendPort1</Name>
            <Port>80</Port>
      </FrontendPort>
    </FrontendPorts>

  <!--BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.4和10.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-basedaffinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-basedaffinity(如果启用Cookie Based Session Affinity,我的PC将会连续访问同一台后端的web服务器,将无法看出负载平衡的效果,所以暂时禁用)-->
    <BackendHttpSettingsList>
      <BackendHttpSettings>
         <Name>BackendSetting1</Name>
            <Port>80</Port>
         <Protocol>Http</Protocol>
         <CookieBasedAffinity>Disabled</CookieBasedAffinity>
      </BackendHttpSettings>
    </BackendHttpSettingsList>

  <!--HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort1(80),使用Http协议-->
    <HttpListeners>
      <HttpListener>
         <Name>HTTPListener1</Name>
         <FrontendPort>FrontendPort1</FrontendPort>
         <Protocol>Http</Protocol>
      </HttpListener>
    </HttpListeners>

  <!--HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1(web服务器80端口、使用http协议、禁用cookie-basedaffinity),绑定HTTPListener1(监听FrontendPort1(80),使用Http协议),绑定BackendPool1(包含10.0.0.4和10.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-1(10.0.0.4)和winappgatevm-2(10.0.1.4)上分别配置了两个简单的网站,随着刷新页面,我们发现轮询的负载均衡已经生效。




  【Part.2】Cookie Based Session Affinity (基于cookie会话连接)
  1.应用场景:某些应用需要相同用户需要连接到不变的后台虚拟机,例如购物车应用、网页邮件服务器,基于cookie会话连接功能,可以使同一个的客户端session请求route 到相同的后端服务器,实现此类需求。

  2.实验过程:
拓扑:

  为了测试基于cookie会话连接,我们使用如下xml文件:

  xml文件参考如下
<?xmlversion="1.0" encoding="utf-8"?>
<ApplicationGatewayConfigurationxmlns:i="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://schemas.microsoft.com/windowsazure">

  <!--FrontendPorts用来定义应用程序网关上的公网端口,我们要测试http负载均衡+CookieBased Session Affinity ,所以定义FrontendPort1为80端口-->
<FrontendPorts>
      <FrontendPort>
         <Name>FrontendPort1</Name>
            <Port>80</Port>
      </FrontendPort>
    </FrontendPorts>

  <!--BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.4和10.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-basedaffinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-basedaffinity(如果启用Cookie Based Session Affinity,我的PC将会连续访问同一台后端的web服务器,将无法看出负载平衡的效果,所以暂时禁用)-->
    <BackendHttpSettingsList>
      <BackendHttpSettings>
         <Name>BackendSetting1</Name>
            <Port>80</Port>
         <Protocol>Http</Protocol>
         <CookieBasedAffinity>Enabled</CookieBasedAffinity>
      </BackendHttpSettings>
    </BackendHttpSettingsList>

  <!--HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort1(80),使用Http协议-->
    <HttpListeners>
      <HttpListener>
         <Name>HTTPListener1</Name>
         <FrontendPort>FrontendPort1</FrontendPort>
         <Protocol>Http</Protocol>
      </HttpListener>
    </HttpListeners>

  <!--HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1(web服务器80端口、使用http协议、禁用cookie-basedaffinity),绑定HTTPListener1(监听FrontendPort1(80),使用Http协议),绑定BackendPool1(包含10.0.0.4和10.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.1中Azure 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.3】SSL Offload(SSL卸载)
  Application Gateway起到了SSL加解密的作用,客户端跟App Gateway之间SSL Session 交互,不需要跟后台的所有的web 服务器分别建立SSLsession,所有的SSL行为和SSL证书统一在App Gateway 设备上统一管理维护,相当于为后端VM卸载掉SSL加密的任务量,释放了后端VM的消耗在SSL加密上的资源。
  首先你需要有一张CA颁发的服务器端的*.pfx证书,关于制作证书,不在此赘述。
  拓扑:

#上传证书到应用程序网关
Add-AzureApplicationGatewaySslCertificate-Name WinAppGW -CertificateName GWCert-Password qwer1234! -CertificateFile D:\httpscert.pfx
  #需要分别指定网关名称、证书名称、密码、证书路径


  接下来我们需要配置xml文件,参考如下:

<?xmlversion="1.0" encoding="utf-8"?>
<ApplicationGatewayConfigurationxmlns:i="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://schemas.microsoft.com/windowsazure">
   <FrontendIPConfigurations />

  <!--FrontendPorts用来定义应用程序网关上的公网端口,我们要测试SSLOffload,所以定义FrontendPort1为443端口-->
    <FrontendPorts>
      <FrontendPort>
         <Name>FrontendPort1</Name>
            <Port>443</Port>
      </FrontendPort>
    </FrontendPorts>

  <!--BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.4和10.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-basedaffinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-basedaffinity-->
    <BackendHttpSettingsList>
      <BackendHttpSettings>
         <Name>BackendSetting1</Name>
            <Port>80</Port>
         <Protocol>Http</Protocol>
         <CookieBasedAffinity>Disabled</CookieBasedAffinity>
      </BackendHttpSettings>
    </BackendHttpSettingsList>

  <!--HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort1(443),使用Https协议、证书名字是GWCert-->
    <HttpListeners>
      <HttpListener>
         <Name>HTTPListener1</Name>
         <FrontendPort>FrontendPort1</FrontendPort>
         <Protocol>Https</Protocol>
         <SslCert>GWCert</SslCert>
      </HttpListener>
    </HttpListeners>

  <!--HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1(web服务器80端口、使用http协议、禁用cookie-basedaffinity),绑定HTTPListener1(监听FrontendPort1(443),使用Https协议、证书名字是GWCert),绑定BackendPool1(包含10.0.0.4和10.0.1.4两个AzureVM),所以HttpLoadBalancingRules可以说是所有信息的汇总,让我们完成SSLOffload+负载均衡-->
    <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报文来监视监控后端服务器的健康情况,返回code为200-399确认http服务正常。如果发现某个后台服务器不能及时响应导致probe失败之后,此台后台的VM会从健康实例池中移除,直到其能及时响应probe探测为止。

  4.同时使 http 80负载平衡、https443负载平衡生效的xml参考配置:

<?xmlversion="1.0" encoding="utf-8"?>
<ApplicationGatewayConfigurationxmlns:i="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://schemas.microsoft.com/windowsazure">

  <!--FrontendPorts用来定义应用程序网关上的公网端口,我们定义了http的80端口、https的443端口-->
    <FrontendPorts>
      <FrontendPort>
         <Name>FrontendPort1</Name>
            <Port>80</Port>
      </FrontendPort>
      <FrontendPort>
         <Name>FrontendPort2</Name>
            <Port>443</Port>
      </FrontendPort>
    </FrontendPorts>

  <!--BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.4和10.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-basedaffinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-basedaffinity-->
    <BackendHttpSettingsList>
      <BackendHttpSettings>
         <Name>BackendSetting1</Name>
            <Port>80</Port>
         <Protocol>Http</Protocol>
         <CookieBasedAffinity>Disabled</CookieBasedAffinity>
      </BackendHttpSettings>
    </BackendHttpSettingsList>

  <!--HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort1(80),使用Http协议;HTTPListener1、监听FrontendPort2(443),使用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规则(轮询的负载分配机制),绑定BackendSetting1(web服务器80端口、使用http协议、禁用cookie-basedaffinity),绑定HTTPListener1(监听FrontendPort1(80),使用Http协议),绑定BackendPool1(包含10.0.0.4和10.0.1.4两个AzureVM);定义一个规则名为HttpLBRule2,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1(web服务器80端口、使用http协议、禁用cookie-basedaffinity),绑定HTTPListener2(监听FrontendPort1(443),使用Https协议、证书名字是GWCert),绑定BackendPool1(包含10.0.0.4和10.0.1.4两个AzureVM). 所以HttpLoadBalancingRules可以说是所有信息的汇总,这两个规则可以完成 http 80网站负载均衡+SSLOffload负载均衡-->
    <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>
页: [1]
查看完整版本: Windows Azure Application Gateway 应用程序网关