在Azure上部署IPv6的App经过IOS App Store审核

 

随着中国企业出海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,顺序运行如下命令

  • sudo vi /etc/yum.repos.d/nginx.repo (若部署其余的linux系统,请参照https://www.nginx.com/resources/admin-guide/installing-nginx-open-source/ 决定如下文本内容)
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/rhel/6/$basearch/
gpgcheck=0
enabled=1
  • sudo yum install epel-release
  • sudo yum install nginx
  • sudo ifdown eth0 && sudo ifup eth0
  • sudo vi /etc/sysconfig/network 

NETWORKING_IPV6=yes
  • sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0 (在文件中加入如下内容)
IPV6INIT=yes
DHCPV6C=yes
  • sudo vi /etc/nginx/conf.d/default.conf (确保如下内容加入在default.conf中)

 

listen [::]:80;
listen 80;

 

  • sudo service niginx start
  • sudo ip6tables -I INPUT -p tcp --dport 80 -j ACCEPT

  • sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
  • sudo service network restart

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,你们须要留意这点