在Reverse Proxy上如何進行網頁快取(Cache)讓這台伺服器在擔任負載平衡之際,同
時可以協助靜態網頁做快取機制,加速Client網頁回應速度. 與減輕後端伺服器存取壓力
Nginx 內建就有Cache Server Module.所以我們只要啟用它就可以
設定步驟:
(1) 編輯 /etc/nginx/nginx.conf
在 http 字段中添加:
引用:
# Proxy Setting
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Cache Server
proxy_cache_path /data/proxy_cache levels=1:2 keys_zone=cache_one:30m inactive=10d max_size=10G;
proxy_cache_path:定義一個用來保存cache的目錄,及一個保存緩存對象的共享內存區域(keys_zone=name:size),其可選参數有:
levels:每級子目錄名稱的長度,有效值為1或2,每級之間使用冒號分隔,最多為3級;
inactive:非活動緩存項從緩存中剔除之前的最大緩存時長;
max_size:緩存空間大小的上限,當需要緩存的對象超出此空間限定時,緩存管理器將基於LRU算法對其進行清理;
(2) 然後在server中 location 字段中添加:
引用:
location / {
proxy_pass http://www.adj.idv.tw;
proxy_buffering on;
proxy_cache cache_one;
proxy_cache_valid 200 304 7d;
proxy_cache_valid 301 302 10m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
add_header X-Via $server_addr;
add_header X-Cache-status $upstream_cache_status;
expires 7d;
}
proxy_cache zone|off:定義一個用於緩存的共享內存區域,其可被多個地方調用;緩存將遵從upstream服務器的回應報文首部中關於緩存的設定,如 "Expires"、"Cache-Control: no-cache"、 "Cache-Control: max-age=XXX"、"private"和"no-store" 等,但nginx在緩存時不會考慮響應報文的"Vary"首部。为了確保私有信息不被緩存,所有關於用戶的私有信息可以upstream上通過"no-cache" or "max-age=0"來實現,也可在nginx設定proxy_cache_key必須包含用戶特有數據如$cookie_xxx的方式實現,但最後這種方式在公共緩存上使用可能會有風險。因此,在響應報文中含有以下首部或指定標志的報文將不會被緩存。
Set-Cookie
Cache-Control containing "no-cache", "no-store", "private", or a "max-age" with a non-numeric or 0 value
Expires with a time in the past
X-Accel-Expires: 0
proxy_cache_use_stale:在無法連繫到upstream服務器時的哪種情形下(如error、timeout或http_500等)讓nginx使用本地緩存的過期的緩存對象直接回應客戶端請求;其格式為:
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off
proxy_cache_valid [ code ...] time:用於為不同的回應設定不同時長的有效緩存時間,例如:proxy_cache_valid 200 302 10m;
add_header 用於自定義http響應報文內容,這裏用於查詢是否命中緩存;
(3) 建立nginx緩存目錄,並重啟nginx:
# mkdir /data/proxy_cache/
# nginx -s reload
(4) 檢測緩存是否命中:
引用:
# curl -I http://www.xxx.com.tw
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 12 Feb 2015 07:21:13 GMT
Content-Type: text/html; charset=utf8
Connection: keep-alive
Last-Modified: Tue, 11 Jun 2013 02:12:56 GMT
Vary: Accept-Encoding
Content-Encoding: gzip
Expires: Thu, 19 Feb 2015 07:21:13 GMT
Cache-Control: max-age=604800
X-Via: xx.xx.xx.xx
X-Cache-status: HIT
看到X-Cache-status 字段為
HIT ,就是成功了。