1. 程式人生 > >Varnish反向代理服務器綜合應用

Varnish反向代理服務器綜合應用

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反向代理服務器綜合應用