Varnish 快取系統

Simple Hosting 主機擁有強大的 Varnish 快取系統,可以讓大量的網站訪客從分散式的系統中直接取得內容,而不需要一直存取您的主機。

Varnish 快取是存在於 Simple Hosting 主機之前的系統,當訪客瀏覽您網站的內容時,內容會暫存在快取中,提高下次回應的速度。

舉例來說,當一個訪客需要瀏覽您主機的 『foo.jpg』 時,這張圖片就會儲存在快取系統中。當下一個訪客要存取相同的圖片時,快取系統就會直接回應已儲存的圖片,直接回覆要求,您的主機便不需要再回應一次。

檢查快取狀態

預設開啟快取系統,並且所有內容暫存時間為 120 秒。

您可以控制快取的時間,或者決定是否快取您的內容。您還可以依照不同的連線來設定是否快取同一個物件。

當您對 Simple Hosting 或是網頁加速器發送 http(s) 連線時,您可以從回應的標頭中看到特別的資訊告訴您此網站是否開啟了快取系統。

您可以使用一些工具來檢查標頭,譬如瀏覽器的 「檢查元件(Inspector)」 工具或是利用指令: curl -i http://example.com

所有的連線中,您都可以透過標頭 (RFC2616) 來了解是否啟用快取,是否由快取系統提供等:

Via: 1.1 varnish

您可以查看標頭中的 Age: ,若是大於 0 表示是由快取系統提供的回應。下面的範例表示此回應是由快取系統提供,並且已經暫存了 117 秒:

Via: 1.1 varnish
Age: 117

您可以對同一個物件發送多次連線,就可以看到 Age: 參數不斷增加,若物件沒有被快取,此值為 0 ,若一直都是 0,表示是由主機直接提供而不是快取系統。

若是數值一直增加直到過期,表示此物件是由快取提供、或是你的瀏覽器暫存檔、或是您網際網路服務供應商 (ISP) 所提供的代理伺服器 (Proxy Server)。過期或是清除快取後,此值又會歸為 0

變更快取時間

預設的快取暫存時間是 120 秒。如果您想要變更此設定,您可以在標頭中設定最大的暫存時間(單位是秒):

HTTP Cache-Control: max-age=200

警告

在開發或是測試時,您可以將快取時間縮短為 1 秒,設定 max-age=1。若設定 max-age=0 則會關閉快取功能,這會影響您主機的效能,不建議您關閉快取。

PHP 的範例:

header("Cache-Control: max-age=1");

靜態網站可以使用 .htaccess 來設定:

Header add Cache-Control "max-age=1"

Node.js 的範例 (適用於標準的 HTTP 函式庫與 Express 框架):

function (request, response) {
    response.setHeader('Cache-Control', 'max-age=1');
}

備註

使用 VPS 的進階客戶:網站加速器 (Web Accelerator) 將會處理 s-maxage

清除快取

下列提供數種方法來清除 Varnish 的快取。

使用 HTTP PURGE/PURGEALL 請求來清空快取

您可以透過 HTTP PURGE 請求來清除某一個連線的快取。也可以清除整個網站的快取。

備註

PURGE 與 PURGEALL 只能使用在 Simple Hosting 與伺服器。目前,無法從 Simple Hosting 伺服器端發出。

舉例來說,你可以使用 curl 指令來連接主機:

$ curl -X PURGE http://www.example.com/test/index.html
$ curl -X PURGEALL http://www.example.com/

或者,您可以使用此 php 檔,並以瀏覽器執行此 php 來清除快取:

<?php
/* purge.php
 * Purge a URL on this host
 */
header("Cache-Control: max-age=1"); // don't cache ourself

error_reporting(E_ALL);
ini_set("display_errors", 1);

// Set to true to hide varnish result
define("SILENT", false);

$path = isset($_GET["path"]) ? $_GET["path"] : "";

$purge_url = "http://" . $_SERVER["HTTP_HOST"] . "/$path";

if ( $ch = curl_init($purge_url) ) {
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PURGE");
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    curl_setopt($ch, CURLOPT_NOBODY, SILENT);

    curl_exec($ch);
    curl_close($ch);
}
?>

從管理介面清除快取

您可以從 Simple Hosting 的控制台找到清除快取的方法。

登入控制台後,找到 「Varnish」 區塊,按下清除快取的按鈕。

如果您看到 「200 = OK」 表示已成功清除。

備註

PURGEALL 指令每 120 秒可以執行一次。避免快取系統的 CPU 過載。

在佈署 Git 分支的時候清除快取

使用 Simple Hosting 主機內建有 Git 儲存庫,當您執行佈署指令的時候,最後會自動觸發 PURGEALL 指令清除快取。

mod_expires

您的 Simple Hosting 主機使用 Apache 並內含 mod_expires 模組,可以允許您上次檔案修改的時候來設定快取,或是依照最後的網路存取時間。

您可以使用指令 ExpiresDefault 來設定全部物件的快取時間,或是用 ExpireByType 設定特定檔案的快取時間。

關於更多 mod_expires 的設定,請參閱: mod_expires Apache2 documentation.

Surrogate-key

您可以使用 Surrogate-Key 標頭來控制物件群。要註冊物件時 (例如網頁或是圖片),只需要在標頭中加註物件。就可以使用 PURGE 指令來清除該物件:

例如,在 PHP 中新增一個物件:

header("Surrogate-Key: foo");

Node.js 的範例:

function (request, response) {
    response.setHeader('Surrogate-Key', 'foo');
}

要清除物件時:

curl -X PURGE -H 'Surrogate-Key: foo' http://www.example.com/

您可以同時指定多個群組物件。要同時指定時,用空格區分每一組物件:Surrogate-Key: foo bar

Cookies

一般的情況下,連線中的 Cookies 並不會被快取。同樣,回應寫入的 set-cookie: 也不會被存在我們的快取系統上。

若要將 Cookie 儲存起來,您可以使用特殊前置字:STYXKEY

當我們的快取系統看到連線中的 Cookie 使用這個前置字,且取中有已儲存的 Cookie 並且尚未過期、則快取就會直接回應。如果沒有 set-cookie 的話就會被儲存下來。

以下的範例將示範如何使用 STYXKEY 關鍵字來儲存 Cookie:

  1. 瀏覽器會先要求瀏覽您網站的首頁 (GET /)
  2. 您的應用程式或是網站會在回應的標頭中加入: set-cookie: STYXKEY-lang=EN -> 不會暫存,因為使用了 set-cookie 。
  3. 當瀏覽器擁有此 Cookie 時,再次瀏覽主網頁 (GET /)
  4. 您的應用程式或是網站偵測到 Cookie 為 STYXKEY-lang 值為 EN 網站回應英文的內容並且在標頭中沒有 set-cookie: -> 此值將被暫存。
  5. 當瀏覽器再次要求網暫時 (Get /)
  6. 我們的系統偵測到 cookie STYXKEY-lang=EN 並由快取直接提供 cookie。

請注意,請務必遵守 Cookie 的標準格式。

為了確保我們的系統會順利快取 Cookie,建議您使用 STYXKEY 其後接 -_. ,與您的變數名稱。例如,下列範例的 cookie 都可以被列入快取內:

STYXKEY_language=fr
STYXKEY-language=en
STYXKEY.language=de

下列格式的 cookie 不會被列入快取:

language-STYXKEY=en            # 必須是 STYXKEY 開頭
STYX-KEY-language=en           # 必須是 STYXKEY
styxkey_is_case_sensitive=true # 必須是大寫 STYXKEY
STYXKEY=present                # 必須是前置字,不可是名稱