隨着中國企業出海Go Global,愈來愈多的用戶開始在Global Azure部署本身的應用。因爲對Global Azure功能和文檔的不熟悉,使用過程當中或多或少遇到了一些坑。事實上呢,這些並非坑的坑是徹底能夠解決。這篇博客就是一個真實的客戶案例。php
客戶需求html
客戶須要在Azure海外region部署自行研發的app後端服務器,這以後客戶會向IOS App Store提交App的審覈linux
目前問題nginx
客戶在Azure上部署了虛機可是無法分配ipv6的地址,客戶還嘗試配置IPv6隧道可是也不work。shell
背景分析編程
自2016年6月開始,全部提交給Apple App Store的app都必須支持IPv6-only的networking。須要注意的是,這個要求是面向App客戶端代碼的(https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1)而並非說app的後端服務器必須有IPv6的地址,注意留心如下的截圖。json
上述Apple文檔的連接裏也給出了常見的App編程上的錯誤致使IPv6審覈被reject以及相應的best practise,好比避免在源代碼和配置文件裏hardcode了IP地址,避免使用了只支持IPv4的API和庫等等。這裏,建議開發同窗在開發初期讀一下整篇文檔並在測試階段按文檔章節「Test for IPv6 DNS64/NAT64 Compatibility Regularly」進行測試。ubuntu
在本案中,因爲APP提交審覈的階段項目已經結尾沒有時間也沒有人力來從新改動調試代碼。所有的壓力就都到了負責部署的運維團隊。好在Azure Global其實已經支持部署IPv6的應用,本文會step by step的講解在Azure中如何部署基於Windows+IIS的IPv6網站以及基於RHEL+Nginx的IPv6網站windows
Azure中的IPv6架構 後端
咱們先看一下在Azure中一個IPv6網站的架構圖:
客戶端可與public facing 的 Azure Load Balacner公共 IPv4 或 公共 IPv6 地址通訊。 Load Balancer則將 IPv6 數據包路由到 VM 的私有 IPv6 地址。
這裏須要着重指出的是,LB的IPv6是公有地址,也就是能夠用在你的網站的域名管理裏的A Record. 而虛機的IPv6則是私有地址,客戶端不能經過虛機的這個地址來訪問網站及虛機。由此,服務器端的安全性獲得了很好的保障。
在Azure上部署
目前Azure的網站上對這個架構服務器提供了三種部署方法,Powershell,Azure CLI 以及ARM模板。對於Portal則列出了因爲「沒法在 Azure 門戶中添加 IPv6 負載均衡規則」而沒法支持的限制。然而實測發現Portal上目前已經支持部署這樣一套架構了。這裏考慮到快速部署的需求採用了ARM模板的方式。同時在上述架構中咱們還添加了跳板機,用於在虛機中的配置工做。
Windows+IIS
ARM模板文件能夠從如下Link下載:https://ipv6.blob.core.chinacloudapi.cn/template 文件名:windowsipv6.json
這裏咱們採用了Windows 2012 R2 Datacenter的image,你們能夠根據須要改動如下的代碼
1 "storageProfile": { 2 "imageReference": { 3 "publisher": "MicrosoftWindowsServer", 4 "offer": "WindowsServer", 5 "sku": "2012-R2-Datacenter", 6 "version": "latest" 7 },
模板的部署也有Portal,Powershell和CLI三種方式。這裏Demo了Azure Portal 的Templates 功能
1. 上傳模板
點擊「Add」選項,在「Add general information」處填寫模板的名字,在「Add template」處把上文模板的內容複製黏貼進去。隨後,點擊「OK」保存模板。
2. 按模板部署系統
接下來開始部署系統,選定上一步保存的模板,點擊「Deploy」選項
填寫所需的參數並點擊「Purchase」選項
3. 部署成功以後記得遠程RDP後端的虛機開啓IIS功能,具體步驟能夠參照http://jingyan.baidu.com/article/b24f6c82c504d686bfe5da3d.html。
由於咱們模板裏作了Port在50001和50002的NAT規則,RDP的時候記得要採用相應的Port
4. 部署成功後,能夠在任何的瀏覽器裏鍵入IPv4的DNS或IPv4ip來驗證網站的IPv4的connectivity。
可是對於IPv6的驗證,只有瀏覽器的網絡環境支持IPv6才能夠經過鍵入IPv6的DNS或者[IPv6ip]進行驗證。若是網絡環境不支持,能夠經過http://ipv6-test.com/validate.php進行IPv6驗證
能夠看到以上的網站http://bw6.southeastasia.cloudapp.azure.com/ 以及IPv6地址2603:1040:3d4經過了下圖的IPv6網站測試。
RHEL+NGINX
ARM模板文件能夠從如下Link下載:https://ipv6.blob.core.chinacloudapi.cn/template 文件名:rhelipv6.json (這裏咱們採用了RHEL6.8的OS Image)
整個的模板部署過程和上文windows+iis是同樣的。這裏重點講一下部署以後虛機內部的配置。
1. SSH連入虛機,一樣由於咱們模板裏作了Port在50001和50002的NAT規則,SSH的時候記得要採用相應的Port
2. 部署Nginx,順序運行如下命令
[nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/rhel/6/$basearch/ gpgcheck=0 enabled=1
sudo vi /etc/sysconfig/network
NETWORKING_IPV6=yes
IPV6INIT=yes DHCPV6C=yes
sudo vi /etc/nginx/conf.d/default.conf (確保如下內容加入在default.conf中)
listen [::]:80; listen 80;
sudo ip6tables -I INPUT -p tcp --dport 80 -j ACCEPT
3. 按windows章節IPv6網站驗證方法開始驗證
http://blog4rh.southcentralus.cloudapp.azure.com/ ,IPv6 2a01:111:f100:4001::4625:a037 確認·能夠鏈接。
改進
在以上的部署過程當中,不論是Linux仍是Windows都涉及到了post-deployment的配置,好比配置IIS,Nginx,配置DHCP等等的工做。咱們能夠把這部分工做做爲虛機extension資源放入ARM模板從而達到全自動化快速部署的需求
提示
RHEL6.8+NGINX是須要最多額外配置的IPv6組合, 咱們還測試了windows+nginx,ubuntu16+nginx等組合都能順利部署成功IPv6的網站,具體部署能夠參考https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-ipv6-for-linux。比較有趣的是,在不一樣nginx版本測試的過程當中,咱們發現個別Nginx的版本對IPv6支持上存在bug,你們須要留意這點