記【域名備案被註銷】後的9個小時

收到通知

7月6日下午收到運維轉告公司收到ICP的郵件,告知公司主站已被註銷,該站的備案號已被收回。收到通知的那一刻就傻了,這意味這上百個子域名將被停用,緊接着就發現部分網站已經開始出現TestPage 184的提示。
image.png

更換域名

第一時間想到的是更換域名,被註銷的域名是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 方法失敗後開始反思,可選的方案有兩種:

  1. 更換域名
  2. 原有域名解析到境外服務器

兩種方案的優劣比較:

方案 優勢 劣勢
解析境外 配置簡單、業務影響小 訪問速度慢、非長久之計,後期需要再調整回來
更換域名 風險小、可長久使用 配置繁瑣、業務影響大

綜合考慮後還是決定解析至境外的服務器,並用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 //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站點綁定的備用域名主機頭可以刪了,境外服務器也可以釋放了。