收到通知
7月6日下午收到运维转告公司收到ICP的邮件,告知公司主站已被注销,该站的备案号已被收回。收到通知的那一刻就傻了,这意味这上百个子域名将被停用,紧接着就发现部分网站已经开始出现TestPage 184的提示。
更换域名
第一时间想到的是更换域名,被注销的域名是xxx.com,公司名下还有一个xxx.cn的域名备案正常。于是开始购买 cn 域名的 SSL 证书,先把用户无感知的一些后台服务换成了 *.xxx.cn 的子域名。更换的过程中发现好多代码中硬编码了好多域名进去,于是召集研发排查硬编码的域名并更换。
CNAME 的诱惑
域名换了几个发现进度太慢,距离被注销已经1个小时了,发现原有域名下的 CDN 服务并没有失效,难道是因为阿里云的 DNS 只是屏蔽了主域名,增加一层 CNAME 就绕过去了?怀着侥幸心理,把一个 yyy.xxx.com CNAME 的记录改为了 yyy.xxx.cn 并将 yyy.xxx.cn 的 A 记录改为了源站的IP。结果是竟然可以了,暗自窃喜了10分钟后,访问 yyy.xxx.com 发现网站又是 TestPage 184了。
无奈之举,境外服务器
CNAME 方法失败后开始反思,可选的方案有两种:
- 更换域名
- 原有域名解析到境外服务器
两种方案的优劣比较:
综合考虑后还是决定解析至境外的服务器,并用Nginx反向代理回境内服务器上。需要做的就是:
- 购买新加坡节点的服务器,安装 Nginx ,配置反向代理。
- 解析原有域名至新加坡服务器的IP。
下面列出一个站点的 Nginx 配置:
server {
listen 443 ssl;
server_name libraryplus.api.xxx.com photo.api.xxx.com;
root html;
index index.html index.htm;
ssl_certificate /etc/nginx/api.xxx.com.pem;
ssl_certificate_key /etc/nginx/api.xxx.com.key;
ssl_session_timeout 5m;
ssl_ciphers RC4:HIGH:!aNULL:!MD5;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
client_max_body_size 1024m;
location / {
proxy_pass http://39.107.253.80:80;
proxy_redirect off;
if ( $host ~* (.*)\.com )
{
set $host_my $1;
}
proxy_set_header Host $host_my.cn;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
其中需要强调的一个地方是 proxy_set_header Host
的配置。因为原有域名是被阿里云的防火墙过滤的,如果不修改回源的 Host 的话,即使 DNS 可以逃脱,内容还是会被拦截的。所以 Host 改为一个已备案的域名就可以了,上面我通过正则批量改成了 .cn ,对应的要在后端的web服务器上做对应的修改,如 IIS 里要在站点的网站绑定里添加对应 cn 域名的主机头。
至此,在7日的凌晨3点把120多个子网站全部配置完成,客户感知的最长宕机时间为9个小时...
恢复操作
9日下午收到ICP的备案通过邮件,告知备案已通过,域名可以在7小时内生效。(正常的审核速度应该是7-14个工作日,后来才得知,注销和再次审核通过都是有背后操作的。)
从境外的撤离操作就简单很多,业务站点几乎不用动,只要把域名的 DNS 重新解析回原来的IP就可以了,web站点绑定的备用域名主机头可以删了,境外服务器也可以释放了。