實戰varnish
=================================
varnish的簡介
varnish狀态引擎(State Engine)
varnish緩存命中的測試
varnish記錄日志
varnish的負載均衡
varnish動靜分離
varnish對後端server的健康狀态的檢查
varnish實作防盜鍊
==================================
******************理論篇簡介***************************
一、varnish的簡介
varnish是一個開源的反向代理軟體和HTTP加速器,是一個新貴的緩存軟體,與緩存的元老squid相比,varnish更輕量級一些,varnish具有性能更高、速度更快、管理更友善。
varnish的特性:
1)、基于記憶體進行緩存,也可以基于磁盤,但是重新開機後資料将會丢失,使得varnish不能做高可用,但是可以在前端使用負載均衡軟體對varnish進行負載均衡排程。比如,前端用haproxy使用uri的排程算法對varnish做負載均衡。
2)、利用虛拟記憶體方式,I/O性能好。
3)、支援設定0~60秒的精确緩存時間。
4)、狀态引擎機設計的巧妙,且結構清晰
5)、VCL (Varnish Configuration Language)配置管理比較靈活
6)、利用二叉堆管理緩存檔案,可達到積極删除效果
二、varnish狀态引擎(State Engine)
<a href="http://blog.51cto.com/attachment/201310/105123115.png" target="_blank"></a>
vcl_recv:【vcl_recv引擎是用于接收到使用者的請求】
在vcl_hit引擎中可以調用return(pipe)指令和調用return(lookup)指令和調用return(pass)指令。
如果不檢查緩存;
調用的是return(pipe)指令,然後由vcl_pipe引擎直接交給後端伺服器進行處理
如果是檢查緩存;
①、調用return(lookup)指令,檢查緩存,看緩存是否命中,需自行定義如何
檢查緩存
②、調用return(pass)指令,則将請求送給vcl_pass進行處理
vcl_pipe:【vcl_pipe引擎是用于把使用者的請求接進來,然後建立一個管道直接交給後端伺服器】
在vcl_pipe引擎中可以調用return(pipe)指令
調用return(pipe)指令則建立一個與後端伺服器的管道
vcl_hash:【vcl_hash引擎用于自行定義其它緩存的機制】
在vcl_hash引擎中可以調用return(hash)指令
調用return(hash)指令,則通過hash鍵值對進行判斷,是否命中
vcl_hit:【vcl_hit引擎用于表示緩存命中】
在vcl_hit引擎中可以調用return(pass)指令和調用return(delive)指令
如果是調用return(pass)指令,則将請求送給vcl_pass進行處理
{此情況發生在當自定義的緩存為1個小時,但未滿一個小時,所設定的緩存已經發生變化則需要用vcl_pass}
如果是調用return(delive)指令,則從緩存中直接取出後由vcl_deliver傳回給使用者
vcl_miss:【vcl_miss引擎用于表示緩存未命中】
在vcl_miss引擎中可以調用return(pass)指令和調用return(fetch)指令
如果是調用return(fetch)指令,則将請求送給vcl_fetch進行處理
vcl_pass:【vcl_pass引擎用于給命中引擎和未命中引擎提供處理機制】
在vcl_pass引擎中可以調用return(fetch)指令
調用return(fetch)指令,則将請求送給vcl_fetch進行處理
vcl_fetch:【vcl_fetch引擎用于到後端伺服器去取資料】
在vcl_fetch引擎中可以調用return(delive)指令和調用return(pass)指令
如果是調用return(delive)指令,則把後端取的資料儲存在緩存中
如果是調用return(pass)指令,則不把後端取的資料儲存在緩存中
vcl_deliver:【vcl_deliver引擎用于從緩存中取資料傳回給使用者】
vcl_error:【vcl_error引擎用于由varnish直接建構錯誤響應封包】
**********************實戰篇**************************
一、實驗拓撲圖和環境的介紹
<a href="http://blog.51cto.com/attachment/201310/113931323.png" target="_blank"></a>
環境介紹:
OS: RHEL 6.4
IP位址規劃
varnish:172.16.22.5
tomcat1:172.16.22.6
tomcat2:172.16.22.7
apache:172.16.22.8
tomcat上面搭建一個JspRun論和apache聯合測試動靜分離
二、各伺服器軟體的安裝
varnish:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<code>#==============下載下傳軟體後用yum安裝=================================</code>
<code>[root@varnish ~]</code><code># ls</code>
<code>anaconda-ks.cfg </code><code>install</code><code>.log.syslog varnish-docs-3.0.4-1.el6.x86_64.rpm</code>
<code>install</code><code>.log varnish-3.0.4-1.el6.x86_64.rpm varnish-libs-3.0.4-1.el6.x86_64.rpm</code>
<code>[root@varnish ~]</code><code># yum -y --nogpgcheck install varnish-*.rpm</code>
<code>#==============配置varnish的參數=============================</code>
<code>[root@varnish ~]</code><code># grep -v "#" /etc/sysconfig/varnish | grep -v "^$"</code>
<code>NFILES=131072</code>
<code>MEMLOCK=82000</code>
<code>NPROCS=</code><code>"unlimited"</code>
<code>RELOAD_VCL=1</code>
<code>VARNISH_VCL_CONF=</code><code>/etc/varnish/default</code><code>.vcl</code>
<code>VARNISH_LISTEN_PORT=80</code>
<code>VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1</code>
<code>VARNISH_ADMIN_LISTEN_PORT=6082</code>
<code>VARNISH_SECRET_FILE=</code><code>/etc/varnish/secret</code>
<code>VARNISH_MIN_THREADS=50</code>
<code>VARNISH_MAX_THREADS=1000</code>
<code>VARNISH_THREAD_TIMEOUT=120</code>
<code>VARNISH_STORAGE_FILE=</code><code>/var/lib/varnish/varnish_storage</code><code>.bin</code>
<code>VARNISH_STORAGE_SIZE=1G</code>
<code>VARNISH_MEMORY_SIZE=64M</code>
<code>VARNISH_STORAGE=</code><code>"malloc,${VARNISH_MEMORY_SIZE}"</code>
<code>VARNISH_TTL=120</code>
<code>DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \</code>
<code> </code><code>-f ${VARNISH_VCL_CONF} \</code>
<code> </code><code>-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \</code>
<code> </code><code>-t ${VARNISH_TTL} \</code>
<code> </code><code>-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \</code>
<code> </code><code>-u varnish -g varnish \</code>
<code> </code><code>-S ${VARNISH_SECRET_FILE} \</code>
<code> </code><code>-s ${VARNISH_STORAGE}"</code>
<code>#=====================開啟varnish==============================</code>
<code>[root@varnish ~]</code><code># service varnish start</code>
<code>Starting Varnish Cache: [ OK ]</code>
<code>[root@varnish ~]</code><code>#chkconfig --add varnish</code>
<code>[root@varnish ~]</code><code>#chkconfig varnish on</code>
tomcat1&tomcat2:安裝軟體的方法都是一樣
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<code>#============下載下傳所需的軟體==============================</code>
<code>[root@tomcat1 ~]</code><code># ls</code>
<code>anaconda-ks.cfg </code><code>install</code><code>.log jdk-7u9-linux-x64.rpm</code>
<code>apache-tomcat-7.0.42.</code><code>tar</code><code>.gz </code><code>install</code><code>.log.syslog JspRun!_6.0.0_GBK.zip</code>
<code>#==================安裝java開發工具包,jdk=================</code>
<code>[root@tomcat1 ~]</code><code># rpm -ivh jdk-7u9-linux-x64.rpm</code>
<code>Preparing... </code><code>#################################### [100%]</code>
<code> </code><code>1:jdk </code><code>#################################### [100%]</code>
<code>#==============安裝tomcat==================================</code>
<code>[root@tomcat1 ~]</code><code># tar xf apache-tomcat-7.0.42.tar.gz -C /usr/local/</code>
<code>#=============解壓JspRun論壇程式===========================</code>
<code>[root@tomcat1 ~]</code><code># unzip JspRun\!_6.0.0_GBK.zip</code>
<code>#============安裝mysql=====================================</code>
<code>[root@tomcat1 ~]</code><code># yum -y install mysql-server</code>
<code>[root@tomcat1 ~]</code><code># cd /usr/local/</code>
<code>[root@tomcat1 </code><code>local</code><code>]</code><code># ln -sv apache-tomcat-7.0.42 tomcat</code>
<code>`tomcat</code><code>' -> `apache-tomcat-7.0.42'</code>
<code>[root@tomcat1 </code><code>local</code><code>]</code><code># cd /etc/profile.d/</code>
<code>#=============建立java的環境變量===========================</code>
<code>[root@tomcat1 profile.d]</code><code># cat java.sh</code>
<code>export</code> <code>JAVA_HOME=</code><code>/usr/java/latest</code>
<code>export</code> <code>PATH=$JAVA_HOME</code><code>/bin</code><code>:$PATH</code>
<code>[root@tomcat1 profile.d]</code><code># source java.sh</code>
<code>#============建立tomcat的環境變量==========================</code>
<code>[root@tomcat1 profile.d]</code><code># cat tomcat.sh</code>
<code>export</code> <code>CATALINA_HOME=</code><code>/usr/local/tomcat</code>
<code>export</code> <code>PATH=$CATALINA_HOME</code><code>/bin</code><code>:$PATH</code>
<code>[root@tomcat1 profile.d]</code><code># source tomcat.sh</code>
<code>#=============檢查java是否安裝成功==========================</code>
<code>[root@tomcat1 profile.d]</code><code># java -version</code>
<code>java version </code><code>"1.7.0_09"</code>
<code>Java(TM) SE Runtime Environment (build 1.7.0_09-b05)</code>
<code>Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)</code>
<code>#========出現 Server字樣表示安裝成功==========================</code>
<code>[root@tomcat1 profile.d]</code><code># cd /usr/local/tomcat/conf/</code>
<code>#======修改tomcat的配置檔案===================================</code>
<code>[root@tomcat1 conf]</code><code># vim server.xml</code>
<code> </code><code><Connector port=</code><code>"80"</code> <code>protocol=</code><code>"HTTP/1.1"</code> <code>#修改監聽的端口為80</code>
<code> </code><code>connectionTimeout=</code><code>"20000"</code>
<code> </code><code>redirectPort=</code><code>"8443"</code> <code>/></code>
<code> </code><code><Engine name=</code><code>"Catalina"</code> <code>defaultHost=</code><code>"www.bbs.com"</code><code>></code>
<code>#把預設的主機改為建立的bbs主機</code>
<code> </code><code><Host name=</code><code>"www.bbs.com"</code> <code>appBase=</code><code>"/tomcat/bbs"</code> <code>#建立一個bbs的虛拟主機</code>
<code> </code><code>unpackWARs=</code><code>"true"</code> <code>autoDeploy=</code><code>"true"</code><code>></code>
<code> </code><code><Context path=</code><code>""</code> <code>docBase=</code><code>"/tomcat/bbs"</code> <code>/></code>
<code> </code><code><Valve className=</code><code>"org.apache.catalina.valves.AccessLogValve"</code> <code>directory=</code><code>"logs"</code>
<code> </code><code>prefix=</code><code>"bbs_access_log."</code> <code>suffix=</code><code>".txt"</code>
<code> </code><code>pattern=</code><code>"%h %l %u %t &quot;%r&quot; %s %b"</code> <code>/></code>
<code> </code><code><</code><code>/Host</code><code>></code>
<code> </code><code><</code><code>/Engine</code><code>></code>
<code>#======================建立存放虛拟主機檔案的目錄================</code>
<code>[root@tomcat1 conf]</code><code># mkdir -pv /tomcat/bbs</code>
<code>mkdir</code><code>: created directory `</code><code>/tomcat</code><code>'</code>
<code>mkdir</code><code>: created directory `</code><code>/tomcat/bbs</code><code>'</code>
<code>#=============把解壓的論壇程式copy到虛拟主機目錄下================</code>
<code>[root@tomcat1 conf]</code><code># cp -rp /root/upload/* /tomcat/bbs/</code>
<code>#============開啟tomcat=====================================</code>
<code>[root@tomcat1 conf]</code><code># catalina.sh start</code>
<code>Using CATALINA_BASE: </code><code>/usr/local/tomcat</code>
<code>Using CATALINA_HOME: </code><code>/usr/local/tomcat</code>
<code>Using CATALINA_TMPDIR: </code><code>/usr/local/tomcat/temp</code>
<code>Using JRE_HOME: </code><code>/usr/java/latest</code>
<code>Using CLASSPATH: </code><code>/usr/local/tomcat/bin/bootstrap</code><code>.jar:</code><code>/usr/local/tomcat/bin/tomcat-juli</code><code>.jar</code>
<code>#==========開啟mysql===================================</code>
<code>[root@tomcat1 conf]</code><code># service mysqld start</code>
<code>Starting mysqld: [ OK ]</code>
<code>[root@tomcat1 conf]</code><code># mysqladmin -uroot password 'mypass'</code>
<code>[root@tomcat1 conf]</code><code># mysql -uroot -pmypass</code>
<code>#=======建立論壇的資料庫,和給使用者授權============================</code>
<code>mysql> create database jsprun;</code>
<code>Query OK, 1 row affected (0.00 sec)</code>
<code>mysql> grant all on jsprun.* to </code><code>'jspuser'</code><code>@</code><code>'172.16.%.%'</code> <code>identified by </code><code>'jspmypass'</code><code>;</code>
<code>Query OK, 0 rows affected (0.00 sec)</code>
<code>mysql> flush privileges;</code>
<code>mysql> \q</code>
<code>Bye</code>
<code>#=============把論壇程式copy到apache伺服器上去=====================</code>
<code>[root@tomcat1 conf]</code><code># scp -rp /tomcat/bbs/* 172.16.22.8:/var/www/html/</code>
apache:
<code>[root@apache ~]</code><code># yum -y install httpd</code>
三、varnish記錄日志和後端伺服器的日志記錄
1)、varnish為後端server做代理
<code>[root@varnish ~]</code><code># cd /etc/varnish/</code>
<code>#======建立varnish的配置檔案,varnish有預設的配置檔案我default.vcl,這裡部落客</code>
<code>建立一個varnish的配置檔案</code><code>test</code><code>.vcl===================================</code>
<code>[root@varnish varnish]</code><code># cat test.vcl</code>
<code>backend apache {</code>
<code> </code><code>.host = </code><code>"172.16.22.8"</code><code>;</code>
<code> </code><code>.port = </code><code>"80"</code><code>;</code>
<code>}</code>
<code>#==============重新加載varnish的配置檔案========================</code>
<code>#===========通過varnishadm管理varnish===================</code>
<code>[root@varnish varnish]</code><code># varnishadm -S /etc/varnish/secret -T</code>
<code>#======用vcl.load指令加載建立的配置檔案test.vcl,a1為随便命名=========</code>
<code>varnish> vcl.load a1 .</code><code>/test</code><code>.vcl</code>
<code>200 </code>
<code>VCL compiled.</code>
<code>#=====使剛才加載的配置檔案為活動狀态=========================</code>
<code>varnish> vcl.use a1</code>
<code>varnish></code>
2)、後端apache server的配置
<code>[root@apache ~]</code><code># echo "<h1> static,apache server </h1>" >/var/www/html/test.html</code>
<code>[root@apache ~]</code><code># service httpd start</code>
3)、檢視varnish的日志和後端apache server的配置日志
<code>#=====開兩個終端一個用curl測試==============================</code>
<code>[root@varnish varnish]</code><code># curl http://172.16.22.5/test.html</code>
<code><h1> static,apache server <</code><code>/h1</code><code>></code>
<code>#=========一個用varnishlog檢視日志=========================</code>
<code>#==varnish的日志是儲存在記憶體中,varnish有預設的日志滾動機制==========</code>
<code>[root@varnish varnish]</code><code># varnishlog</code>
<code> </code><code>11 SessionOpen c 172.16.22.5 45379 :80</code>
<code> </code><code>11 ReqStart c 172.16.22.5 45379 910368572</code>
<code> </code><code>11 RxRequest c GET</code>
<code> </code><code>11 RxURL c </code><code>/test</code><code>.html</code>
<code> </code><code>11 RxProtocol c HTTP</code><code>/1</code><code>.1</code>
<code> </code><code>11 RxHeader c User-Agent: curl</code><code>/7</code><code>.19.7 (x86_64-redhat-linux-gnu) libcurl</code><code>/7</code><code>.19.7 NSS</code><code>/3</code><code>.14.0.0 zlib</code><code>/1</code><code>.2.3 libidn</code><code>/1</code><code>.18 libssh2</code><code>/1</code><code>.4.2</code>
<code> </code><code>11 RxHeader c Host: 172.16.22.5</code>
<code> </code><code>11 RxHeader c Accept: */*</code>
<code> </code><code>11 VCL_call c recv lookup</code>
<code> </code><code>11 VCL_call c </code><code>hash</code>
<code> </code><code>11 Hash c </code><code>/test</code><code>.html</code>
<code> </code><code>11 Hash c 172.16.22.5</code>
<code> </code><code>11 VCL_return c </code><code>hash</code>
<code> </code><code>11 Hit c 910368571</code>
<code> </code><code>11 VCL_call c hit deliver</code>
<code> </code><code>11 VCL_call c deliver deliver</code>
<code> </code><code>11 TxProtocol c HTTP</code><code>/1</code><code>.1</code>
<code> </code><code>11 TxStatus c 200</code>
<code> </code><code>11 TxResponse c OK</code>
<code> </code><code>11 TxHeader c Server: Apache</code><code>/2</code><code>.2.15 (CentOS)</code>
<code> </code><code>11 TxHeader c Last-Modified: Sat, 21 Sep 2013 12:28:41 GMT</code>
<code> </code><code>11 TxHeader c ETag: </code><code>"6085e-20-4e6e3ed5bc2bb"</code>
<code> </code><code>11 TxHeader c Content-Type: text</code><code>/html</code><code>; charset=UTF-8</code>
<code> </code><code>11 TxHeader c Content-Length: 32</code>
<code> </code><code>11 TxHeader c Accept-Ranges: bytes</code>
<code> </code><code>11 TxHeader c Date: Fri, 09 Aug 2013 04:09:04 GMT</code>
<code> </code><code>11 TxHeader c X-Varnish: 910368572 910368571</code>
<code> </code><code>11 TxHeader c Age: 25</code>
<code> </code><code>11 TxHeader c Via: 1.1 varnish</code>
<code> </code><code>11 TxHeader c Connection: keep-alive</code>
<code> </code><code>11 Length c 32</code>
<code> </code><code>11 ReqEnd c 910368572 1376021344.068876505 1376021344.069193125 0.000392437 0.000097752 0.000218868</code>
<code> </code><code>11 SessionClose c EOF</code>
<code> </code><code>11 StatSess c 172.16.22.5 45379 0 1 1 0 0 0 331 32</code>
<code>#================檢視apache記錄的日志======================</code>
<code>[root@apache ~]</code><code># tail /var/log/httpd/access_log</code>
<code>172.16.22.5 - - [21</code><code>/Sep/2013</code><code>:21:21:50 +0800] </code><code>"GET /test.html HTTP/1.1"</code> <code>200 32 </code><code>"-"</code> <code>"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"</code>
從上面可以看出,後端apache server記錄的是前端varnish的日志,然而這些日志對apache是無用的,apache應該記錄通路用戶端的日志
4)、修改varnish和apache的配置,使其apache記錄通路用戶端的日志
<code>#=========修改varnish的配置檔案======================</code>
<code>sub vcl_recv {</code>
<code> </code><code>set</code> <code>req.http.X-Forward-For = client.ip;</code>
<code> </code><code>if</code> <code>(req.url ~ </code><code>"\.(html)$"</code> <code>) {</code>
<code> </code><code>return</code><code>(pass);</code>
<code> </code><code>}</code>
<code> </code><code>set</code> <code>req.backend = apache;</code>
<code>#===============重新加載varnish的配置檔案=====================</code>
<code>[root@varnish varnish]</code><code># varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082</code>
<code>varnish> vcl.load a2 .</code><code>/test</code><code>.vcl </code><code>#每加載一次這個名稱都需要改變</code>
<code>varnish> vcl.use a2</code>
<code>200</code>
<code>#============修改apache的日志相關的配置=====================</code>
<code>[root@apache ~]</code><code># vim /etc/httpd/conf/httpd.conf</code>
<code>LogFormat </code><code>"%{X-Forward-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""</code> <code>combined</code>
<code>LogFormat </code><code>"%h %l %u %t \"%r\" %>s %b"</code> <code>common</code>
<code>LogFormat </code><code>"%{Referer}i -> %U"</code> <code>referer</code>
<code>LogFormat </code><code>"%{User-agent}i"</code> <code>agent</code>
<code>[root@apache ~]</code><code># service httpd restart</code>
<code>Stopping httpd: [ OK ]</code>
<code>Starting httpd: [ OK ]</code>
<code>[root@apache ~]</code><code>#</code>
5)、用浏覽器進行測試,檢視apache的日志記錄
<a href="http://blog.51cto.com/attachment/201310/150350354.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201310/150743218.png" target="_blank"></a>
四、varnish緩存命中的測試
此前已經驗證了是可以通過通路varnish而得到結果,則這是用到了varnish的反向代理功能,如何驗證varnish的緩存,而且确實varnish的緩存起到作用了。
<code>#===============修改varnish的配置檔案========================</code>
<code> </code><code>return</code><code>(lookup);</code>
<code>sub vcl_fetch {</code>
<code> </code><code>if</code> <code>(req.request == </code><code>"GET"</code> <code>&& req.url ~ </code><code>"\.(html|jpg|jpeg)$"</code><code>) {</code>
<code> </code><code>set</code> <code>beresp.ttl = 3600s;</code>
<code> </code><code>}</code>
<code>sub vcl_deliver {</code>
<code> </code><code>if</code> <code>(obj.hits > 0) {</code>
<code> </code><code>set</code> <code>resp.http.X-Cache = </code><code>"HIT from"</code> <code>+ </code><code>" "</code> <code>+ server.ip;</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>set</code> <code>resp.http.X-Cache = </code><code>"MISS"</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>return</code><code>(deliver);</code>
<code>varnish> vcl.load a3 .</code><code>/test</code><code>.vcl</code>
<code>varnish> vcl.use a3</code>
<code>#========測試是否緩存命中==================================</code>
<code>[root@varnish varnish]</code><code># curl -I http://172.16.22.5/test.html</code>
<code>HTTP</code><code>/1</code><code>.1 200 OK</code>
<code>Server: Apache</code><code>/2</code><code>.2.15 (CentOS)</code>
<code>Last-Modified: Sat, 21 Sep 2013 12:28:41 GMT</code>
<code>ETag: </code><code>"6085e-20-4e6e3ed5bc2bb"</code>
<code>Content-Type: text</code><code>/html</code><code>; charset=UTF-8</code>
<code>Content-Length: 32</code>
<code>Accept-Ranges: bytes</code>
<code>Date: Fri, 09 Aug 2013 04:59:04 GMT</code>
<code>X-Varnish: 910368607</code>
<code>Age: 0</code>
<code>Via: 1.1 varnish</code>
<code>Connection: keep-alive</code>
<code>X-Cache: MISS </code><code>#=====第一次測試為MISS================</code>
<code>Date: Fri, 09 Aug 2013 04:59:05 GMT</code>
<code>X-Varnish: 910368608 910368607</code>
<code>Age: 1</code>
<code>X-Cache: HIT from 172.16.22.5 </code><code>#=======第二次測試為hit=========</code>
五、varnish的負載均衡
<code>#====================修改varnish的配置檔案========================</code>
<code>backend tomcat1 {</code>
<code> </code><code>.host = </code><code>"172.16.22.6"</code><code>;</code>
<code>backend tomcat2 {</code>
<code> </code><code>.host = </code><code>"172.16.22.7"</code><code>;</code>
<code>director tomcats random {</code>
<code> </code><code>.retries = 2;</code>
<code> </code><code>{</code>
<code> </code><code>.backend = tomcat1;</code>
<code> </code><code>.weight = 1;</code>
<code> </code><code>.backend = tomcat2;</code>
<code> </code><code>if</code> <code>(req.url ~ </code><code>"\.(jsp)$"</code><code>) {</code>
<code> </code><code>set</code> <code>req.backend = tomcats;</code>
<code>varnish> vcl.load a4 .</code><code>/test</code><code>.vcl</code>
<code>varnish> vcl.use a4</code>
<code>#=================分别在tomcat1&tomcat2上建立tomcat的測試檔案=======</code>
<code>[root@tomcat1 ~]</code><code># cat /tomcat/bbs/test.jsp</code>
<code><%@ page language=</code><code>"java"</code> <code>%></code>
<code><%@ page </code><code>import</code><code>=</code><code>"java.util.*"</code> <code>%></code>
<code><html></code>
<code> </code><code><</code><code>head</code><code>></code>
<code> </code><code><title>JSP </code><code>test</code> <code>page.<</code><code>/title</code><code>></code>
<code> </code><code><</code><code>/head</code><code>></code>
<code> </code><code><body></code>
<code> </code><code><% out.println(</code><code>"Hello,tomcat1"</code><code>); %></code>
<code> </code><code><</code><code>/body</code><code>></code>
<code><</code><code>/html</code><code>></code>
測試tomcat的負載均衡
<a href="http://blog.51cto.com/attachment/201310/155529131.png" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201310/155613763.png" target="_blank"></a>
六、varnish動靜分離
<code>#====================修改varnish的配置檔案=========================</code>
<code> </code><code>.retries = 2;</code>
<code> </code><code>{</code>
<code> </code><code>.backend = tomcat1;</code>
<code> </code><code>.weight = 1;</code>
<code> </code><code>}</code>
<code> </code><code>{</code>
<code> </code><code>if</code> <code>(req.url ~ </code><code>"\.(html)$"</code> <code>) {</code>
<code> </code><code>return</code><code>(lookup);</code>
<code> </code><code>if</code> <code>(req.url ~ </code><code>"\.(jsp)$"</code><code>) {</code>
<code> </code><code>set</code> <code>req.backend = tomcats;</code>
<code> </code><code>set</code> <code>req.backend = apache;</code>
<code>varnish> vcl.load a5 .</code><code>/test</code><code>.vcl</code>
<code>varnish> vcl.use a5</code>
為了驗證是動靜分離的效果,我先把後端的apache的httpd停掉,看通路JspRun論壇出現啥效果
[root@apache ~]# service httpd stop
Stopping httpd: [ OK ]
<a href="http://blog.51cto.com/attachment/201310/161446442.png" target="_blank"></a>
論壇css樣式,圖檔等顯示不出來
然後開啟後端apache的httpd服務,通路JspRun論壇出現啥效果
[root@apache ~]# service httpd start
Starting httpd: [ OK ]
<a href="http://blog.51cto.com/attachment/201310/161832413.png" target="_blank"></a>
七、varnish對後端server的健康狀态的檢查
在實際生産環境中對後端server進行健康狀态檢查的時候靜态的在網頁根目錄建立一個test.html檢測頁面,動态的在網頁根目錄先建立一個test.jsp的檢測頁面
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<code>probe static_chk {</code>
<code> </code><code>.url = </code><code>"/test.html"</code><code>;</code>
<code> </code><code>.interval = 2s;</code>
<code> </code><code>.timeout = 2s;</code>
<code> </code><code>.expected_response = 200;</code>
<code>probe dynamic_chk {</code>
<code> </code><code>.url = </code><code>"/test.jsp"</code><code>;</code>
<code> </code><code>.probe = static_chk;</code>
<code> </code><code>.probe = dynamic_chk;</code>
<code>varnish> vcl.load a6 .</code><code>/test</code><code>.vcl</code>
<code>varnish> vcl.use a6</code>
<code>#============檢視後端server的健康狀态==========================</code>
<code>#===當測試頁面都存在的時候健康狀态檢測情況=============</code>
<code>[root@varnish ~]</code><code># varnishlog</code>
<code> </code><code>0 CLI - Rd </code><code>ping</code>
<code> </code><code>0 CLI - Wr 200 19 PONG 1376032176 1.0</code>
<code> </code><code>0 Backend_health - apache Still healthy 4--X-RH 8 3 8 0.011860 0.012733 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat2 Still healthy 4--X-RH 8 3 8 0.021719 0.017891 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat1 Still healthy 4--X-RH 8 3 8 0.021498 0.019532 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - apache Still healthy 4--X-RH 8 3 8 0.010489 0.012172 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat2 Still healthy 4--X-RH 8 3 8 0.025848 0.019880 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat1 Still healthy 4--X-RH 8 3 8 0.022760 0.020339 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code>#===當靜态的測試頁面不存在的時候健康狀态檢測情況=============</code>
<code> </code><code>0 Backend_health - tomcat2 Still healthy 4--X-RH 8 3 8 0.017432 0.015385 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat1 Still healthy 4--X-RH 8 3 8 0.032537 0.022571 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - apache Still healthy 4--X-R- 3 3 8 0.013448 0.013863 HTTP</code><code>/1</code><code>.1 404 Not Found </code><code>#發現靜态服務不能工作</code>
<code> </code><code>0 CLI - Wr 200 19 PONG 1376032579 1.0</code>
<code> </code><code>0 Backend_health - tomcat2 Still healthy 4--X-RH 8 3 8 0.012840 0.014748 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat1 Still healthy 4--X-RH 8 3 8 0.015876 0.020897 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - apache Went sick 4--X-R- 2 3 8 0.010309 0.013863 HTTP</code><code>/1</code><code>.1 404 Not Found</code>
<code>#===當靜态的服務不存在的時候健康狀态檢測情況=============</code>
<code> </code><code>0 Backend_health - tomcat1 Still healthy 4--X-RH 8 3 8 0.017558 0.017736 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat2 Still healthy 4--X-RH 8 3 8 0.017711 0.015071 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - apache Still sick ------- 0 3 8 0.000000 0.013158</code>
<code> </code><code># 檢測apache沒有200的狀态響應</code>
<code> </code><code>0 Backend_health - tomcat1 Still healthy 4--X-RH 8 3 8 0.022980 0.019047 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 CLI - Wr 200 19 PONG 1376032663 1.0</code>
<code> </code><code>0 Backend_health - tomcat2 Still healthy 4--X-RH 8 3 8 0.014621 0.014958 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat1 Still healthy 4--X-RH 8 3 8 0.025766 0.020727 HTTP</code><code>/1</code><code>.1 200 OK</code>
<code> </code><code>0 Backend_health - tomcat2 Still healthy 4--X-RH 8 3 8 0.014910 0.014946 HTTP</code><code>/1</code><code>.1 200 OK</code>
八、varnish實作防盜鍊
<code>if</code> <code>(req.http.referer ~ </code><code>"http://.*"</code><code>) {</code>
<code>#防盜鍊的定義,隻容許本站點和google搜尋引擎可以通路,其它站點不能通路</code>
<code> </code><code>if</code> <code>( !(req.http.referer ~ </code><code>"http://.*jie\.com"</code>
<code> </code><code>|| req.http.referer ~ </code><code>"http://.*google\.com.*"</code>
<code> </code><code>)) {</code>
<code> </code><code>set</code> <code>req.http.host = </code><code>"www.jie.com"</code><code>;</code>
<code> </code><code>set</code> <code>req.url = </code><code>"/unreferer/logo.html"</code><code>;</code>
<code>varnish> vcl.load a7 .</code><code>/test</code><code>.vcl</code>
<code>varnish> vcl.use a7</code>
<code>#============建立一個用于其它網站通路本網站的回報資訊=================</code>
<code>[root@varnish varnish]</code><code># mkdir /unreferer/</code>
<code>[root@varnish varnish]</code><code># cat /unreferer/logo.html</code>
<code>Only my website and google</code>
<code>#============驗證防盜鍊=======================</code>
<code>#====當為其它站點的網站通路本站點的varnish時,直接傳回給一個自定義的文本檔案======================================</code>
<code>[root@varnish varnish]</code><code># curl -e http://www.hello.com/ http://172.16.22.5/test.html</code>
<code><!DOCTYPE HTML PUBLIC </code><code>"-//IETF//DTD HTML 2.0//EN"</code><code>></code>
<code><html><</code><code>head</code><code>></code>
<code><title>404 Not Found<</code><code>/title</code><code>></code>
<code><</code><code>/head</code><code>><body></code>
<code><h1>Not Found<</code><code>/h1</code><code>></code>
<code><p>The requested URL </code><code>/unreferer/logo</code><code>.html was not found on this server.<</code><code>/p</code><code>></code>
<code><hr></code>
<code><address>Apache</code><code>/2</code><code>.2.15 (CentOS) Server at www.jie.com Port 80<</code><code>/address</code><code>></code>
<code><</code><code>/body</code><code>><</code><code>/html</code><code>></code>
<code>#===============當為本網站自己通路時,則傳回本網站的首頁=============</code>
<code>[root@varnish varnish]</code><code># curl -e http://www.jie.com/ http://172.16.22.5/test.html</code>
<code>ok</code>
<code>#===============當為google搜尋引擎通路時,也傳回本網站的首頁=============</code>
<code>[root@varnish varnish]</code><code># curl -e http://www.google.com/ http://172.16.22.5/test.html</code>
<code>[root@varnish varnish]</code><code>#</code>
本文轉自 jie783213507 51CTO部落格,原文連結:http://blog.51cto.com/litaotao/1305373,如需轉載請自行聯系原作者