一.Varnish簡述html
varnish是一款高性能且開源的方向代理服務器和HTTP加速器,它的開發者poul-Henning kamp是FreeBSD 核心的開發人員之一。varnish採用全新的軟件體系機構,和如今的硬件體系配合緊密,varnish是一個輕量級的cache和反向代理軟件。先進的設計理念和成熟的設計框架是varnish的主要特色。挪威最大的在線報紙 Verdens Gang 使用3臺Varnish服務器 代替了原來的12臺Squid服務器,結果性能比之前更好。web
二.varnish的特色算法
一、基於內存進行緩存,重啓後數據將消失。apache
二、利用虛擬內存方式,I\O性能好。vim
三、支持設置0~60秒的精確緩存時間。後端
四、VCL配置管理比較靈活。瀏覽器
五、具備強大的管理功能,例如top、stat、admin、list 等。緩存
六、狀態機設計巧妙、結構清晰。服務器
七、利用二叉堆管理緩存文件,可達到積極刪除目的。網絡
三.varnish處理緩存的過程
(1)Receive 狀態,也就是請求處理的入口狀態,根據 VCL 規則判斷該請求應該是 Pass 或 Pipe,或者進入 Lookup(本地查詢)。
(2)Lookup 狀態,進入此狀態後,會在 hash 表中查找數據,若找到,則進入 Hit 狀態,不然進 入 miss 狀態。
(3)Pass 狀態,在此狀態下,會進入後端請求,即進入 fetch 狀態。
(4)Fetch 狀態,在 Fetch 狀態下,對請求進行後端的獲取,發送請求,得到數據,並進行本地的存儲。
(5)Deliver 狀態, 將獲取到的數據發送給客戶端,而後完成本次請求。
四.varnih的使用
實驗所需環境:三臺配置好網絡的虛擬機,分別設置主機名爲server一、server二、server3
1.安裝服務
在server1中打開官網,下載rpm包進行安裝,在這裏我使用的是3.05版本,最新版本下載地址:
http://varnish-cache.org/releases/
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
2.配置服務
(1)編輯系統資源配置文件,具體設定的參數須要根據內核及硬件設備狀況進行調整
vim /etc/security/limits.conf 寫入: varnish - nofile 6555 ##用戶能夠打開的最大文件描述符數量,默認爲1024,這裏的數值會限制tcp鏈接 varnish - memlock 82000 ##用戶最大可鎖定內存空間 varnish - nproc unlimited ##子線程數
注:-表示同時設置soft值和hard值,soft爲軟限制,超過該值會警告但依然能夠超過,hard爲硬限制,超過會直接報錯沒法超過
(2)編輯服務配置文件
vim /etc/sysconfig/varnish VARNISH_LISTEN_PORT=80 ##設定varnish的監聽端口爲80
vim /etc/varnish/default.vcl ##配置一個後端服務器,緩存配置 backend default { .host = "172.25.3.2"; ##host指定要緩存的後端服務器地址 .port = "80"; }
3.啓動服務
/etc/init.d/varnish start
4.測試
在server2中配置好http服務,並編寫一個網頁文件index.html,內容任意
在真機中打開瀏覽器輸入server1的IP地址,能夠看到server2中的發佈頁面內容
5.查看緩存命中狀況
在varnish服務器上
vim default.vcl 12 sub vcl_deliver { 13 if (obj.hits > 0) { 14 set resp.http.X-Cache = "HIT from westos cache"; #命中顯示 15 } 16 else { 17 set resp.http.X-Cache = "MISS from westos cache"; ##沒命中顯示 18 } 19 return (deliver); 20 } /etc/init.d/varnish reload #varnish支持熱插拔
6.清除緩存
varnishadm ban.url .*$ ##清除全部
varnishadm ban.url /index.html ##清除 index.html 頁面緩存
varnishadm ban.url /admin/$ 清除 admin 目錄緩存
五.varnish的擴展使用
1多個不一樣域名對應後端服務器
在varnish服務器上
vim default.vc backend web1 { .host = "172.25.3.2"; .port = "80"; } backend web2 { .host = "172.25.3.3"; .port = "80"; } sub vcl_recv { if (req.http.host ~ "^(www.)?westos.org") { #當域名爲以www.westso.org開頭或westos.org時去web1主機緩存 set req.http.host = "www.westos.org"; set req.backend = web1; } elsif (req.http.host ~ "^bbs.westos.org") { #當域名以bbs.westos.org開頭 時去web2主機緩存 set req.backend = web2; } else {error 404 "westos cache"; } } /etc/init.d/varnish reload ###從新加載
2負載均衡
VCL文件中能夠把多個 backends 聚合成一個組,這些組被叫作 director,當組裏一個 backend 掛掉後,能夠選擇另外一個健康的 backend。VCL 有多種 director,不一樣的 director 採用不一樣的算法選擇 backend,主要有如下幾種: ..Random director 會根據所設置的權值(weight)來選擇 backend,.retries 參數表示嘗試找到一個 backend 的最大次數,.weight 參數表示權值 ..Round-robin director 在選擇 backend 時,會採用循環的方式依次選擇。
在server3中配置好http服務器,並創建兩個apache虛擬主機,注意不一樣的虛擬機的發佈目錄不能設置爲同一個目錄
vim /etc/httpd/conf/httpd.conf #配置虛擬主機 NameVirtualHost *:80 ##去掉該行的註釋 <VirtualHost *:80> DocumentRoot /var/www/html ServerName www.westos.org </VirtualHost> <VirtualHost *:80> DocumentRoot /www ServerName bbs.westos.org </VirtualHost>
在server1中
vim default.vc #這裏用round-robin作實驗 backend web1 { .host = "172.25.3.2"; .port = "80"; } backend web2 { .host = "172.25.3.3"; .port = "80"; } director westos round-robin { #創建一個名爲lb的組,實現web1和web2之間的輪詢 { .backend = web1; } { .backend = web2; } } sub vcl_recv { if (req.http.host ~ "^(www.)?westos.org") { #當客戶端搜索符合條件的域名時,用westos組實現輪詢 set req.http.host = "www.westos.org"; set req.backend = westos; return (pass); } elsif (req.http.host ~ "^bbs.westos.org") { set req.backend = web2; } else {error 404 "westos cache"; } } /etc.init.d/varnish reload