http cache的實現方式有兩種: Squid、Varnish;一般被稱爲緩存服務器
Squid:支持正向和反向代理、是一款重量級的緩存服務器,在高負載的情況下,性能非常的穩定
Varnish:支持反向代理;相比於Squid是非常輕量級的緩存服務器,在高負載情況下,性能較差,沒有Squid穩定;一般被稱爲http加速器;
Varnish的特點:
一、組成部分
Management:作爲主控進程;提供命令行接口、管理各種子進程、初始化,加載文件等等
Child/Cache:緩存管理、日誌數據統計、接受用戶請求、對所有緩存做有效性在驗證,清理
VCL:Varnish的配置語言;緩存控制機制,調用C編譯器,生成二進制程序,讓子進程加載
二、工作模式:
1、請求的資源可緩存:
(1)當客戶端請求的資源命中了Varnish緩存且緩存未過期時,將直接響應給客戶端;
(2)Varnish作爲一臺反向代理緩存服務器,當客戶端請求的資源未命中Varnish緩存時,Varnish會扮演客戶端角色去後端主機請求數據,將請求到的資源先緩存到本地,隨後再將請求到的資源發送給客戶端。
(3)當客戶端請求的資源命中了Varnish緩存,但是Varnish上的緩存已過期時,則Varnish會去後端主機確認請求原始資源是否更新;如果未更新,則後端主機僅響應資源首部給Varnish,隨後Varnish再將響應資源發送給客戶端;如果請求原始資源更新,則後端主機將會響應新的資源給Varnish,Varnish將響應的資源緩存在本地之後再響應給客戶端;如果請求的資源後端主機已刪除,則Varnish中的緩存也會被刪除,響應給客戶端404頁面
2、請求的資源不可緩存:
(1)當客戶端請求的資源爲不可緩存時,Varnish會直接去後端主機取得相應內容直接返回給客戶端;而不是先緩存到本地再響應給客戶端
衡量一個緩存的有效性:
緩存的命中率:
文檔命中率:也稱爲資源命中率,從文檔的個數進行衡量
字節命中率:從內容的大小進行衡量
緩存的生命週期:
緩存項過期:惰性清理
緩存空間用盡:使用LRU算法(最近最少使用算法)
注意:當一個緩存項過期時並不會真正從內存中青旅,只是標記爲失效,而不是把它刪除;當內存空間用盡時,纔會真正的刪除緩存項
三、緩存模式:
(1)file:緩存再磁盤的文件中,自行管理的關鍵系統
(2)malloc:內存緩存;使用malloc()庫調用,在varnish啓動時向內存申請指定大小的空間進行緩存
(3)presistent:存儲在磁盤上;
四、緩存新鮮度檢測機制
有效性在驗證:
如果原始內容發生改變,則僅響應首部(不用到body部分;響應碼爲304(Not Modified)
如果原始內容發生了改變,則正常響應給客戶端,響應碼爲200
如果原始內容消失,則響應404,此時緩存中的緩存項(object)也應該被刪除
條件式請求首部:
If-Modified_Since:基於原始內容的最近一個修改的時間戳進行驗證
If-Ummodified_since:如果緩存發生了改變,響應304
If-Match:基於請求內容的匹配做驗證
If-None_match:基於Etag比較進行內容驗證
五、緩存控制機制
過期日期:
HTTP/1.0 Expires:給與的是絕對時長
例如:Expires:Thu, 04 Jun 2015 23:38:18 GMT
HTTP/1.1 Cache-Control: max-age:給與的是相對時長,從接受到相應報文開始
例如:Cache-Control:max-age=700
六、VCL相關的狀態引擎
vcl_recv:接受請求
vcl_hash:
hit:vcl_hit:命中緩存
miss:vcl_miss:未命中緩存
purge:vcl_purge:清除緩存
pipe:vcl_pipe:管道;直接發送給後端主機
pass、hit_for_pass:vcl_pass ##跳過,直接請求後端主機
vcl_backend_fetch:讀取數據
vcl_backend_response:後端主機響應
vcl_backend_error:後端主機響應錯誤碼
vcl_synth:同步
vcl_deliver:響應給客戶端
七、VCL的語法格式
(1)表示註釋://、#、/*……*/
(2)定義子例程
(3)不支持循環、支持條件判斷
(4)具有內建變量
(5)使用終止語句return,沒有返回值
(6)支持操作符:=、==、!=、&&、||
八、VCl內建變量
req.*:只匹配客戶端發來的請求
req.http.*:匹配http請求報文的任何首部
bereq.*:由varnish向後端主機發出http請求
beresp.*:由後端主機發來http的響應報文首部
resp.*:由varnish響應給客戶端的http的響應報文
obj.*:存儲在緩存空間中的緩存的對應屬性
常用的變量:
berep:varnish向後端主機請求資源
bereq.request:請求方法(向後端主機發送請求報文)
bereq.url:請求的url
bereq.proto:請求協議
bereq.backend:指明要調用的後端主機是那個
beresp:後端主機向varnish響應資源
beresp.proto:響應協議
beresp.status:響應的狀態碼
beresp.reason:響應原因
beresp.backend.name:後端主機名稱
beresp.ttl:後端主機請求中的內容的餘下的生存時長
obj.hits:此對象從緩存中命中的次數
obj.ttl:對象的ttl值;也被稱爲緩存時長
準備環境:CentOS 7
Varnish服務器 | IP:172.18.42.200 |
後端主機1:提供httpd服務 | IP:172.18.42.201 |
後端主機2:提供httpd服務 | IP:172.18.42.202 |
一、Varnish服務器配置
1、安裝varnish
[root@node0 ~]# yum install varnish [root@node0 ~]# ll /etc/varnish/ total 20 -rw-r--r-- 1 root root 1155 May 20 17:07 default.vcl ##配置Varnish緩存策略 -rw-r--r-- 1 root root 1224 May 20 11:10 default.vcl.wtc -rw------- 1 root root 37 May 20 11:09 secret -rw-r--r-- 1 root root 1200 Mar 16 2015 varnish.params ##配置緩存機制 -rw-r--r-- 1 root root 1200 May 20 11:12 varnish.params.bak
2、更改varnish的緩存模式:
[root@node0 varnish]# vim varnish.params #VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G" ##默認的緩存機制 VARNISH_STORAGE="malloc,1G" ##更改緩存爲malloc模式
3、定義後端主機
[root@node0 varnish]# vim default.vcl ## backend default { .host = "172.18.42.202"; ##後端主機1 .port = "80"; ##web80端口 }
二、配置後端主機
1、後端主機1安裝httpd、php
[root@node1 ~]# yum install httpd -y [root@node1 html]# systemctl start httpd.service
2、後端主機2安裝httpd
[root@node2 ~]# yum install nginx [root@node2 nginx]# nginx
三、配置default.vcl緩存策略
1、當請求資源可緩存時,查看緩存是否命中
sub vcl_deliver { if (obj.hits>0) { set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; } } ##如果請求的資源未命中則顯示MISS、命中則顯示HIT
第一次請求:
第二次請求:命中了varnish緩存
2、強制對某些資源不檢查緩存
[root@node2 ~]# mkdir /web/lweim/wtc ##在後端主機新目錄“wtc” [root@node2 ~]# vim /web/lweim/wtc/index.html sub vcl_recv { if (req.url ~ "(?i)^/wtc") { return(pass); } } ##當請求的url當中有“wtc”時,則不會去命中緩存,而是直接由varnish請求後端主機
第一次請求:
第二次請求:
3、定義多臺後端主機
backend web2 { .host = "172.18.42.202"; .port = "80"; } backend web1 { .host = "172.18.42.201"; .port = "80"; } sub vcl_recv { if (req.url ~ "(?i)\.php$") { set req.backend_hint = web1; ##當請求url中有php時,則是後端主機web1來響應 return(pass); } else { set req.backend_hint = web2; ##url中沒有php的請求都由後端主機web2來響應 return(pass); } }
第一次請求靜態資源
第二次請求php
4、實現負載均衡
import directors; ##定義一個主機組 backend web1 { ##定義第一個後端服務器 .host = "172.18.42.201"; .port = "80"; } backend web2 { ##定義第二個後端服務器 .host = "172.18.42.202"; .port = "80"; } sub vcl_init { ##定義一個服務器組 new web = directors.round_robin(); web.add_backend(web1); web.add_backend(web2); } sub vcl_recv { if (req.url ~ "(?i)^/wtc") { set req.backend_hint = web.backend(); return(pass); ##直接請求後端主機服務器 } }
第一次請求:
第二次請求:
5、對後端主機做健康檢測
backend web1 { .host = "172.18.42.201"; .port = "80"; .probe = { .url = "/"; .interval = 1s; ##每隔多長時間檢測一次 .window = 8; ##指定後端主機要檢測多少次 .threshold 5; ##指定至少要有幾次是檢測成功的 .timeout 2s; ##指定檢測時間的超時時長;默認爲2s }
6、修改varnish運行時命令參數
[root@node0 varnish]# varnishstat MAIN.pools 4 0.00 . 4.00 [root@node0 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 param.set thread_pools 2 200 ##響應碼爲200即爲修改成功 [root@node0 varnish]# varnishstat MAIN.pools 2 0.00 . 2.00
7、查看varnish的工作狀態及其相關信息
[root@node0 varnish]# varnishstat