使用 Varnish 優化移動端站點

文/公子肥馬輕裘

想象一下:你剛剛發佈瞭一篇博文,並分享到瞭社交網絡。然後,這篇文章恰巧被大 V 看中再次分享瞭出去,立即吸引瞭數百粉絲的目光,引導他們湧入瞭你的網站。看到這麼多的訪客量,以及它們的評論,你內心激動不已。突然之間,你的網站掛掉瞭,滿屏的數據連接錯誤

或者假想另一種情景:你一直很努力地創業,某一天,一個大 V 在社交網絡表達瞭對貴公司的喜愛之情,字裡行間滿滿的贊嘆。關註這個大 V 的粉絲心動瞭,又湧入瞭你的網站。不幸的是,點擊連接後卻無法進入你的網站,或者進入後無法註冊用戶,甚至頁面響應超時,無法獲取產品的序列號。盡管你在社交網絡上對此非常誠懇地表達瞭歉意,但粉絲們都不會再有興趣。

這些假想其實非常普遍。在我的工作中,就經常發現,當網站信息在社交網站流傳開來的時候,移動設備的訪問請求就會驟增。這也表明,在社交網絡中,越來越多的人開始使用移動設備,而不是傳統的桌面應用。此外,大多數的移動用戶都在使用公共 Wi-Fi 以及其他低速網絡來訪問網站。所以,快速加載網站的任何優化措施,都會有利於用戶的訪問。

在本文中,我會向你介紹 Varnish 網頁應用加速器(Varnish Web application accelerator)這是一個免費、簡單的工具,有助於改善大規模突發性訪問狀態下的響應能力。

亮點

對於大多數的網站來說,眾多用戶請求訪問的核心內容大都是一致的尤其是每天都會更新內容的門戶網站。不用多說你也會理解,圖片、CSS 和 JavaScript,這些靜態資源往往有較長的緩存周期期(譯者註:有利於在不同頁面間復用)。但你可能沒有深入思考過,通常在博客平臺或者是內容管理系統中,響應用戶的請求後,所返回的數據內容,大多也是相同的。

來自社交網絡的用戶進入一個博客後,並不會請求完全一致的信息。除瞭圖片、JavaScript 和 CSS,這些信息還包括 PHP 動態生成的內容,以及從數據庫查詢到的數據。訪問博客中的某一篇文章,所需要發送的每一條請求,不僅僅是在獲取網絡服務器提供的靜態資源,還需要使用 PHP 腳本,使用數據庫連接以及數據庫表單檢索等功能。

數據庫連接的數量越多,Apache 需要處理的進程就會越多,而總的處理能力是有限的。相應的,訪客的數量越多,服務就會越不穩定,掙到的錢就會越少。

這就是類似 Varnish 的 HTTP 反向代理服務器發揮作用的地方。如此一來,從瀏覽器發出的請求,不再直接到達創建和維護網頁的服務器,而是到達 HTTP 緩存服務器。如果緩存服務器中存在所需頁面,那麼直接從服務器的內存返回相應的資源,不再動用 Apache 服務器和數據庫。如果所需頁面不在緩存中,那麼就像傳統方式一樣,使用 Apache 服務器來處理。Apche 處理完成之後,就會將這個頁面保存到 HTTP 緩存服務器中,等到下一次請求相同頁面時就可以直接返回瞭。

將頁面保存在內存中,其響應速度遠快於將其保存在硬盤中。此外,當請求的頁面位於 HTTP 緩存服務器中時,就無需調用 PHP 或者數據庫來處理相關操作。這也讓 PHP 和 服務器能夠有更多的性能來處理更繁重的進程和連接。比如,上面提到的被大 V 稱贊的那傢初創公司面臨的窘境,眾多粉絲點擊的鏈接其實隻是網站中的少數幾個頁面而這些完全可以保存在高速緩存服務器中,當需要時可以直接從內存響應請求。此時,準備註冊的用戶就會感到整個流程非常順利,因為後臺腳本和數據庫連接的處理能力非常寬裕,完全不受突發性請求的影響。

原理

下面這個示意圖,展示瞭 Apache 服務器響應請求後生成站點內容的基本流程。在這個例子中,為瞭請求相同的頁面,一共從瀏覽器發送瞭五條指令給 Apache,而 Apache 對每條請求都做瞭詳細的處理。

是的,Apache 處理瞭每一條請求圖像,CSS,JavaScript 和 HTML 文件。如果 PHP 中有某個文件,就會解析一次。如果需要請求數據庫的信息,那麼就要執行一次數據連接,進行 SQL 查詢等操作。最終,在 Apache 返回給瀏覽器信息之前,數據庫返回相關信息組裝成完整的頁面。

如果我們在 Apache 之前使用 Varnish,就可以組成這樣的一個流程:

如果瀏覽器請求的資源和頁面已經存在緩存中,那麼 Varnish 就會直接從內存返回這些資源,而 Apache、PHP 和 MySql 完全不需要進行重復的操作。如果瀏覽器請求的數據不在緩存中,那麼 Varnish 就會將相關的處理工作轉移給 Apache,讓 Apache 處理細節。這種流程的優勢就在於,隻讓 Apache 處理必要的工作,一旦生成瞭所需的資源,該資源就會被保存到緩存服務器的內存中。當再次有請求訪問這些資源時,Varnish 就完全有能力應付瞭。

這個工具還有另一項好處。在 Varnish 的術語中,你所配置的 Apache 服務器,被稱為處理後臺。Varnish 允許配置多個處理後臺。所以,你可以同時運行兩個網絡服務器,比如,一臺使用 Apache 處理 PHP 頁面,一臺使用 nginx 處理靜態資源。在 Varnish 中設置成功後,就可以從正確的服務器獲取相應的資源。在本篇教程中,我們將著眼於一個簡單的示例。

震驚!快教我吧