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
。