使用Varnish為網站加速


(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

   http://book.51cto.com/art/201202/314855.htm

   https://blog.51cto.com/tetop/823904


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM