主機環境: rhel6.5 selinux and iptables disabled
實驗主機: 192.168.0.250 varnish
192.168.0.188 apache
192.168.0.189 apache
基礎知識
Varnish簡述
varnish是一款高性能且開源的方向代理服務器和HTTP加速器,它的開發者poul-Henning kamp FreeBSD 核心的開發人員之一。varnish採用全新的軟件體系機構,和現在的硬件體系配合緊密,varnish是一個輕量級的cache和反向代理軟件。先進的設計理念和成熟的設計框架式varnish的主要特點。
2)varnish的特點:
1、基於內存進行緩存,重啓後數據將消失。
2、利用虛擬內存方式,I\O性能好。
3、支持設置0~60秒的精確緩存時間。
4、VCL配置管理比較靈活。
5、具有強大的管理功能,例如top、stat、admin、list 等。
6、狀態機設計巧妙、結構清晰。
7、利用二叉堆管理緩存文件,可達到積極刪除目的。
3)varnish中vcl的使用
VCL 處理流程圖
(1)Receive 狀態,也就是請求處理的入口狀態,根據 VCL 規則判斷該請求應該是 Pass (直接通過)或Pipe(管道),或者進入 Lookup(本地查詢)。
(2)Lookup 狀態,進入此狀態後,會在 hash 表中查找數據,若找到,則進入 Hit 狀態,否則進入 miss 狀態。
(3)Pass 狀態,在此狀態下,會進入後端請求,即進入 fetch 狀態。
(4)Fetch 狀態,在 Fetch 狀態下,對請求進行後端的獲取,發送請求,獲得數據,並進行本地的存儲。
(5)Deliver 狀態, 將獲取到的數據發送給客戶端,然後完成本次請求。
VCL語言常用的一些函數和變量簡單介紹
vcl_recv模塊
用於接受和處理請求,當請求成功被調用後,varnish通過判斷請求的數據來決定如何處理請求。
Pass:表示直接進入pass模式,把請求交給vcl_pass模塊處理。
Pipe:表示進入pipe模式,把請求交給vcl_pipe模塊處理
vcl_pipe模塊
此模塊在請求進入pipe時被調用,用於將請求直接傳遞到後端主機,在請求和返回的內容沒有改變的情況下,也就是在當前鏈接沒有關閉時,服務器將不變的內容返回給客戶端,直到該鏈接被關閉。
vcl_pass模塊
此模塊表示當此模塊被pass後,用於將請求直接傳遞到後端應用服務器,後端應用服務器在接受請求後將數據發送給客戶端,但不進行任何數據的緩存,在當前連接下每次都返回最新的內容。
Lookup
一個請求在vcl_recv中被lookup後,varnish將在緩存中提取數據,如果緩存中有相應的數據,就把控制權交給vcl_hit模塊;如果緩存中沒有相應的數據,請求將被設置爲pass並將其交給vcl_miss模塊。
(5)vcl_hit模塊
執行lookup指令後,Varnish在緩存中找到請求的內容後將自動調用該模塊。在此模塊中,deliver表示將找到的數據發送給客戶端,並把控制權交給vcl_deliver模塊。
(6)vcl_miss模塊
執行lookup後,Varnish在緩存中沒有找到請求的內容時會自動調用該方法。此模塊可以用於判斷是否需要從後端服務器獲取內容。在此模塊中,fetch表示從後端獲取請求的數據,並把控制權交給vcl_fetch模塊。
(7)vcl_fetch模塊
在後端主機更新緩存並且獲取內容後調用該方法,接着,通過判斷獲取的內容來決定是將內容放入緩存,還是直接返回給客戶端。
(8)vcl_deliver模塊
當一個沒有被緩存的數據交付給客戶端的時候被調用。
(9)vcl_timeout 模塊
在緩存數據到期前調用此模塊。在此模塊中,discard表示從緩存中清除到期數據。
(10)vcl_discard模塊
在緩存數據到期後或緩存空間不夠時,自動調用該模塊。在此模塊中keep表示將數據繼續保留在緩存中。
通過 varnishadm 手動清除緩存
# varnishadm ban.url .*$
#清除所有
# varnishadm ban.url /index.html
#清除 index.html 頁面緩存
# varnishadm ban.url /admin/$
#清除 admin 目錄緩存
1.安裝服務
[root@server1 ~]# cd /etc/varnish/
[root@server1varnish]#yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
配置——實驗
1)[root@server1 varnish]# vim /etc/sysconfig/varnish ##varnish的配置文件,配置 varnish 服務端口
66 VARNISH_LISTEN_PORT=80 #varnish監聽端口
[root@server1 varnish]# vim /etc/varnish/default.vcl ##配置一個後端服務器,緩存配置
7 backend default {
8 .host = "172.25.6.2";
9 .port = "80";
10 }
#該塊用於配置一塊Varnish默認的後端服務器,當varnish需要從後端服務器獲取數據時就會訪問自己的80端口,varnish也可以定義多臺後端服務器實現負載均衡.
[root@server1 varnish]# /etc/init.d/varnish start
Starting Varnish Cache: [ OK ]
測試:
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start #6.5系統開啓服務命令
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.6.2 for ServerName
[ OK ]
[root@server2 ~]# vim /var/www/html/index.html
<h1>server2</h1>
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.6.3 for ServerName
[ OK ]
[root@server3 ~]# vim /var/www/html/index.html
<h1>server3</h1>
Test:在瀏覽器搜索172.25.6.1 -----> 顯示的是server2
2)
[root@server1 varnish]# vim default.vcl #查看緩存命中情況,命中即varnish緩存中是否有需要的數據,命中則顯示HIT,未命中則顯示MISS
7 backend default {
8 .host = "172.25.6.2";
9 .port = "80";
10 }
11
12 sub vcl_deliver {
13 if (obj.hits > 0) {
14 set resp.http.X-Cache = "HIT from westos cache";
15 }
16 else {
17 set resp.http.X-Cache = "MISS from westos cache";
18 }
19 return (deliver);
20 }
[root@server1 varnish]# /etc/init.d/varnish reload #修改配置文件後重新加載,不能retart
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2017-07-18T22:55:21
VCL compiled.
available 2 boot
active 0 reload_2017-07-18T22:55:21
Done
測試:
用curl命令,curl直接加域名顯示網頁內容,curl -I 加域名顯示頭文件信息
[root@foundation6 ~]# curl www.westos.org
<h1>server2</h1>
[root@foundation6 ~]# vim /etc/hosts
172.25.6.1 www.westos.org
[root@foundation6 ~]# curl -I www.westos.org #第一次查詢,varnish上無緩存,顯示MISS
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Tue, 18 Jul 2017 14:46:12 GMT
ETag: "530-11-5549893ab4f2c"
Content-Type: text/html; charset=UTF-8
Content-Length: 17
Accept-Ranges: bytes
Date: Tue, 18 Jul 2017 14:59:32 GMT
X-Varnish: 420117548
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from westos cache
[root@foundation6 ~]# curl -I www.westos.org #第一次查詢,varnish上有緩存,顯示HIT
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Tue, 18 Jul 2017 14:46:12 GMT
ETag: "530-11-5549893ab4f2c"
Content-Type: text/html; charset=UTF-8
Content-Length: 17
Accept-Ranges: bytes
Date: Tue, 18 Jul 2017 15:01:22 GMT
X-Varnish: 420117551 420117548
Age: 110
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from westos cache
[root@server1 varnish]# varnishadm ban.url .*$ #清空所有varnish緩存
[root@foundation6 ~]# curl -I www.westos.org #清空緩存後第一次搜索,無緩存,顯示MISS
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Tue, 18 Jul 2017 14:46:12 GMT
ETag: "530-11-5549893ab4f2c"
Content-Type: text/html; charset=UTF-8
Content-Length: 17
Accept-Ranges: bytes
Date: Tue, 18 Jul 2017 15:05:17 GMT
X-Varnish: 420117557
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from westos cache
3)
[root@server1 varnish]# vim default.vc #配置兩臺後端服務器
7 backend web1 {
8 .host = "172.25.6.2";
9 .port = "80";
10 }
11
12 backend web2 {
13 .host = "172.25.6.3";
14 .port = "80";
15 }
16 sub vcl_recv {
17 if (req.http.host ~ "^(www.)?westos.org") { #當域名爲以www.westso.org開頭或westos.org時去8.1主機緩存
18 set req.http.host = "www.westos.org";
19 set req.backend = web1;
20 } elsif (req.http.host ~ "^bbs.westos.org") { #當域名以bbs.westos.org開頭 時去8.2主機緩存
21 set req.backend = web2;
22 } else {error 404 "westos cache";
23 }
24 }
[root@server1 varnish]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is reload_2017-07-18T22:55:21
Using new config name reload_2017-07-18T23:12:49
VCL compiled.
available 0 boot
available 2 reload_2017-07-18T22:55:21
active 0 reload_2017-07-18T23:12:49
測試:
[root@foundation6 ~]# vim /etc/hosts
172.25.6.1 www.westos.org bbs.westos.org westos.org
[root@foundation6 ~]# curl www.westos.org
<h1>server2</h1>
[root@foundation6 ~]# curl westos.org
<h1>server2</h1>
[root@foundation6 ~]# curl bbs.westos.org
<h1>server3</h1>
[root@server2 ~]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[root@foundation6 ~]# curl www.westos.org
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>503 Service Unavailable</title>
</head>
<body>
<h1>Error 503 Service Unavailable</h1>
<p>Service Unavailable</p>
<h3>Guru Meditation:</h3>
<p>XID: 420117562</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>
varnish 羣組定義
VCL 可以把多個 backends 聚合成一個組,這些組被叫做 director,這樣可以增強性能和彈力,當組裏一個 backend 掛掉後,可以選擇另一個健康的 backend。VCL 有多種 director,不同的 director 採用不同的算法選擇 backend,主要有以下幾種:
..Random director 會根據所設置的權值(weight)來選擇 backend,.retries 參數表示嘗試找到一個 backend 的最大次數,.weight 參數表示權值
..Round-robin director 在選擇 backend 時,會採用循環的方式依次選擇。
..Client director 根據 client.identity 來選擇 backend,您可以設置 client.identity 的值爲 session cookie 來標識 backend。
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf #配置虛擬主機
990 NameVirtualHost *:80
1011 <VirtualHost *:80>
1012 DocumentRoot /var/www/html
1013 ServerName server2
1014 </VirtualHost>
1015
1016 <VirtualHost *:80>
1017 DocumentRoot /www/bbs
1018 ServerName bbs.westos.org
1019 </VirtualHost>
1020
1021 <VirtualHost *:80>
1022 DocumentRoot /www/westos
1023 ServerName www.westos.org
1024 </VirtualHost>
[root@server2 ~]# mkdir /www/bbs -p #建立默認目錄,編寫頭文件
[root@server2 ~]# vim /www/bbs/index.html
<h1>bbs.westos.org</h1>
[root@server2 ~]# mkdir /www/westos
[root@server2 ~]# vim /www/westos/index.html
<h1>server2-www.westos.org</h1>
[root@server2 ~]# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.6.2 for ServerName
[ OK ]
[root@server3 ~]# vim /var/www/html/index.html
server3-www.westos.org
[root@server3 ~]# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.6.3 for ServerName
[ OK ]
[root@server1 varnish]# vim default.vc #這裏用round-robin做實驗
16 director lb round-robin { #建立一個名爲lb的組,實現web1和web2之間的輪詢
17 { .backend = web1; }
18 { .backend = web2; }
19 }
20
21 sub vcl_recv {
22 if (req.http.host ~ "^(www.)?westos.org") { #當客戶端搜索符合條件的域名時,用lb組實現輪詢
23 set req.http.host = "www.westos.org";
24 set req.backend = lb;
25 return (pass);
26 } elsif (req.http.host ~ "^bbs.westos.org") {
27 set req.backend = web1;
28 } else {error 404 "westos cache";
29 }
30 }
[root@server1 varnish]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is reload_2017-07-18T23:17:29
Using new config name reload_2017-07-18T23:45:35
VCL compiled.
available 0 boot
available 0 reload_2017-07-18T22:55:21
available 0 reload_2017-07-18T23:12:49
available 2 reload_2017-07-18T23:17:29
active 0 reload_2017-07-18T23:45:35
Done
測試:實現負載均衡
[root@foundation6 ~]# curl www.westos.org
server3-www.westos.org
[root@foundation6 ~]# curl www.westos.org
<h1>server2-www.westos.org</h1>
[root@foundation6 ~]# curl www.westos.org
server3-www.westos.org
[root@foundation6 ~]# curl www.westos.org
<h1>server2-www.westos.org</h1>
5)varnish cdn 推送平臺
[root@server1 varnish]# yum install httpd -y
[root@server1 varnish]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@server1 varnish]# ls
bansys.zip
[root@server1 varnish]# yum install unzip -y
[root@server1 varnish]# unzip bansys.zip -d /var/www/html/
[root@server1 varnish]# cd /var/www/html/bansys/
[root@server1 bansys]# ls
class_socket.php config.php index.php purge_action.php static
[root@server1 bansys]# mv * ..
[root@server1 bansys]# ls
[root@server1 bansys]# cd ..
[root@server1 html]# ls
bansys class_socket.php config.php index.php purge_action.php static
[root@server1 html]# rm -fr bansys/
[root@server1 html]# /etc/init.d/varnish start
Starting Varnish Cache: [ OK ]
[root@server1 html]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.6.1 for ServerName
[ OK ]
[root@server1 html]# yum install php -y
[root@server1 html]# vim config.php (數據庫的信息全部加備註)
25 //varnish主機列表
26 //可定義多個主機列表
27 $var_group1 = array(
28 'host' => array('172.25.6.1',),
29 'port' => '80',
30 );
31
32 //varnish羣組定義
33 //對主機列表進行綁定
34 $VAR_CLUSTER = array(
35 'www.westos.org' => $var_group1,
36 );
[root@server1 html]# vim /etc/varnish/default.vcl
7 acl westos {
8 "127.0.0.1";
9 "172.25.8.0"/24;
10 }
11
12 backend web1 {
13 .host = "172.25.6.2";
14 .port = "80";
15 }
16
17 backend web2 {
18 .host = "172.25.6.3";
19 .port = "80";
20 }
21 director lb round-robin {
22 { .backend = web1; }
23 { .backend = web2; }
24 }
26 sub vcl_recv {
27 if (req.request == "BAN") {
28 if (!client.ip ~ westos) {
29 error 405 "Not allowed.";
30 }
31 ban("req.url ~ " + req.url);
32 error 200 "ban added";
33 }
34 if (req.http.host ~ "^(www.)?westos.org") {
35 set req.http.host = "www.westos.org";
36 set req.backend = lb;
37 #return (pass);
38 } elsif (req.http.host ~ "^bbs.westos.org") {
39 set req.backend = web1;
40 } else {error 404 "westos cache";
41 }
42 }
43 sub vcl_deliver {
44 if (obj.hits > 0) {
45 set resp.http.X-Cache = "HIT from westos cache";
46 }
47 else {
48 set resp.http.X-Cache = "MISS from westos cache";
49 }
50 return (deliver);
51 }
[root@server1 html]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2017-07-19T23:26:05
VCL compiled.
available 0 boot
active 0 reload_2017-07-19T23:26:05
Done
[root@server2 ~]# cat /www/westos/index.html
<h1>server2-www.westos.org</h1>
測試:
server2和server3輪詢推送