事件起因
春節(jié)臨近,12306訂票難的問(wèn)題再一次被引向風(fēng)口浪尖。而這一次,各家瀏覽器廠(chǎng)商不失時(shí)機(jī)的推出了“春節(jié)專(zhuān)版”。這些林林總總瀏覽器的共同特點(diǎn),是集成了一位網(wǎng)友iFish(木魚(yú))的“訂票助手”插件。
不湊巧的是,這個(gè)插件的早期版本使用GitHub的Raw File服務(wù)作為CDN,并對(duì)返回403錯(cuò)誤代碼的請(qǐng)求使用非常暴力的5秒重試。于是,在1月15日的時(shí)候,第一個(gè)訂票小高峰到來(lái)的時(shí)候,GitHub被間接的DDos。
GitHub的運(yùn)維工程師Jesse Newland在發(fā)現(xiàn)服務(wù)器負(fù)載異常之后,不得不禁用了這個(gè)代碼所在Repo的Raw服務(wù),并在Repo里報(bào)告了一個(gè)issue —— 他發(fā)現(xiàn)12306引用了這個(gè)Repo里的一個(gè)資源,由于訪(fǎng)問(wèn)量巨大,這個(gè)資源對(duì)GitHub的服務(wù)產(chǎn)生了負(fù)面的影響,希望有人可以聯(lián)系到12306的工程師去除這個(gè)引用。
身在大洋彼岸的GitHub工程師在解決了GitHub的服務(wù)問(wèn)題之余,顯然不太清楚中國(guó)的兩點(diǎn)情況:
大家疑問(wèn)
大家的質(zhì)疑,存在于兩點(diǎn):
疑難解釋
第一個(gè)問(wèn)題,還是讓插件作者木魚(yú)自己來(lái)解釋?zhuān)?/p>
引入自動(dòng)更新。
由于12306訂票助手是個(gè)很特殊的東西,依賴(lài)于鐵道部的網(wǎng)站而存,并且其運(yùn)行極度依賴(lài)網(wǎng)站本身的功能以及頁(yè)面結(jié)構(gòu),所以隨著鐵道部的改進(jìn),很容易失效(雖然他們的前臺(tái)樣子從開(kāi)始到現(xiàn)在,一年多了幾乎就沒(méi)變過(guò)……他喵的為什么我又要用年做單位說(shuō)時(shí)間,真?zhèn)模?。因此為了保證功能的正常,訂票助手在很早的版本開(kāi)始就引入了自動(dòng)更新機(jī)制(1.4開(kāi)始)。最開(kāi)始的更新都是放在自己網(wǎng)站上的,并且區(qū)分了Firefox和Chrome。
最初的助手是以UserScript的模式出現(xiàn)的,調(diào)試在Firefox下調(diào)試。在Firefox下時(shí),Scriptish提供了支持跨域的GMxmlHttpRequest功能,可以直接用ajax訪(fǎng)問(wèn)我的網(wǎng)站。但是在Chrome下,則沒(méi)有這樣的便利,不支持跨域ajax,所以用的是引入script腳本的方式檢測(cè)更新。在后來(lái)Firefox和Chrome分支完全合并后(最開(kāi)始針對(duì)不同的瀏覽器分離的,后來(lái)發(fā)現(xiàn)同步實(shí)在太麻煩了),舍棄了一些特異的功能(如GMxmlHttpRequest),為一些功能做了適配(如桌面通知),更新也就用下來(lái)了。
但是后來(lái)不知道什么時(shí)候開(kāi)始,這個(gè)更新機(jī)制突然失效了。為啥呢,這要從另一件事開(kāi)始說(shuō)起。
那就是12306的HTTPS。
作為一個(gè)日點(diǎn)擊14億的網(wǎng)站,網(wǎng)宿科技的CDN還是很給力的,根據(jù)我收集到的資料,其加速節(jié)點(diǎn)上百個(gè)。但是,作為一個(gè)訂票的網(wǎng)站又要CDN的,為什么會(huì)用HTTPS協(xié)議還是一個(gè)自簽發(fā)的根證書(shū),實(shí)在太讓人費(fèi)解。任何一個(gè)了解網(wǎng)絡(luò)知識(shí)的人都知道,HTTPS協(xié)議下服務(wù)器的負(fù)載能力要比HTTP的低很多,何況訂票又不是什么機(jī)密的數(shù)據(jù)。 總會(huì)有人跳腳出來(lái)說(shuō)訂票啊多機(jī)密,我總是很反對(duì),哪門(mén)機(jī)密了,車(chē)次還是余票數(shù)據(jù)?
這個(gè)HTTPS帶來(lái)了很大的麻煩。
不知道哪個(gè)版本Chrome引入的安全機(jī)制,對(duì)于一個(gè)HTTPS網(wǎng)站,其所有引用的資源(Script和StyleSheet之類(lèi)的),也必須位于HTTPS的服務(wù)器上,否則拒絕執(zhí)行。而我并沒(méi)有HTTPS服務(wù)器,因此,Chrome下自動(dòng)更新華麗地掛了。 然后是Firefox。Firefox下播放不了音樂(lè),我一直以為是Firefox不支持,后來(lái)才發(fā)現(xiàn)是Firefox的安全機(jī)制在作怪:HTTPS的網(wǎng)頁(yè)拒絕播放來(lái)自于HTTP的多媒體文件。 這倆奇葩讓我傷透了腦筋。然后無(wú)意中瞥見(jiàn)GitHub竟然是HTTPS的,So…… 轉(zhuǎn)移過(guò)去,變成了順理成章的事情,我求爹爹告奶奶沒(méi)求來(lái)一臺(tái)HTTPS的服務(wù)器,雖說(shuō)有免費(fèi)的SSL證書(shū)什么的但是我去申請(qǐng)的時(shí)候,連那提供商的網(wǎng)站自己都證書(shū)錯(cuò)誤了。
于是事情都解決。
而第二個(gè)問(wèn)題,GitHub的負(fù)載能力為什么這么弱,原因在于GitHub根本不適合作為CDN服務(wù)。著名博客比特客棧的文藝復(fù)興,對(duì)此做了詳細(xì)解釋?zhuān)?/p>
它并非靜態(tài)文件服務(wù)器,換句話(huà)說(shuō),所有請(qǐng)求訪(fǎng)問(wèn)都要先經(jīng)過(guò)一堆服務(wù)器代碼處理,降低了它的相應(yīng)速度。
它返回的MIME與文件無(wú)關(guān)(永遠(yuǎn)是text/plain),某些瀏覽器,例如說(shuō)IE,不會(huì)執(zhí)行MIME類(lèi)型錯(cuò)誤的javascript文件。
它返回的Cache-Control Header不允許瀏覽器緩存文件,等于失去了CDN最基本的功能。 恰恰因?yàn)?2306訂票助手不運(yùn)行于IE,也不希望更新文件被緩存,Raw file的后兩個(gè)劣勢(shì)才沒(méi)有顯現(xiàn)出來(lái)。但剩下的那個(gè)劣勢(shì),卻讓Github的響應(yīng)速度大打折扣,不得不暫時(shí)封鎖Raw file訪(fǎng)問(wèn)。
針對(duì)這個(gè)問(wèn)題,原文作者直中要害的提供了兩個(gè)層面的解決方案:
那么,Github作為CDN的正道是什么?Github Pages。通過(guò)加入gh-pages branch,你可以修改和發(fā)布自己repo的文件。值得提醒,Pages雖然免費(fèi),并非資源無(wú)限,詳見(jiàn)官方Disk Quota的描述——“雖然我們沒(méi)設(shè)上限,但請(qǐng)各位合理使用?!?/p>
Github輕描淡寫(xiě)的說(shuō)合理使用,而不是嚴(yán)明規(guī)章到MB、GB,其實(shí)是一種潛意識(shí)的相互信任。這是一種在貧富懸殊供求關(guān)系緊張的中國(guó)日益缺少的東西,12306訂票助手的存在就是一種印證:乘客不相信12306,12306不相信乘客,最后逼出一個(gè)12306訂票助手,每天乃至每半天更新一次來(lái)滿(mǎn)足中國(guó)人訂票回家的需求。
請(qǐng)問(wèn)Google Reader,是怎么在HTTPS域下播放優(yōu)酷與土豆等非HTTPS的視頻?我們?cè)谌ツ?月發(fā)現(xiàn)了同樣的問(wèn)題,Google自己是這樣解決的——
Chrome 21之后,在SSL加密頁(yè)面embed非SSL的Flash會(huì)怎樣呢?會(huì)被默默的屏蔽掉,只留下一句console報(bào)告。那Google Reader是怎么繞過(guò)這個(gè)問(wèn)題看優(yōu)酷與土豆視頻的?他們iframe了一個(gè)非SSL頁(yè)面,再在里面引用flash(引用頁(yè)連域名都是不同的)
同理也適用于Javascript,這也是12306訂票助手當(dāng)前的解決辦法(Firefox除外)。不再需要SSL下的CDN了。
不是結(jié)束
也許一切自有冥冥天意。Jesse Newland,這位在“訂票助手”Repo中發(fā)出警告的GitHub員工,早在2012年12月份,就已受InfoQ之邀,確定參加2013QCon大會(huì)(北京站,4月25-27)。除了分享GitHub的架構(gòu)演進(jìn)之外,Jesse還會(huì)分享他負(fù)責(zé)的項(xiàng)目——GitHub ChatOps運(yùn)維機(jī)器人。不過(guò)看來(lái)這次大會(huì)的演講,他將不得不加入關(guān)于12306插件的話(huà)題。
訂票助手的作者木魚(yú),不堪忍受各界觀(guān)光團(tuán)紛紛造訪(fǎng)他本開(kāi)源在GitHub上的訂票助手代碼倉(cāng)庫(kù),最終刪除了項(xiàng)目。但他表示仍將繼續(xù)精簡(jiǎn)/改進(jìn)這款訂票插件。
因?yàn)檫@個(gè)插件,鐵道部甚至投訴至工信部,要求其責(zé)令各家瀏覽器提供商停止提供附帶搶票功能的瀏覽器的下載。不過(guò)就本文發(fā)表前,各家瀏覽器廠(chǎng)商均表示尚未接到相關(guān)通知。
這一切還都不是結(jié)束。
聯(lián)系客服