varnish---反向代理web加速缓存服务器和CDN的推送
Varnish 簡(jiǎn)介
Varnish 是一款高性能且開(kāi)源的反向代理服務(wù)器和 HTTP 加速器,其采用全新的軟件體系機(jī)構(gòu),和現(xiàn)在的硬件體系緊密配合,與傳統(tǒng)的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優(yōu)點(diǎn),很多大型的網(wǎng)站都開(kāi)始嘗試使用 varnish 來(lái)替換 squid,這些都促進(jìn) varnish 迅速發(fā)展起來(lái)。
挪威的最大的在線報(bào)紙 Verdens Gang(vg.no) 使用 3 臺(tái) Varnish 代替了原來(lái)的 12 臺(tái) Squid,性能比以前更好,這是 Varnish 最成功的應(yīng)用案例。
Varnish 文件緩存的工作流程
Varnish 與一般服務(wù)器軟件類(lèi)似,分為 master 進(jìn)程和 child 進(jìn)程。Master 進(jìn)程讀入存儲(chǔ)配置文件,調(diào)用合適的存儲(chǔ)類(lèi)型,然后創(chuàng)建 / 讀入相應(yīng)大小的緩存文件,接著 master 初始化管理該存儲(chǔ)空間的結(jié)構(gòu)體,然后 fork 并監(jiān)控 child 進(jìn)程。Child 進(jìn)程在主線程的初始化的過(guò)程中,將前面打開(kāi)的存儲(chǔ)文件整個(gè) mmap 到內(nèi)存中,此時(shí)創(chuàng)建并初始化空閑結(jié)構(gòu)體,掛到存儲(chǔ)管理結(jié)構(gòu)體,以待分配。Child 進(jìn)程分配若干線程進(jìn)行工作,主要包括一些管理線程和很多 worker 線程。
接著,開(kāi)始真正的工作,varnish 的某個(gè)負(fù)責(zé)接收新 HTTP 連接線程開(kāi)始等待用戶,如果有新的 HTTP 連接過(guò)來(lái),它總負(fù)責(zé)接收,然后喚醒某個(gè)等待中的線程,并把具體的處理過(guò)程交給它。Worker 線程讀入 HTTP 請(qǐng)求的 URI,查找已有的 object,如果命中則直接返回并回復(fù)用戶。如果沒(méi)有命中,則需要將所請(qǐng)求的內(nèi)容,從后端服務(wù)器中取過(guò)來(lái),存到緩存中,然后再回復(fù)。
分配緩存的過(guò)程是這樣的:它根據(jù)所讀到 object 的大小,創(chuàng)建相應(yīng)大小的緩存文件。為了讀寫(xiě)方便,程序會(huì)把每個(gè) object 的大小變?yōu)樽罱咏浯笮〉膬?nèi)存頁(yè)面倍數(shù)。然后從現(xiàn)有的空閑存儲(chǔ)結(jié)構(gòu)體中查找,找到最合適的大小的空閑存儲(chǔ)塊,分配給它。如果空閑塊沒(méi)有用完,就把多余的內(nèi)存另外組成一個(gè)空閑存儲(chǔ)塊,掛到管理結(jié)構(gòu)體上。如果緩存已滿,就根據(jù) LRU 機(jī)制,把最舊的 object 釋放掉。
釋放緩存的過(guò)程是這樣的:有一個(gè)超時(shí)線程,檢測(cè)緩存中所有 object 的生存期,如果超初設(shè)定的 TTL(Time To Live)沒(méi)有被訪問(wèn),就刪除之,并且釋放相應(yīng)的結(jié)構(gòu)體及存儲(chǔ)內(nèi)存。注意釋放時(shí)會(huì)檢查該存儲(chǔ)內(nèi)存塊前面或后面的空閑內(nèi)存塊,如果前面或后面的空閑內(nèi)存和該釋放內(nèi)存是連續(xù)的,就將它們合并成更大一塊內(nèi)存。
整個(gè)文件緩存的管理,沒(méi)有考慮文件與內(nèi)存的關(guān)系,實(shí)際上是將所有的 object 都考慮是在內(nèi)存中,如果系統(tǒng)內(nèi)存不足,系統(tǒng)會(huì)自動(dòng)將其換到 swap 空間,而不需要 varnish 程序去控制。
server11:
rpm -ivh varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
vim /etc/sysconfig/varnish VARNISH_LISTEN_PORT=80
vim /etc/varnish/default.vcl
?7 backend default {?8 ? .host = "172.25.88.13";
?9 ? .port = "80";
10 }
11
12 backend web {
13 ? .host = "172.25.88.12";
14 ? .port = "80";
15 }
16
17 sub vcl_recv {
18 if (req.http.host ~ "^(www.)?westos.org") { #如果用戶訪問(wèn):westos.org,會(huì)自動(dòng)補(bǔ)全www
19 set req.http.host = "www.westos.org";
20 set req.backend = default;
21 } elsif (req.http.host ~ "^bbs.westos.org") { #如果訪問(wèn):bbs.westos.org,就去訪問(wèn)web
22 set req.backend = web;
23 } else
? ? ? ? {error 404 "westos cache"; ? ?除了訪問(wèn)這些域名,其他就GG了
24 }
25 }
? ?#測(cè)試緩存命中
27 sub vcl_deliver {
28 if (obj.hits > 0) {
29 set resp.http.X-Cache = "HIT from westos cache"; 命中緩存
30 }
31 else {
32 set resp.http.X-Cache = "MISS from westos cache";
33 }
34 return (deliver);
35 }
/etc/init.d/varnish start
[root@server11 ~]# netstat -antlp |grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1167/varnishd
server12
/etc/init.d/httpd start
cat index.html
server13
通過(guò) varnishadm 手動(dòng)清除緩存
varnishadm ban.url .*$ ? ? ? ? ?#清除所有varnishadm ban.url /index.html ?#清除 index.html 頁(yè)面緩存
varnishadm ban.url /admin/$ ? ?#清除 admin 目錄緩存
第一次錯(cuò)過(guò)(miss)緩存
第一次命中(hit)緩存
varnish虛擬主機(jī)和輪尋
server12:
vim /etc/httpd/conf/httpd.conf
990 NameVirtualHost *:801012 <VirtualHost *:80>
1013 ? ? DocumentRoot /var/www/html
1014 ? ? ServerName server12.lalala.com
1015 </VirtualHost>
1016
1017 <VirtualHost *:80>
1018 ? ? DocumentRoot /www1
1019 ? ? ServerName www.westos.org
1020 </VirtualHost>
1021
1022 <VirtualHost *:80>
1023 ? ? DocumentRoot /www2
1024 ? ? ServerName bbs.westos.org
1025 </VirtualHost>
server11:
vim /etc/varnish/default.vcl
?7 backend default {?8 ? .host = "172.25.88.13";
?9 ? .port = "80";
10 }
11
12 backend web {
13 ? .host = "172.25.88.12";
14 ? .port = "80";
15 }
16
17 director lb round-robin {
18 {.backend = default;}
19 {.backend = web;}
20 }
21
22 sub vcl_recv {
23 if (req.http.host ~ "^(www.)?westos.org") {
24 set req.http.host = "www.westos.org";
25 set req.backend = lb;
26 return (pass); ? ?#為了測(cè)試方便,不進(jìn)行緩存。
27 } elsif (req.http.host ~ "^bbs.westos.org") {
28 set req.backend = web;
29 } else {error 404 "westos cache";
30 }
31 }
32
33 sub vcl_deliver {
34 if (obj.hits > 0) {
35 set resp.http.X-Cache = "HIT from westos cache";
36 }
37 else {
38 set resp.http.X-Cache = "MISS from westos cache";
39 }
40 return (deliver);
41 }
CDN推送
當(dāng)varnish緩存的頁(yè)面有更新,需要重新的頁(yè)面的時(shí)候,只需要web開(kāi)發(fā)人員,提交更改的網(wǎng)址,這就是我們的CDN推送
[root@server11 html]# unzip bansys.zip[root@server11 html]# cd bansys
[root@server11 bansys]# mv * ..
bansys 有兩種工作模式,分別是:telnet 和 http 模式。
telnet 模式需要關(guān)閉 varnish 服務(wù)管理端口的驗(yàn)證,注釋掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”這行,重啟 varnish 服務(wù)即可。
如果是 http 模式需要對(duì) varnish 做以下設(shè)置:
vim /etc/varnish/default.vcl
?8 acl westos {?9 "127.0.0.1";
10 "172.25.88.0"/24;
11 }
12
13 sub vcl_recv {
14 if (req.request == "BAN") {
15 if (!client.ip ~ westos) {
16 error 405 "Not allowed.";
17 }
18 ban("req.url ~ " + req.url);
19 error 200 "ban added";
20 }
21 }
vim config.php #只保留如下設(shè)置,其余注釋掉
<?php//varnish主機(jī)列表
$var_group1 = array(
? ? ? ? ? ? ? ? ? ? ? ?'host' => array('172.25.88.11'),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'port' => '80', ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ?);
//varnish群組定義
//對(duì)主機(jī)列表進(jìn)行綁定
$VAR_CLUSTER = array(
? ? ? ? ? ? ? ? ? ? ? ? 'www.westos.org' => $var_group1,
? ? ? ? ? ? ? ? ? ? );
//varnish版本
//2.x和3.x推送命令不一樣
$VAR_VERSION = "3";
?>
轉(zhuǎn)載于:https://blog.51cto.com/12059878/1915193
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的varnish---反向代理web加速缓存服务器和CDN的推送的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Hibernate】Hibrenate
- 下一篇: Java同步工具类——信号量