本文主要介紹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端口的負載平衡:
<?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負載均衡,所以定義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-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,監聽FrontendPort1(80),使用Http協議-->
<HttpListeners>
<HttpListener>
<Name>HTTPListener1</Name>
<FrontendPort>FrontendPort1</FrontendPort>
<Protocol>Http</Protocol>
</HttpListener>
</HttpListeners>
<!--HttpLoadBalancingRules用來定義負載均衡規則,此處我們定義一個規則名爲HttpLBRule1,它使用basic規則(輪詢的負載分配機制),綁定BackendSetting1(web服務器80端口、使用http協議、禁用cookie-based affinity),綁定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文件參考如下
<?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 ,所以定義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-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,監聽FrontendPort1(80),使用Http協議-->
<HttpListeners>
<HttpListener>
<Name>HTTPListener1</Name>
<FrontendPort>FrontendPort1</FrontendPort>
<Protocol>Http</Protocol>
</HttpListener>
</HttpListeners>
<!--HttpLoadBalancingRules用來定義負載均衡規則,此處我們定義一個規則名爲HttpLBRule1,它使用basic規則(輪詢的負載分配機制),綁定BackendSetting1(web服務器80端口、使用http協議、禁用cookie-based affinity),綁定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 服務器分別建立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,所以定義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-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,監聽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-based affinity),綁定HTTPListener1(監聽FrontendPort1(443),使用Https協議、證書名字是GWCert),綁定BackendPool1(包含10.0.0.4和10.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報文來監視監控後端服務器的健康情況,返回code爲200-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用來定義應用程序網關上的公網端口,我們定義了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-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,監聽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-based affinity),綁定HTTPListener1(監聽FrontendPort1(80),使用Http協議),綁定BackendPool1(包含10.0.0.4和10.0.1.4兩個AzureVM);定義一個規則名爲HttpLBRule2,它使用basic規則(輪詢的負載分配機制),綁定BackendSetting1(web服務器80端口、使用http協議、禁用cookie-based affinity),綁定HTTPListener2(監聽FrontendPort1(443),使用Https協議、證書名字是GWCert),綁定BackendPool1(包含10.0.0.4和10.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>