Varnish反向代理服務器綜合應用
阿新 • • 發佈:2018-07-25
set 方便 應該 後端 方式 代理服務器 最大 關閉 4.6 Varnish反向代理服務器
Varnish是一個開源的輕量級Cache和反向代理軟件,通常只為http提供緩存,與Squit相比,Varnish具有性能更高、速度更快、管理更方便等優點。
Varnish的特點:
- 基於內存進行緩存,重啟後數據將丟失
- 利用虛擬內存方式,IO性能好
- 支持設置0-60秒的精確緩存時間
- VCL配置管理比較靈活
- 32位機器上只能支持最大緩存文件大小為2GB,需要更大的緩存文件只有安裝64位操作系統
- 具有強大的管理功能
- 利用二叉堆管理緩存文件,可達到積極刪除目的
Varnish與Squid比較:
相同點:
- 兩者都是反向代理服務器
- 兩者都是開源軟件
不同點(同時也是Varnish的優點):
- Varnish穩定性高
- varnish訪問速度快
- Varnish可以支持更多的並發連接
- Varnish可以通過管理端口,使用正則表達式批量清除部分緩存
Varnish的缺點:
Varnish在高並發情況下CPU、IO和內存資源開銷大
Varnish進程一旦掛起、崩潰或重啟,緩存數據都會從內存中釋放,此刻所有請求都會發送到後端服務器上,在高並發情況下,會給後端服務器造成很大的壓力
VCL即varnish Configuation Language
它用來定義Varnish的存取策略,需要註意“\”字符在這裏沒有特別含義,它只是配置語言,並不是編程語言。
VCL語法: 1.vcl_recv函數: 用來接收和處理請求,當請求到達並被成功接收後被調用,通過判斷請求的數據來決定如何處理請求。 2.vcl_pipe函數: 在進入pipe模式時被調用,用於將請求直接傳遞至後端主機,在請求和返回的內容沒有變化的情況下,將不變的內容返回給客戶端,直到這個連接被關閉。 3.vcl_pass函數:: 在進入pass模式時被調用,用於將請求直接傳遞至後端主機。後端主機在應答數據後將應答數據發送給客戶端,但不進行任何緩存,在當前連接下每次都返回最新的內容。 4.lookup: 在緩存中查找被請求的對象,並且根據查找的結果把控制權交給函數vcl_hit或函數vcl_miss。 5.vcl_hit函數: 在執行lookup指令後,在緩存中找到請求的內容後將自動調用該函數。 6.vcl_miss函數: 在執行lookup指令後,在緩存中沒有找到請求的內容時自動條用該方法。此函數可用於判斷是否需要從後端服務器獲取內容。 7.vcl_fetch函數: 在後端主機更新緩存並且獲取內容後調用該方法,接著,通過判斷獲取的內容來決定是將內容放入緩存,還是直接返回給客戶端。 8.vcl_deliver函數: 將在緩存中找到請求的內容發送給客戶端前調用此方法。 9.vcl_timeout函數: 在緩存內容到期前調用此函數。 10.vcl_discard函數: 在緩存內容到期後或緩存空間不夠時,自動調用該函數。
VCL處理流程圖
Varnish處理HTTP請求的過程大致分為如下步驟:
1.Receive狀態:請求處理的入口狀態,根據VCL規則判斷該請求應該Pass或Pipe,還是進入Lookup(本地查詢);
2.Lookup狀態:進入此狀態後,會在hash表中查找數據,若找到,則進入Hit狀態,否則進入Miss狀態;
3.Pass狀態:在此狀態下,會進入後端請求,即進入Fetch狀態;
4.Fetch狀態:在Fetch狀態下,對請求進行後端獲取,發送請求,獲得數據,並進行本地存儲;
5.Deliver狀態:將獲取到的數據發送給客戶端,然後完成本次請求。
Varnish程序環境:
配置文件:
- /etc/varnish/varnish.params(/etc/sysconfig/varnishd):配置varnish服務進程的工作特性(監聽地址,端口,緩存機制等)
- /etc/varnish/default.vcl:配置各Child/Cache線程的工作特性
主程序:
- /usr/sbin/varnishd
CLI interface:
- /usr/bin/varnishadmin:通過此管理工具,完成與Manager Process的交互,進而控制varnish的工作特性
Share Memory Log交互工具:
- /usr/bin/varnishhist:日誌歷史
- /usr/binvarnishlog:記錄詳細log(請求報文首部,響應報文首部等)
- /usr/bin/varnishcsa:格式化記錄日誌
- /usr/bin/varnishstat:日誌統計
- /usr/bin/varnishtop:日誌排序分析
測試工具程序:
- /usr/bin/varnishtest
VCL配置文件重載程序: - /usr/sbin/varnish_reload_vcl:此程序會編譯配置文件
Systemd Unit File:
- /usr/lib/systemd/system/varnish.service:varnish服務
- /usr/lib/systemd/system/varnishlog.service:原始記錄日誌(保存磁在盤上)
- /usr/lib/systemd/system/varnishncsa.service:ncsa格式日誌(保存磁在盤上)
系統環境:
主機名 | 操作系統 | IP地址 | 服務名 |
---|---|---|---|
Varnish-server | centos7.3 | 192.168.96.22 | varnish 4.0.5 |
web1 | centos7.3 | 192.168.96.23 | httpd 2.4.6 |
web2 | centos7.3 | 192.168.96.25 | httpd 2.4.6 |
測試機 | windows 10 | 192.168.96.2 | 網頁瀏覽器 |
關閉防火墻及Selinux
systemctl stop firewalld
setenforce 0
實現功能:
主要通過Varnish緩存代理服務器對應多臺web服務器實現負載均衡與健康監測及日誌輸出的功能。
開始部署:
負載均衡與健康監測
1.安裝varnish(從Centos7開始,varnish已被收入到epel倉庫)
yum -y install varnish
2.新建varnish用戶
useradd -M -s /sbin/nologin varnish
3.修改varnish目錄屬主屬組
chown -R varnish.varnish /etc/varnish/
4.編輯varnishd主配置文件
vim /etc/varnish/varnish.params
#varnish監聽地址及端口
VARNISH_LISTEN_ADDRESS=192.168.96.22
VARNISH_LISTEN_PORT=80
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=3500
#線程調優
DAEMON_OPTS="-p thread_pool_min=100 -p thread_pool_max=5000 -p thread_pool_timeout=300"
5.編輯varnish配置文件
vim /etc/varnish/default.vcl
vcl 4.0;
import directors;
#定義健康監測機制
probe check {
.url="/"; #檢測時請求的URL,默認為"/"
.interval=5s; #檢測頻率
.timeout=1s; #超時時間
.window=5; #基於最近的多少次檢查來判斷其健康狀態
.threshold=3; #最近.window中定義的次數至有.threshold的次數是成功的
}
#定義後端服務器web1
backend web1 {
.host = "192.168.96.23";
.port = "80";
.probe=check; #健康監測
}
#定義後端服務器web2
backend web2 {
.host="192.168.96.25";
.port="80";
.probe=check; #健康監測
}
sub vcl_init {
new bar=directors.round_robin(); #輪詢
bar.add_backend(web1);
bar.add_backend(web2);
}
sub vcl_recv {
set req.backend_hint=bar.backend();
}
sub vcl_backend_response {
}
#添加一個Header標識,以判斷緩存是否命中
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT,Varnish提供服務";
} else {
set resp.http.X-Cache = "MISS,web服務器提供服務";
}
return (deliver);
}
6.啟動varnish服務
systemctl start varnish
7.查詢varnish啟動信息
netstat tunlp | grep varnish
8.功能測試
8.1.在Varnish服務器上開啟監控
varnishstat
8.2.在windows 10 中通過網頁瀏覽器訪問http://192.168.96.22,可以實現負載均衡
8.3通過fiddler抓包測試:
8.4.回到Varnish服務器查看監控頁面,可以看到它的命中率(這裏我僅測試了203次)
Varnish日誌管理
Varnish是通過內存共享的方式提供日誌的,主要提供了兩種日誌輸出形式,分別是:
1.通過自帶的Varnish指令獲得Varnish詳細的系統運行日誌;
2.通過自帶的Varnishncsa指令得到類似Apache的combined輸出格式的日誌;
1.創建varnish的cache及log文件夾
#創建cache/log目錄
mkdir -p /data/varnish/cache
mkdir -p /data/varnish/log
#修改目錄的屬主、屬組信息
chown -R /data/varnish/
2.創建varnishncsa管理腳本
vim /etc/init.d/varnishncsa
#!/bin/sh
if [ "$1" = "start" ];then
/usr/bin/varnishncsa -n /data/varnish/cache -w /data/varnish/log/varnish.log & 2> /dev/null
elif [ "$1" = "stop" ];then
killall varnishncsa
else
echo $0 "{start | stop}"
fi
3.修改varnishncsa腳本權限
chmod 755 /etc/init.d/varnishncsa
4.啟動varnishncsa腳本
/etc/init.d/varnishncsa start
5.驗證日誌是否成功
Varnish服務器log目錄下已經是生成日誌文件
實時查看該日誌文件,當有客戶端訪問會直接顯示出記錄
Varnish反向代理服務器綜合應用