设为首页 收藏本站
查看: 2221|回复: 0

[经验分享] Windows Azure Application Gateway 应用程序网关

[复制链接]

尚未签到

发表于 2018-6-15 13:59:09 | 显示全部楼层 |阅读模式
本文主要介绍Windows Azure 应用程序网关三种主要功能介绍:Http负载平衡、基于cookie会话连接、SSL卸载
DSC0000.png

  Azure应用程序网关(Azure Application Gateway)

  基础环境准备,在虚拟网络中为应用程序网关创建一个子网,在本文中使用AppGateway-1子网。

DSC0001.png


New-AzureApplicationGateway-Name WinAppGW -VnetName AppGatewayVnet -Subnets AppGateway-1
  #新建应用程序网关,命名为WinAppGW ,放置在虚拟网络AppGatewayVnet 子网AppGateway-1内
  #此时不会开始计收网关的费用。计费将在后面已成功启动网关时开始
DSC0002.png


Get-AzureApplicationGateway
  #获取网关的详细信息
DSC0003.png


Start-AzureApplicationGateway-Name WinAppGW
  #尝试启动网关,提示“由于没有进行任何配置,无法启动”
DSC0004.png


  既然这样,我们先配置“Http负载平衡”的功能。

  【Part.1】HTTP load balancing(Http负载平衡)
  1.  对比Azure负载平衡器 VS Azure应用程序网关
  Azure Load Balancer,工作在传输层工作,TCP/UDP,提供4层负载均衡
  Azure Application Gateway 提供Http流量的路由规则,进一步对7层的http流量进行负载均衡
DSC0005.png


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

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



拓扑:
DSC0007.png

  管理配置应用程序网关需要使用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文件的路径
DSC0008.png


  #网关设置好了之后,通过以下命令启动网关
  Start-AzureApplicationGateway-Name WinAppGW
DSC0009.png

  #获取网关详细信息,网关的公网IP已经生成:139.217.27.22
  Get-AzureApplicationGateway-Name WinAppGW
DSC00010.png

  我之前在winappgatevm-1(10.0.0.4)和winappgatevm-2(10.0.1.4)上分别配置了两个简单的网站,随着刷新页面,我们发现轮询的负载均衡已经生效。
DSC00011.png


DSC00012.png


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

  2.实验过程:
拓扑:
DSC00013.png
  为了测试基于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
DSC00014.png


  紧接着我再次访问139.217.27.22时,我的http请求中带着之前服务器给我返回的cookie,致使我不断的刷新也只会访问首次访问的服务器。Cookie依旧是 ARRAffinity=b2b030bd049b3ae07c0c65419246492734f60ad3ec994bb9cb6414062dc14199\r\n
DSC00015.png


  【Part.3】SSL Offload(SSL卸载)
  Application Gateway起到了SSL加解密的作用,客户端跟App Gateway之间SSL Session 交互,不需要跟后台的所有的web 服务器分别建立SSLsession,所有的SSL行为和SSL证书统一在App Gateway 设备上统一管理维护,相当于为后端VM卸载掉SSL加密的任务量,释放了后端VM的消耗在SSL加密上的资源。
  首先你需要有一张CA颁发的服务器端的*.pfx证书,关于制作证书,不在此赘述。
  拓扑:
DSC00016.png

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


  接下来我们需要配置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
DSC00018.png


  访问 https://139.217.27.22/ ,已经可以访问,并且可以负载均衡。证书为自己手工制作的自签名证书,此处不受信可以也不影响https的测试访问。
DSC00019.png


DSC00020.png


  【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"
DSC00021.png


  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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-524283-1-1.html 上篇帖子: 如何解决Windows Installer引发的错误 下篇帖子: Windows Phone访问web service和WCF服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表