linux學習之rhel6.5 varnish服務簡介及基礎配置 應用

 ############varnish##############
主機環境: 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輪詢推送









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章