開啓三臺虛擬機 實戰:使用varnish加速多個不一樣域名站點的web服務器 varnish:192.168.80.100 //須要聯網 web1:192.168.80.101——www.aa.com web2:192.168.80.102——www.bb.com
三臺服務器全都要操做 systemctl stop firewalld //關閉防火牆 setenforce 0 //關閉監控
yum安裝varnish cd /etc/yum.repos.d/ mv back/* ./
1.安裝varnish(從Centos7開始,varnish已被收入到epel倉庫) yum install epel-release -y //須要聯網 yum -y install varnish
2.新建varnish用戶 useradd -M -s /sbin/nologin varnish
3.varnish配置文件 vi /etc/varnish/varnish.params //主配置文件
vi /etc/varnish/default.vcl //VCL配置文件 sub vcl_recv{ if (req.http.host ~ "(?i)^(www.)?aa.com$") { set req.http.host = "www.aa.com"; set req.backend_hint = web1; } elsif (req.http.host ~ "(?i)^www.bb.com$") { set req.backend_hint = web2; return(hash); } } 判斷當訪問www.aa.com域名時從web1上取數據,訪問www.bb.com域名是到web2取數據。
#添加一個Header標識,以判斷緩存是否命中 sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "HIT FROM" + req.http.host; set resp.http.X-Cache-Hits = obj.hits; } else { set resp.http.X-Cache = "MISS FROM" + req.http.host; } return (deliver); }
重啓varnish systemctl restart varnish
vi /etc/hosts 192.168.80.100 www.aa.com 192.168.80.100 www.bb.com
yum install -y elinks //安裝elinks elinks www.aa.com --dump #elinks文本界面瀏覽器
或者:在windows中查找
在另外一臺虛擬機搭建一個web服務器:web1(80.101)
yum install httpd -y //安裝http
vi /etc/httpd/conf/httpd.conf 把 ServerName www.example.com:80 前面的#刪除
vi /var/www/html/index.html <h1>server 1</h1> systemctl start httpd
在另外一臺虛擬機搭建一個web服務器:web2(80.102)
yum install httpd -y //安裝http
vi /etc/httpd/conf/httpd.conf 把 ServerName www.example.com:80 前面的#刪除
vi /var/www/html/index.html <h1>server 2</h1> systemctl start httpd
最後在瀏覽器上輸入www.bb.com
————————————————————————————————————————html
VCL Varnish Configuration Language (VCL) 是一種動態語言,是varnish配置語言,用來描述請求處理和制定緩存策略。vcl配置內容由manager process 建立的VCC子進程轉換成C語言代碼,再經由gcc編譯成共享對象,最後裝載到cacher process中生效。 VCL文件被分爲多個子程序,不一樣的子程序在不一樣的時間裏執行,好比一個子程序在接到請求時執行,另外一個子程序在接受到後端服務器傳送的文件時執行。
VCL處理流程圖
處理過程大體分爲以下幾個步驟
一、Receive狀態:請求處理的入口狀態,根據VCL規則判斷該請求應該是Pass或Pipe或者進入Lookup(本地查詢)
二、Lookup狀態,在緩存中查找用戶請求的對象,若是緩存中沒有其請求的對象,後續操做極可能會將其請求的對象進行緩存;進入此狀態後,會在hash表中查找數據,若找到,則進入Hit(命中)狀態,不然進入miss狀態
三、Pass狀態,在此狀態下,會進入後端(源服務器)請求,即進入fetch狀態,不走緩存
四、Fetch狀態,在Fetch狀態下,對請求,進行後端的獲取,發送請求,得到源服務器的數據,並進行本地的存儲
五、Deliver提供狀態,將獲取到的數據發送給客戶端,而後完成本次請求。
注:
Pass:繞過緩存,既不從緩存中查詢內容或不將內容存儲至緩存中;
Pipe:不對客戶端進行檢測或做出任何操做,而是在客戶端與後端服務器之間創建專用「管道」,並直接將數據在兩者之間進行傳送;此時,keep-alive鏈接中後續傳送的數據都將經過此管道進行直接傳送,並不會出如今任何日誌中。web
語法 (1)支持註釋 // # /* */ (2)不支持循環 (3)sub $name:用於定義子例程 sub vcl_recv { } (4)有衆多內置的變量,變量的可調用位置與state engine有密切相關性 (5)支持終止語句,return(action),沒有返回值 (6)"域"專用 (7)操做符 =,==,!,&&,||
經常使用語句 if else set name=value unset name req.http.HEADER:調用請求報文中http協議的指定的變量 req.request:請求方法
varnish變量種類
req——請求
resp——響應
client——客戶端
server——服務端
bereq——向後端請求時產生的req
beresp——後端響應時產生的resp
obj——項目對象
storage——大小windows
經常使用變量:
bereq和req:
bereq(req).http.HEADERS: 由varnish發往backend server的請求報文的指定首部;
bereq(req).request:請求方法;
bereq(req).url: 請求路徑
bereq(req).proto: 請求協議
bereq(req).backend:指明要調用的後端主機;
beresp和resp
beresp.proto:響應使用的協議
beresp.status:響應的狀態碼
beresp.reason:緣由短語;
beresp.backend.ip:響應的後端ip地址
beresp.backend.name:響應的後端域名
beresp.http.HEADER: 從backend server響應的報文的首部;
beresp.ttl:後端服務器響應的內容的餘下的生存時
obj
obj.ttl: 對象的ttl值;
obj.hits:此對象從緩存中命中的次數;
server
server.ip
server.hostname
CDN後端