什么是web cache?
Web緩存是指一個Web資源(如html頁面,圖片,js,數據等)存在與Web服務器和客戶端(瀏覽器)直接的副本。緩存會根據進來的請求保存輸出內容的副本;當下一個請求到來的時候,如果是相同的URL,緩存會根據緩存機制決定是直接使用副本響應訪問請求還是向源服務器再次發送請求。 —–摘自Alloy Team
緩存命中率類型:
文檔命中率:按文檔數量進行衡量
字節命中率:按命中的字節數量進行衡量
緩存處理流程:
接受請求:接受來自client的訪問請求
解析請求:提取client訪問請求的URL中的頭部信息
查詢緩存:根據提取的頭部信息查詢緩存數據是否含有客戶端訪問的請求數據
新鮮度監測:如果緩存數據中含有客戶端訪問的數據,則檢查數據的有效性
創建響應報文:當確定緩存命中的數據有效,則創建響應報文
發送響應報文:當響應報文構建完成之后,發送響應報文給客戶端
記錄日志:發送響應報文的同時記錄日志信息
新鮮度監測的方法:
1、過期日期或有效性:
HTTP/1.0:使用Expries定義緩存過期的絕對時間
例如:Expires:Sat, 18 Jul 2015 03:41:04 GMT
HTTP/1.1: 利用Cache-Control定義文檔的最大使用期限,是相對時長
例如:Cache-Control: max-age 1d: 緩存有效期為1天
2、服務器再驗證:向服務器驗證數據是否發送改變
1)如果原始內容沒有改變,則服務器僅響應首部,不附帶body部分,響應碼為304;
2)如果原始內容發生改變,則正常響應,響應碼為200;
3)若果原始內容已不存在,則響應碼為404,此時緩存也應該清除緩存項;
3、條件式請求首部:
If-Modified-Since: 從指定時間之后的時間內,原始內容是否發生啦的改變
If-None-Match: 每個版本的文檔都有一個標簽ETag,當內容發生改變此ETag也會發送更改
控制緩存能力:
服務器端:Cache-Control
no-store: 不準緩存;
no-cache: 可以緩存,但在提供給請求者之前必須做新鮮度監測;
must-revalidate:可以緩存,但在提供給請求者之前必須做新鮮度監測;
max-age: 最大使用期限
Expires:過期的絕對時間
客戶端新鮮度限制:Cache-Control
max-stale: 最大失效時間
max-stale=<s>:指定最大失效時間
min-fresh=<s>:最短有效時間
max-age=<s>:最大有效時間
注意:含有private、authentication、cookie等信息最好不要緩存;
varnish介紹:
varnish以一款開源的、高性能的http反向代理的緩存軟件;
varnishi有兩類線程:
management:
1)讀入配置文件
2)調用合適類型的存儲(有malloc內存、tmp、persisten三種存儲類型)
3)創建/讀入相應大小的緩存文件
4)初始化管理結構體空間
5)fork并監控child進程
child/cache:
1)將打開的存儲文件映射進內存空間
2)創建并初始化空閑的結構體空間
varnish有九個狀態引擎,如下圖所示:
varnish配置文件介紹:
1)后端節點定義:
backend name { } ;
代理緩存:子進程定義
sub+狀態引擎 { };
引擎之間都有相關性,前一個引擎通過return(x)定義退出狀態,進而決定繼續處理下一個引擎;
2)vcl:
vcl是基于“域”的簡單編程語言;支持算術運算和邏輯運算,支持正則表達式,支持使用set、unset自定義變量或取消變量,支持if條件判斷,有內置的函數和變量;
配置語法:
①注釋://單行注釋,/*…..*/多行注釋
②sub $name 定義函數
③不支持循環
④支持終止語句return,沒有返回值
⑤域專用
⑥操作符:=(賦值)、==(比較)、~(正則)、!(取反)、&&(和)、||(或者)
3)vcl的內置函數
regsub(str,regexp,sub):以regexp為模式匹配str,將匹配到的第一個替換為sub
regsuball(str,regexp,sub):以regexp為模式匹配str,將所有匹配到的都替換為sub
hash_date(str):做hash計算
purge:從緩存中挑出某對象并刪除
return(x): 定義退出狀態
4)內置變量:
req內置變量 | resp的內置變量 | bereq內置變量: |
req.request: 請求方法 req.url: 請求的url req.http.HEARDER: 請求的具體首部 req.restarts: 請求報文重啟次數 server.ip: varnish服務器的ip地址 server.port: varnish服務器的端口 clinet.ip: 客戶端ip server.hostname: varnishi服務器名稱 req.backend: 請求時交由具體后端服務器 |
resp.proto: 響應版本協議 resp.status: 響應碼 resp.http.HEARDER:響應首部 |
bereq.url: 請求的url bereq.request: 請求方法 bereq.http.HEADER: 請求的首部 bereq.connect_timeout: 連接超時時長 bereq.proto:向后端發起請求時使用的協議 |
beresp內置變量 | obj內置變量: | 相關說明: |
beresp.status: 后端響應碼 beresp.http.HEADER: 響應首部 beresp.ttl: 響應ttl值,緩存時長 beresp.backend.ip: 后端主機ip beresp.backend.port: 后端端口 beresp.backend.name: 后端主機名 |
obj.status: 緩存對象響應碼 obj.ttl: 緩存時長 obj.hits: 緩存是否命中 obj.http.HEARDER: 命中狀態首部 |
req: 是客戶端發起的request resp:是varnishi響應的response bereq:是varnish向后端服務器發起請求 beresp:是后端服務器響應給varnish obj:是緩存對象即將進入緩存 |
varnish配置:
1)安裝
[root@varnish ~]# yum -y install varnish
2)配置varnish服務配置文件
[root@varnish ~]# vim /etc/sysconfig/varnish # Configuration file for varnish NFILES=131072 \\定義可以打開的最大文件數量 MEMLOCK=82000 \\定義log信息使用多大的內存空間,注意varnish log信息保存在內存中 NPROCS="unlimited" \\ 每個線程響應多少請求 # DAEMON_COREFILE_LIMIT="unlimited" \\ 保持默認即可 RELOAD_VCL=1 \\保持默認即可 # This file contains 4 alternatives, please use only one. \\有四種配置方法: ## Alternative 1, Minimal configuration, no VCL \\方法一 # # Listen on port 6081, administration on localhost:6082, and forward to # content server on localhost:8080. Use a fixed-size cache file. # #DAEMON_OPTS="-a :6081 \ # -T localhost:6082 \ # -b localhost:8080 \ # -u varnish -g varnish \ # -s file,/var/lib/varnish/varnish_storage.bin,1G" ## Alternative 2, Configuration with VCL \\方法二 # # Listen on port 6081, administration on localhost:6082, and forward to # one content server selected by the vcl file, based on the request. Use a # fixed-size cache file. # #DAEMON_OPTS="-a :6081 \ # -T localhost:6082 \ # -f /etc/varnish/default.vcl \ # -u varnish -g varnish \ # -S /etc/varnish/secret \ # -s file,/var/lib/varnish/varnish_storage.bin,1G" ## Alternative 3, Advanced configuration \\方法三 # # See varnishd(1) for more information. # # # Main configuration file. You probably want to change it :) VARNISH_VCL_CONF=/etc/varnish/test.vcl \\定義主配置文件 # # # Default address and port to bind to # # Blank address means all IPv4 and IPv6 interfaces, otherwise specify # # a host name, an IPv4 dotted quad, or an IPv6 address in brackets. # VARNISH_LISTEN_ADDRESS= VARNISH_LISTEN_PORT=80 \\定義監聽端口,默認為6081 # # # Telnet admin interface listen address and port VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 \\管理varnish監聽地址 VARNISH_ADMIN_LISTEN_PORT=6082 \\管理varnish的監聽端口 # # # Shared secret file for admin interface VARNISH_SECRET_FILE=/etc/varnish/secret \\varnish加密文件 # # # The minimum number of worker threads to start VARNISH_MIN_THREADS=50 \\varnish最小進程數 # # # The Maximum number of worker threads to start VARNISH_MAX_THREADS=1000 \\varnish最大進程數 # # # Idle timeout for worker threads VARNISH_THREAD_TIMEOUT=120 \\varnish工作進程超時時長 # # # Cache file location VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin \\緩存文件存儲類型,可以定義使用內存存儲 # # # Cache file size: in bytes, optionally using k / M / G / T suffix, # # or in percentage of available disk space using the % suffix. VARNISH_STORAGE_SIZE=1G \\定義存儲空間大小 # # # Backend storage specification VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" \\定義存儲屬性 # # # Default TTL used when the backend does not specify one VARNISH_TTL=120 \\緩存時長 # # # DAEMON_OPTS is used by the init script. If you add or remove options, make # # sure you update this section, too. DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ -f ${VARNISH_VCL_CONF} \ -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ -t ${VARNISH_TTL} \ -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \ -u varnish -g varnish \ -S ${VARNISH_SECRET_FILE} \ -s ${VARNISH_STORAGE}" # ## Alternative 4, Do It Yourself. See varnishd(1) for more information. \\方法四 # # DAEMON_OPTS="
3)配置varnish主配置文件,添加響應報文首部
[root@varnish sysconfig]# cd /etc/varnish/ [root@varnish varnish]# cp default.vcl test.vcl [root@varnish varnish]# vim test.vcl backend default { \\定義后端主 .host = "172.16.2.14"; \\后端主機地址 .port = "80"; \\后端主機監聽端口 } sub vcl_deliver { \\在vcl_deliver狀態引擎中定義 if (obj.hits > 0) { \\如果緩存命中次數大于0 set resp.http.X-Cache = "HIT"; \\添加響應首部X-Cache;設置值為HIT; } else { set resp.http.X-Cache = "MISS"; \\ 添加響應首部X-Cache;設置值為MISS; } return (deliver); \\定義返回狀態 }
應用此配置:
[root@varnish ~]# /etc/init.d/varnish start root@varnish ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 \\進入varnish管理界面 200 ----------------------------- Varnish Cache CLI 1.0 ----------------------------- Linux,2.6.32-431.el6.x86_64,x86_64,-sfile,-smalloc,-hcritbit varnish-3.0.7 revision f544cd8 Type 'help' for command list. Type 'quit' to close CLI session. varnish> vcl.load t1 /etc/varnish/test.vcl \\載入配置文件 200 VCL compiled. varnish> vcl.use t1 \\使用配置文件 200
測試1:
測試2:
4)設置緩存時長:
sub vcl_fetch { \\在vcl.fetch狀態引擎定義 if (bereq.http.Set-Cookie) { \\如果varnish請求有cookie信息 unset bereq.http.Set-Cookie; \\將cookie信息去掉 set beresp.ttl= 120s; \\設置緩存時長為120s } return (deliver); \\定義返回狀態 }
應用此配置:
arnish> vcl.load t2 /etc/varnish/test.vcl 200 VCL compiled. varnish> vcl.use t2 200
訪問測試:
5)利用varnish自帶著函數(purge)清空緩存
定義訪問權限: acl clean { \\定義acl名稱 "127.0.0.1"; \\允許訪問地址 "172.16.2.0"/24; \\允許訪問的網段,注意網絡長度寫在引號外面; } sub vcl_recv { \\在vcl_recv狀態引擎定義請求信息 if (req.request == "PURGE") { \\如果請求方式為"PURGE" if (!client.ip ~ clean) { \\如果clinet端地址不是來自定義的合法(clean)ip error 405 "Not allowed"; \\返回錯誤信息,告知不能訪問 } return (lookup); \\定義返回狀態; } } sub vcl_hit { \\在vcl_hit狀態引擎中定義策略 if (req.request == "PURGE") { \\如果緩存命中且請求方法為"PURGE" purge; \\執行內置函數purge error 200 "Purged"; \\返回信息 } } sub vcl_miss { \\在vcl_miss中定義策略 if (req.request == "PURGE") { \\如果請求方法"PURGE"沒有命中 error 200 "no cache"; \\則返回沒有緩存 } }
應用此配置文件:
varnish> vcl.load t3 /etc/varnish/test.vcl 200 VCL compiled. varnish> vcl.use t3 200
測試:
正常訪問測試: [root@varnish varnish]# curl -I http://172.16.2.12 HTTP/1.1 200 OK Server: Apache/2.2.15 (CentOS) Last-Modified: Thu, 02 Jul 2015 10:21:42 GMT ETag: "23fd60-16-519e1ce44df0b" Content-Type: text/html; charset=UTF-8 Content-Length: 22 Accept-Ranges: bytes Date: Thu, 02 Jul 2015 12:20:52 GMT X-Varnish: 2144388607 2144388575 Age: 22 Via: 1.1 varnish Connection: keep-alive X-Cache: HIT 利用PURGE方式訪問: [root@varnish varnish]# curl -I -X PURGE http://172.16.2.12 HTTP/1.1 200 Purged \\返回成功信息 Server: Varnish Content-Type: text/html; charset=utf-8 Retry-After: 5 Content-Length: 380 Accept-Ranges: bytes Date: Thu, 02 Jul 2015 12:21:31 GMT X-Varnish: 2144388608 Age: 0 \\保存時長為0 Via: 1.1 varnish Connection: close X-Cache: MISS \\訪問沒有被緩存命中
相關連接:
https://fr.wikipedia.org/wiki/Cache-Control
https://www.varnish-cache.org/docs/3.0/
原創文章,作者:馬行空,如若轉載,請注明出處:http://www.www58058.com/6200