【前端項目-部署必備】使用Varnish緩存靜態資源文件在內存中

 

前言

        現在都塊2020年了,這年代,隨便建個網站,動不動就是前後端分離的架構。我始終覺得,最合適業務場景的纔是最好的架構。像一些初創公司、沒啥業務量的中小型公司,也跟風前後端分離的架構.....實在是無力吐槽。不過也不能這麼以偏概全、一概而論吧。天曉得人家網站有多大的高併發呢。

        咳咳...有點扯遠了,前後端分離的架構呢,能加快網站響應速度。此時的前端項目,打包上線後,基本都是些靜態資源文件,放在服務器的某個目錄下。

        那麼如何儘可能以最快的速度讓用戶訪問這些靜態資源文件?這時可以用varnish  把靜態資源文件 緩存在內存中,外面再加一層Nginx做負載均衡即可。其實Nginx+memcache的方式也能把靜態資源文件緩存在內存中,但需要寫額外代碼把 靜態資源文件存入memcache。

 

應用場景:

先參考以下兩篇文章:

Varnish、Squid、Ngx_cache性能對比  https://blog.csdn.net/weixin_33979745/article/details/92114264
Varnish VS Nginx測試報告   https://www.cnblogs.com/littlehb/archive/2012/02/11/2346349.html

總結成一句話:在機器資源有限、併發不過3000的中小企業,選用Varnish,否則選用Nginx

個人感覺把:雖然Nginx在低併發量沒發揮出優勢,但是在低併發量時比Varnish的性能差不了多少啊。所以爲了長遠的性能考慮、減少一層中間層的維護,去掉varnish能夠減輕架構複雜度和單點故障的機率,直接用Nginx吧。看到很多資料使用Nginx來做響應和負載均衡,varnish來做緩存。

另外還有一點,在搜索varnish的相關資料時,發現很多的博客網站中關於varnish的資料大部分是11年、12年、13的。

 

應該讓哪些資源被緩存

1:靜態資源中的公共資源緩存

2:靜態資源中的私有資源不緩存

3:動態資源中的公共資源緩存

4:動態資源中的私有資源不緩存

 

varnish優缺點:

 varnish這幾年已經應用比較廣泛且成熟了,與squid相比,它具有以下優點:

1、Varnish採用了“Visual Page Cache”技術,在內存的利用上,Varnish比Squid具有優勢,它避免了Squid頻繁在內存、磁盤中交換文件,訪問速度更快,性能要比Squid高。

2、通過Varnish管理端口,可以使用正則表達式快速、批量地清除部分緩存,這一點是Squid不能具備的

3、穩定性更好,在處理相同的負載情況下,squid發生故障的概率要高於varnish

4、varnish支持併發能力比squid要強,它釋放tcp鏈接要比squid快,所以可以支持更多的鏈接

5、varnish在管理方面比squid強,他可以通過管理端口使用正則來清理部分緩存,squid是做不到的

6、varnish可以起多個進程,而squid是單cpu單核處理的

varnish的缺點:

1、重啓服務後,內存數據清除,需要到後端服務器重新獲取數據

2、超過3000的併發量是,錯誤率開始上升,詳情見本文的參考文檔,有相關的性能測試鏈接

 

官方網站:

http://varnish-cache.org

 

安裝方式:

1、RPM包 :yum install -y varnish

2、編譯安裝(注意:以下操作是在CentOS7上執行的:

 

下面主要介紹下源碼編譯安裝的方式:

首先,需要安裝一些varnish需要依賴包:

yum install -y gcc gcc-c++ make  libtool  ncurses-devel  pcre pcre-devel
#注意:ncurses-devel ,如果這個不裝,varnishstat不會安裝,這個rhel5的一個bug

yum inistall python-docutils ncurses-devel libedit-devel  python-sphinx

# 因爲我的系統中是python2和python3共存的,而且python3是用源碼編譯安裝的。在對vanish 使用 make && make install 後,發現報錯信息:
File "/usr/bin/rst2man"  ModuleNotFoundError: No module named 'docutils'
估計還是python-docutils這個包安裝的不對引起的。

# 然後想起了哪個大神說過來着,yum list 裏面能搜索到可用的安裝包,於是就在yum源裏找相關的包:
yum list|grep python 

# 其中有幾個關鍵的行引起了我的注意:

.........    
python3-docutils-doc.noarch             0.14-1.el7                     epel
.........    
python34-docutils.noarch                0.14-1.el7                     epel
.........
python36-docutils.noarch                0.14-1.el7                     epel
.........

#瞬間明白了:因爲我的系統是python2(默認)和python3共存,yum inistall python-docutils 是pthon2的#版本

yum uninstall python-docutils

# 因爲我是用的python3.7,於是安裝了(最接近的版本):
yum install python36-docutils

重要的事情說三遍:

如果系統中有多個版本的python的,必須、一定、千萬得注意python-docutils的版本問題!!!!!!!

如果系統中有多個版本的python的,必須、一定、千萬得注意python-docutils的版本問題!!!!!!!

如果系統中有多個版本的python的,必須、一定、千萬得注意python-docutils的版本問題!!!!!!!

官方推薦要安裝的依賴有這些:https://varnish-cache.org/docs/6.3/installation/install_source.html

 

如果安裝依賴過程中有報錯信息:Error:  Multilib version problems found,表示可能重複安裝了部分包,
需要移除,查看pcre包是否重複:

rpm -qa | grep pcre 


移除其中一個即可:

yum remove pcre-8.32-15.el7_2.1.i686

其次,下載安裝varnish

cd /home/software
wget  http://varnish-cache.org/_downloads/varnish-6.3.1.tgz
tar -zxvf varnish-6.3.1.tgz
cd varnish-6.3.1

# 檢查系統環境
./autogen.sh

# 配置

./configure --prefix=/usr/local/varnish --enable-debugging-symbols --enable-developer-warnings
#  make && make install後,如果依賴包有問題、版本不對的,特別是(python-docutils包),始終通不過,詳情請見安裝依賴的部分

# 編譯、安裝
make && make install

# 創建軟連接
cd /usr/local/varnish/
ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/
ln -s /usr/local/varnish/bin/* /usr/local/bin       

# 拷貝配置文件模板出來用 
cp /usr/local/varnish/share/doc/varnish/example.vcl /usr/local/varnish/default.vcl

 

 

再次,配置varnish的配置文件:

如何配置、使用、重啓等,官方文檔:https://varnish-cache.org/docs/6.3/tutorial/index.html

例如我的配置是:

/usr/local/varnish/sbin/varnishd  

# 配置下對外訪問的ip和端口
-a 0.0.0.0:9100

# 配置文件中,可以指定靜態資源文件服務器的ip和端口
-f /usr/local/varnish/default.vcl  
# 分配32Mb內存,便於測試
-s malloc,32m

# 如果不想手動輸入這一大堆的命令,可以把上述命名放到到sh文件中:
cd  /usr/local/varnish
vi startup.sh
# 輸入內容:
/usr/local/varnish/sbin/varnishd  -a 0.0.0.0:9100 -f /usr/local/varnish/default.vcl  -s malloc,32m
# 然後保存
:wq
#改成能執行的權限:
chmod -R 777 ./startup.sh

更多參數請使用一下命名進行查閱:

/usr/local/varnish/sbin/varnishd  -help  
或者  
/usr/local/varnish/sbin/varnishd  -?

 

在/usr/local/varnish/default.vcl配置文件中(默認8080端口),需要改下後端配置,修改了成了9000端口,與靜態資源文件的web服務器端口一致

 

然後搭建靜態資源文件的web服務器,如果是靜態資源文件服務端渲染的,則可省略這一步:

yum install -y httpd
 
# yum安裝的httpd後,其默認的靜態資源文件目錄在:/var/www
# 可以嘗試新建頁面
vi /var/www/html/index.html
<h1>hello world from httpd server</h1>

# 另外還可以改httpd的端口(默認是80,我這裏改成9000 用於實驗),
vi /etc/httpd/conf/httpd.conf

# 啓動
systemctl start httpd
 

ok, 靜態資源文件的web服務其已經起來,能訪問了,如下圖:

 

 

最後,啓動varnish,並查看緩存的效果:

cd  /usr/local/varnish
./startup.sh

訪問varnish暴露出來的9100端口:

第一次訪問:

首次請求時,varnish在響應頭中返回的一些參數特徵:

1、請求的“Age”爲0

2、X-Varnish頭信息的後面只有一個數字,就表明varnish在緩存中沒有發現這個請求,這個數字的含義是varnish爲這個請求所做的標記ID

 

 

第二次訪問、第N次訪問、第N次強刷瀏覽器:

 

        需要注意的是varnish返回的響應,varnish會增加三個相應頭信息,分別是“X-Varnish”、“Via”和“Age”。這些頭信息在Varnish的處理過程中非常有用。

X-Varnish頭信息的後面會有一個或兩個數字,如果是一個數字,就表明varnish在緩存中沒有發現這個請求,這個數字的含義是varnish爲這個請求所做的標記ID。如果X-Varnish後是兩個數字,就表明varnish在緩存中命中了這個請求,第一個數字是請求的標識ID,第二個數字是緩存的標識ID。

Via”頭信息表明這個請求將經過一個代理。

Age”頭信息標識出這個請求將被緩存多長時間(單位:秒)。首次請求的“Age”爲0,後續的重複請求將會使Age值增大。如果後續的請求沒有是“Age”增加,那就說明varnish沒有緩存這個響應的結果

這樣,varnish就已經生效啦!

 

一些注意事項:

        varnish的默認配置可以適應多數情況。例如,默認的default_ttl緩存過期時間是120秒。配置文件的詳細解釋可以閱讀varnishd的man page。如果你想改變某些默認設置,一種方式是通過命令行varnishd加上-p參數,這將重啓varnishd,並清空緩存。另外一種方式是使用varnish的管理接口,要使用varnish的管理接口需要以-T參數啓動varnish,這個參數指定了,varnish管理接口的監聽端口。然後使用varnishadm命令連接到varnish的管理接口上,然後實時的查詢varnish的運行參數,或者更改新的參數,這些都不需要重啓varnish。

        想要了解詳細的情況,可以參閱varnishd、varnishadm和varnish-cli的man page。

        一般情況下我們會改變varnish的緩存行爲,定製自己的緩存策略。可以將配置寫入默認的default.vcl文件,VCL(Varnish Configuration Language)是varnish的配置文件的格式,像一種簡單的腳本語言。可以通過vcl的man page來了解詳細的格式,推薦閱讀。

 

參考文檔:

varnish源碼安裝與操作 https://blog.csdn.net/weixin_33974433/article/details/91693041

Varnish是一款高性能的開源HTTP加速器  https://www.cnblogs.com/liu1026/p/7588121.html

使用varnish來做靜態文件緩存加速: https://blog.51cto.com/longmu/941234

使用 Varnish 加速你的 Web 網站  https://blog.csdn.net/q6196310920/article/details/47299781

web cache server方案比較: varnish、squid、nginx  https://www.cnblogs.com/kevingrace/p/6188123.html
Varnish、Squid、Ngx_cache性能對比  https://blog.csdn.net/weixin_33979745/article/details/92114264
Varnish VS Nginx測試報告   https://blog.csdn.net/weixin_30813225/article/details/96808403

發佈了19 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章