varnish是一款高性能的開源HTTP加速器.
varnish與一般服務器軟件類似,分爲master(management)進程和child(worker,主要做cache的工作)進程。master進程讀入命令,進行一些初始化,然後fork並監控child進程。child進程分配若干線程進行工作,主要包括一些管理線程和很多woker線程。
針對文件緩存部分,master讀入存儲配置(-s file[,path[,size[,granularity]]] ),調用合適的存儲類型,然後創建/讀入相應大小的緩存大文件。接着,master初始化管理該存儲空間的結構體。這些變量都是全局變量,在fork以後會被child進程所繼承(包括文件描述符)。
在child進程主線程初始化過程中,將前面打開的存儲大文件整個mmap到內存中(如果超出系統的虛擬內存,mmap失敗,進程會減少原來的配置mmap大小,然後繼續mmap),此時創建並初始化空閒存儲結構體,掛到存儲管理結構體,以待分配。
接着,真正的工作開始,Varnish的某個負責接受新HTTP連接的線 程開始等待用戶,如果有新的HTTP連接過來,它總負責接收,然後叫醒某個等待中的線程,並把具體的處理過程交給它。Worker線程讀入HTTP請求的 URI,查找已有的object,如果命中則直接返回並回複用戶。如果沒有命中,則需要將所請求的內容,從後端服務器中取過來,存到緩存中,然後再回復。
1.server3:
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80
vim /etc/varnish/default.vcl
backend default { .host = "127.0.0.1"; .port = "8080"; }
vim /etc/httpd/conf/httpd.conf
Listen 8080
/etc/init.d/httpd start
/etc/init.d/varnish start
netstat -antlp
cd /var/www/html
vim index.html
server3.example.com server3.example.com
curl -I 172.25.85.3/index.html
在網頁中打開:172.25.85.3
之後修改index.html:server2.server2.server2
刷新網頁上的內容,等一段時間修改後的內容才顯示 ##會有緩存
在index.html中的內容修改之後,網頁上的內容未被刷新之前:
curl -I 172.25.85.3/index.html
修改成功之後Age=0
curl -dump 172.25.85.3
curl -dump 172.25.85.3/index.html
2. server3:
cd /etc/varnish
vim default.vcl
backend default { .host = "127.0.0.1"; .port = "8080"; }
sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "HIT from westos cache"; } else { set resp.http.X-Cache = "MISS from westos cache"; } return (deliver); }
/etc/init.d/varnish restart
curl -I 172.25.85.3/index.html
修改:
cd /var/www/html
echo server2.server2 > index.html
curl -I 172.25.85.3/index.html
curl 172.25.85.3/index.html
### 通過 varnishadm 手動清除緩存
varnishadm ban.url .*$ #清除所有
varnishadm ban.url /index.html #清除 index.html 頁面緩存
清除了緩存中的內容就可以很快更新index.html中修改的內容
3.定義多個不同域名站點的後端服務器:
在真機上加上server3的域名解析:
172.25.85.3 server3.example.com www.linux.org www.unix.org www.westos.org westos.org bbs.westos.org
server3:
vim /etc/varnish/default.vcl
backend default { .host = "127.0.0.1"; .port = "8080"; } backend server4 { .host = "172.25.85.4"; .port = "80"; } sub vcl_recv { if (req.http.host ~ "^(www.)?westos.org") { set req.http.host = "www.westos.org"; set req.backend = default; } elsif (req.http.host ~ "^bbs.westos.org") { set req.backend = server4; } else {error 404 "westos cache"; } } sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "HIT from westos cache"; } else { set resp.http.X-Cache = "MISS from westos cache"; } return (deliver); }
/etc/init.d/varnish reload
server3-www.westos.org > /var/www/html/index.html
server4:
server4-bbs.westos.org > /var/www/html/index.html
檢測:
http://www.westos.org/
http://bbs.westos.org/
4. 把多個後端聚合爲一個組,並檢測後端健康狀況
server3:
vim /etc/varnish/default.vcl
增加:
backend default { .host = "127.0.0.1"; .port = "8080"; } backend server4 { .host = "172.25.85.4"; .port = "80"; } director westoslb round-robin { { .backend = default; } { .backend = server4; } } sub vcl_recv { if (req.http.host ~ "^(www.)?westos.org") { set req.http.host = "www.westos.org"; set req.backend = westoslb; } elsif (req.http.host ~ "^bbs.westos.org") { set req.backend = server4; } else {error 404 "westos cache"; } }
server4:
vim /var/www/html/index.html
<VirtualHost *:80> DocumentRoot /var/www/html ServerName www.westos.org alias westos.org </VirtualHost> <VirtualHost *:80> DocumentRoot /bbs ServerName bbs.westos.org </VirtualHost>
/etc/init.d/httpd start
mkdir /bbs
vim /bbs/index.html
bbs.westos.org
vim /var/www/html/index.html
server4-www.westos.org
server3:
/etc/init.d/varnish reload
vim /etc/varnish/default.vcl
sub vcl_recv { if (req.http.host ~ "^(www.)?westos.org") { set req.http.host = "www.westos.org"; set req.backend = westoslb; return (pass); } elsif (req.http.host ~ "^bbs.westos.org") { set req.backend = server4; } else {error 404 "westos cache"; } }
/etc/init.d/varnish reload
http://www.westos.org/
server3-www.westos.org he server4-www.westos.org 交替出現
關閉server3上的 httpd ,只出現server4-www.westos.org
5.banzip:
server3:
yum install unzip
unzip bansys.zip -d /var/www/html/
cd /var/www/html/bansys/
yum install php -y
mv * ..
cd ..
rm -fr bansys/
vim /var/www/html/config.php
註釋一部分
//可定義多個主機列表 $var_group1 = array( 'host' => array('172.25.85.3'), 'port' => '6082', ); //這個使用了mysql讀取數據 # $var_group3 = array( # 'host' => $varnish_host, # 'port' => '6082', # ); //varnish羣組定義 //對主機列表進行綁定 $VAR_CLUSTER = array( 'www.westos.org' => $var_group3, ); //varnish版本 //2.x和3.x推送命令不一樣 $VAR_VERSION = "3"; ?> ~
/etc/init.d/httpd restart
http://172.25.85.3:8080/
vim /etc/varnish/default.vcl
acl westos { "127.0.0.1"; "172.25.85.0"/24; } backend default { .host = "127.0.0.1"; .port = "8080"; } director westoslb round-robin { { .backend = default; } { .backend = server4; } } sub vcl_recv { if (req.request == "BAN") { if (!client.ip ~ westos) { error 405 "Not allowed."; } ban("req.url ~ " + req.url); error 200 "ban added"; } if (req.http.host ~ "^(www.)?westos.org") { set req.http.host = "www.westos.org"; set req.backend = westoslb; #return (pass); } elsif (req.http.host ~ "^bbs.westos.org") { set req.backend = server4; } else {error 404 "westos cache"; } }
/etc/init.d/varnish reload
http://www.westos.org/index.html
只出現server3-www.westos.org
http://172.25.85.3:8080/