(1).Varnish概述
Varnish是一款高性能的開源HTTP加速器,可以有效降低web服務器的負載,提升訪問速度。根據官方的說法,Varnish是一個cache型的HTTP反向代理。
Varnish的作者Poul-Henning Kamp是FreeBSD的內核開發者之一,他認為現在的計算機比起1975年已經復雜許多。在1975年時,儲存媒介只有兩種:內存與硬盤。但現在計算 機系統的內存除了主存外,還包括了cpu內的L1、L2,甚至有L3快取。硬盤上也有自己的快取裝置,因此squid cache自行處理物件替換的架構不可能得知這些情況而做到最佳化,但操作系統可以得知這些情況,所以這部份的工作應該交給操作系統處理,這就是Varnish cache設計架構。
當把Varnish部署上之后,web請求的處理過程會有一些變化。客戶端的請求將首先被Varnish接受。Varnish將分析接收的請求,並將其轉發到后端的web服務器上。后端的web服務器對請求進行常規的處理,並將依次將處理結果返回給Varnish。
但Varnish的功能並非僅限於此。Varnish的核心功能是將后端web服務器返回的結果緩存起來,如果發現后續有相同的請求,Varnish將不會將這個請求轉發到web服務器,而是返回緩存中的結果。這將有效的降低web服務器的負載,提升響應速度,並且每秒可以響應更多的請求。Varnish速度很快的另一個主要原因是其緩存全部都是放在內存里的,這比放在磁盤上要快的多。諸如此類的優化措施使得Varnish的相應速度超乎想象。但考慮到實際的系統中內存一般是有限的,所以需要手工配置一下緩存的空間限額,同時避免緩存重復的內容。
處理緩存的順序:接受到請求 –- 分析請求(分析你的URL,分析你的首部) -- hash計算 -- 查找緩存 -- 新鮮度檢測 --- 訪問源 --- 緩存 – 建立響應報文 – 響應並記錄日志。
監聽端口6081,管理進程management,子進程child/cache,官網https://www.varnish-cache.org/。
(2).Varnish特點與Squid的對比
Varnish特點:
基於內存緩存,重啟后數據將消失。
利用虛擬內存方式,I/O性能好。
支持設置0~60秒內的精確緩存時間。
VCL(全稱varnish config language,這是Varnish自己領域的特定語言)配置管理比較靈活。
32位機器上緩存文件大小為最大2G。
具有強大的管理功能,例如top,stat,admin,list等。
狀態機設計巧妙,結構清晰。
利用二叉堆管理緩存文件,達到積極刪除目的。
Varnish與Squid的對比:
相同點:
都是一個反向代理服務器;
都是開源軟件;
Varnish相較於Squid的優點:
Varnish的穩定性很高,兩者在完成相同負荷的工作時,Squid服務器發生故障的幾率要高於Varnish,因為使用Squid要經常重啟;
Varnish訪問速度更快,Varnish采用了“Visual Page Cache”技術,所有緩存數據都直接從內存讀取,而Squid是從硬盤讀取,因此Varnish在訪問速度方面會更快;
Varnish可以支持更多的並發連接,因為Varnish的TCP連接釋放要比Squid快,所以在高並發連接情況下可以支持更多TCP連接;
Varnish可以通過管理端口,使用正則表達式批量的清除部分緩存,而Squid是做不到的;
Squid屬於是單進程使用單核CPU,但Varnish是通過fork形式打開多進程來做處理,所以是合理的使用所有核來處理相應的請求;
Varnish相較於Squid的缺點:
Varnish在高並發狀態下CPU、I/O和內存等資源開銷都高於Squid;
Varnish進程一旦Hang(掛起)、Crash(崩潰)或者重啟,緩存數據都會從內存中完全釋放,此時所有請求都會發送到后端服務器,在高並發情況下,會給后端服務器造成很大壓力;
在Varnish使用中如果單個url的請求通過HA/F5(負載均衡)每次請求不同的varnish服務器中,被請求varnish服務器都會被穿透到后端,而且同樣的請求會在多台服務器上緩存,也會造成Varnish的緩存的資源浪費,也會造成性能下降。
(3).安裝Varnish
1)安裝環境
youxi1 192.168.1.6 源碼包安裝
youxi2 192.168.1.7 yum安裝實例、Web后端
youxi3 192.168.1.8 Web后端
2)安裝
youxi1上源碼安裝varnish6.2.0(建議使用該安裝方式)
//安裝依賴包 [root@youxi1 ~]# yum -y install make autoconf automake libedit-devel libtool ncurses-devel pcre-devel pkgconfig python3-docutils python3-sphinx graphviz [root@youxi1 ~]# tar xf varnish-6.2.0.tgz -C /usr/local/src/ [root@youxi1 ~]# cd /usr/local/src/varnish-6.2.0/ [root@youxi1 varnish-6.2.0]# ./configure --prefix=/usr/local/varnish [root@youxi1 varnish-6.2.0]# make && make install [root@youxi1 varnish-6.2.0]# echo $? 0 [root@youxi1 varnish-6.2.0]# cd /usr/local/varnish/ [root@youxi1 varnish]# mkdir etc [root@youxi1 varnish]# cp share/doc/varnish/example.vcl etc/default.vcl //生成vcl配置文件
youxi2上yum安裝varnish(簡單了解)
[root@youxi2 ~]# vim /etc/yum.repos.d/varnishcache_varnish62.repo [varnishcache_varnish62] name=varnishcache_varnish62 baseurl=https://packagecloud.io/varnishcache/varnish62/el/7/$basearch repo_gpgcheck=1 gpgcheck=0 enabled=1 gpgkey=https://packagecloud.io/varnishcache/varnish62/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 [varnishcache_varnish62-source] name=varnishcache_varnish62-source baseurl=https://packagecloud.io/varnishcache/varnish62/el/7/SRPMS repo_gpgcheck=1 gpgcheck=0 enabled=1 gpgkey=https://packagecloud.io/varnishcache/varnish62/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 [root@youxi2 ~]# yum clean all && yum list //清除yum緩存,並重新生成 [root@youxi2 ~]# yum -y install varnish
3)配置youxi1上的Varnish緩存youxi2上的網站
youxi1修改vcl配置文件
[root@youxi1 ~]# vim /usr/local/varnish/etc/default.vcl backend default { //第16~19行 .host = "192.168.1.7"; //修改Web后端網站的IP地址 .port = "80"; //修改Web后端網站的端口號 } sub vcl_deliver { //第35行開始,緩存命中情況 if (obj.hits > 0) { set resp.http.X-Cache = "HIT cache"; } else { set resp.http.X-Cache = "Miss cache"; } }
配置環境變量
[root@youxi1 ~]# vim /etc/profile.d/varnish.sh export PATH=/usr/local/varnish/bin:/usr/local/varnish/sbin:$PATH [root@youxi1 ~]# . /etc/profile.d/varnish.sh //加載環境變量
啟動Varnish
[root@youxi1 ~]# varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54 Debug: Platform: Linux,3.10.0-957.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit Debug: Child (18374) Started [root@youxi1 ~]# ps aux | grep varnishd root 18364 0.0 0.0 22188 1532 ? SLs 22:59 0:00 varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl root 18374 1.8 4.4 1029912 89468 ? SLl 22:59 0:00 varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl root 18593 0.0 0.0 112724 992 pts/0 S+ 23:00 0:00 grep --color=auto varnishd [root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload success success
youxi2上搭建測試Web后端
[root@youxi2 ~]# yum -y install httpd [root@youxi2 ~]# echo youxi2 > /var/www/html/index.html [root@youxi2 ~]# systemctl start httpd [root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload success success
最后測試
然后使用curl命令做緩存命中測試,-I選項只取http響應頭的信息,不取網頁內容
[root@youxi1 ~]# curl -I 192.168.1.7 //這是直接訪問youxi2 HTTP/1.1 200 OK Date: Sun, 04 Aug 2019 15:14:16 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT ETag: "7-58f4bccfca680" Accept-Ranges: bytes Content-Length: 7 Content-Type: text/html; charset=UTF-8 [root@youxi1 ~]# curl -I 192.168.1.6 //第一次訪問youxi1 HTTP/1.1 200 OK Date: Sun, 04 Aug 2019 15:14:19 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT ETag: "7-58f4bccfca680" Content-Length: 7 Content-Type: text/html; charset=UTF-8 X-Varnish: 12 Age: 0 Via: 1.1 varnish (Varnish/6.2) X-Cache: Miss cache //這次是未命中 Accept-Ranges: bytes Connection: keep-alive [root@youxi1 ~]# curl -I 192.168.1.6 //第二次訪問youxi1 HTTP/1.1 200 OK Date: Sun, 04 Aug 2019 15:16:39 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT ETag: "7-58f4bccfca680" Content-Length: 7 Content-Type: text/html; charset=UTF-8 X-Varnish: 15 32773 Age: 2 Via: 1.1 varnish (Varnish/6.2) X-Cache: HIT cache //這一次命中緩存了 Accept-Ranges: bytes Connection: keep-alive
緩存時間較短,可以嘗試配置httpd的長鏈接功能(配置文件中設置KeepAlive On,然后重啟)
4)配置youxi1上的Varnish緩存多個網站(youxi1,youxi2)
youxi1修改vcl配置文件
[root@youxi1 ~]# vim /usr/local/varnish/etc/default.vcl backend youxi2 { //原本的default改為主機名 .host = "192.168.1.7"; .port = "80"; } backend youxi3 { //多創建一個 .host = "192.168.1.8"; .port = "80"; } sub vcl_recv { //在vcl_recv里添加 if (req.http.host ~ "^(www.)?you.cn"){ //正則匹配 set req.http.host = "www.you.cn"; set req.backend_hint = youxi2; //指向youxi2后端 } elsif (req.http.host ~ "^bbs.you.cn") { //正則匹配 set req.backend_hint = youxi3; //指向youxi3后端 } }
重啟Varnish,需要使用killall命令,安裝psmisc包
[root@youxi1 ~]# yum -y install psmisc [root@youxi1 ~]# killall varnishd [root@youxi1 ~]# varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54 Debug: Platform: Linux,3.10.0-957.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit Debug: Child (19017) Started
youxi3上搭建測試Web后端
[root@youxi3 ~]# yum -y install httpd [root@youxi3 ~]# echo youxi3 > /var/www/html/index.html [root@youxi3 ~]# systemctl start httpd [root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload success success
youxi1上編輯/etc/hosts文件
[root@youxi1 ~]# vim /etc/hosts 192.168.1.6 www.you.cn 192.168.1.6 bbs.you.cn
測試
[root@youxi1 ~]# curl www.you.cn //第一次訪問,可以看到是指向的是youxi2 youxi2 [root@youxi1 ~]# curl -I www.you.cn //第二次訪問,只取http響應頭,可以看到擊中緩存 HTTP/1.1 200 OK Date: Sun, 04 Aug 2019 16:09:19 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT ETag: "7-58f4bccfca680" Content-Length: 7 Content-Type: text/html; charset=UTF-8 X-Varnish: 5 32772 Age: 12 Via: 1.1 varnish (Varnish/6.2) X-Cache: HIT cache //擊中緩存 Accept-Ranges: bytes Connection: keep-alive [root@youxi1 ~]# curl bbs.you.cn //第一次訪問,可以看到指向的是youxi3 youxi3 [root@youxi1 ~]# curl -I bbs.you.cn //第二次訪問,只取http響應頭,可以看到擊中緩存 HTTP/1.1 200 OK Date: Sun, 04 Aug 2019 16:09:49 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sun, 04 Aug 2019 16:07:43 GMT ETag: "7-58f4ccaa0e583" Content-Length: 7 Content-Type: text/html; charset=UTF-8 X-Varnish: 32774 8 Age: 6 Via: 1.1 varnish (Varnish/6.2) X-Cache: HIT cache Accept-Ranges: bytes Connection: keep-alive
(4).擴展
1)為什么要使用緩存:
訪問過的數據會再次被訪問到,熱數據多次訪問。
一個數據被訪問過會后,離他最近的或者較近的客戶端再次訪問。
2)既然要緩存, 需要讀取的高速,最好的方法,就是全部放到內存。
常見的內存數據庫,memcached,redis,HANA。
但是對於頁面,全放放到內存,太不現實,內存+高速緩存盤的方式來存儲緩存。
Key-value,key存放於內存,value存放磁盤。
3)一種數據形式:key value
Key:對訪問路徑,URL,特定的特征,進行hash計算得出的結果,這種key存放於內存中。
Value:頁體,我們用戶真正得到的內容,一般存放在高速硬盤。
4)凡是與緩存緩存相關的,離不開兩體:內存,高速硬盤。
5)常見的術語:
命中:能從緩存取出數據,如果是一台web站點,那么你的緩存服務器將是一台最前端服務器。
命中率:命中次數/(命中次數+非命中次數)。
熱數據:經常被訪問的數據。
內存緩存空間,磁盤緩存空間。
清理:定期清理,LRU(不常用的,最老的一類數據將其刪除),定期更新(purge)。
緩存對象:用戶信息,cookies,交易信息,頁面內存,統統理解為object。
參考:https://www.oschina.net/translate/speed-your-web-site-varnish?print