透過 Varnish 讓 WordPress 速度起飛

本篇並不適用:沒有主機權限、不知道 Nginx、不知道 Varnish、不知道 Cloudflare 的使用者,這篇比較適用於了解技術且會設定伺服器設定的人。

最近在測試快取的部分,雖然 W3 Total Cache 很棒,不過 Request 還要先到 php 才能拿到被快取的檔案,而且是在硬碟中,又是進 php 又是跟硬碟拿資料,在怎樣速度就是那樣,雖然偽靜態化後也是可以提高不少速度,不過還是有不少東西受到限制,後來就想說改用 Varnish,省掉進 php 又可以將快取放在記憶體中,搭配 Cloudflare 處理圖片的請求,省流量也省的 Varnish 將圖片放進快取浪費記憶體資源。

架構上其實還蠻簡單的,有經驗的人應該就可以依據下面的圖自己動手做了 XD。

 

這次不會有太多的部份在說明如何做怎麼設定,而是以放上設定檔的方式來帶過。

前端的 Nginx 負責接收 80 與 443 的請求,並轉給 Varnish。
而將在 wp-content/uploads 的請求都丟給一個在 Cloudflare 的域名,詳細使用方法可以參閱之前的文章:透過 Cloudflare 減少 WordPress 圖片的流量

接著是 Varnish 的設定。

最後就是後端網站本體的設定,而前端的 Varnish 也會將沒被快取或是不快取的請求丟回給網站本體,下方還有個 server 則是給 CloudFlare 要圖片使用。

開始實驗

使用的機器:DigitalOcean 15 美金主機 1 Core 3G Ram 方案 4 台,其中三台作為一整組的架構,最後一台則是一般的單台伺服器。
壓力測試軟體:ApacheBench 2.3
被測試的 WordPress 網站版本都是 4.9.5 且會裝 W3 Total Cache 版本 0.97。

以下是簡單的架構圖:

一般而言很多網站都會使用快取外掛,不過對 WordPress 來說幾乎所有外掛都不會快取 wp-json 這個位置,因此就算有快取外掛當大量存取 wp-json 這個位置時還是會導致主機負載很高,而使用 Varnish 後就能快取一些外掛也無法快取的東西。

本次 ab 的參數:ab -c 100 -n 10000 http://example.com/wp-json,同時 100 個連線,連續點擊 10000 次,並會取 5 次結果進行平均。

有 Varnish 的網站 header 資訊:

無 Varnish 的網站 header 資訊:

沒有 Varnish 的網站在 ab 的過程中就可以看到 Load Average 整個標上去甚至到 40 以上。

而有 Varnish 的網站在 ab 的過程中就可以看到Web Server 本身的 Load Average 並不高,由於有兩台 Varnish,所以後端的 Web Server 可以見到有兩個 ab 的 log,之後就全數被前端的 Varnish 吃下。

ab 下來的結果也是相差許多,有 Varnish 的網站每秒鐘可以回應 3000 次,而沒有 Varnish 的網站每秒只有 30 次左右。

刻意拿掉一台 Varnish,每秒鐘可以回應的請求也差不多少一半。

實驗結果

可以看出有 Varnish 與無 Vanrish 有顯著的性能差異。

 

在〈透過 Varnish 讓 WordPress 速度起飛〉中有 1 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *