天天看点

实战varnish

实战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&amp;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>' -&gt; `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>&lt;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>/&gt;</code>

<code> </code><code>&lt;Engine name=</code><code>"Catalina"</code> <code>defaultHost=</code><code>"www.bbs.com"</code><code>&gt;</code>

<code>#把默认的主机改为新建的bbs主机</code>

<code> </code><code>&lt;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>&gt;</code>

<code>      </code><code>&lt;Context path=</code><code>""</code> <code>docBase=</code><code>"/tomcat/bbs"</code> <code>/&gt;</code>

<code>        </code><code>&lt;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 &amp;quot;%r&amp;quot; %s %b"</code> <code>/&gt;</code>

<code>      </code><code>&lt;</code><code>/Host</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>/Engine</code><code>&gt;</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&gt; create database jsprun;</code>

<code>Query OK, 1 row affected (0.00 sec)</code>

<code>mysql&gt; 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&gt; flush privileges;</code>

<code>mysql&gt; \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&gt; vcl.load a1 .</code><code>/test</code><code>.vcl</code>

<code>200  </code>

<code>VCL compiled.</code>

<code>#=====使刚才加载的配置文件为活动状态=========================</code>

<code>varnish&gt; vcl.use a1</code>

<code>varnish&gt;</code>

2)、后端apache server的配置

<code>[root@apache ~]</code><code># echo "&lt;h1&gt; static,apache server &lt;/h1&gt;" &gt;/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>&lt;h1&gt; static,apache server &lt;</code><code>/h1</code><code>&gt;</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&gt; vcl.load a2 .</code><code>/test</code><code>.vcl  </code><code>#每加载一次这个名称都需要改变</code>

<code>varnish&gt; 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\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\""</code> <code>combined</code>

<code>LogFormat </code><code>"%h %l %u %t \"%r\" %&gt;s %b"</code> <code>common</code>

<code>LogFormat </code><code>"%{Referer}i -&gt; %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>&amp;&amp; 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 &gt; 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&gt; vcl.load a3 .</code><code>/test</code><code>.vcl</code>

<code>varnish&gt; 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&gt; vcl.load a4 .</code><code>/test</code><code>.vcl</code>

<code>varnish&gt; vcl.use a4</code>

<code>#=================分别在tomcat1&amp;tomcat2上建立tomcat的测试文件=======</code>

<code>[root@tomcat1 ~]</code><code># cat /tomcat/bbs/test.jsp</code>

<code>&lt;%@ page language=</code><code>"java"</code> <code>%&gt;</code>

<code>&lt;%@ page </code><code>import</code><code>=</code><code>"java.util.*"</code> <code>%&gt;</code>

<code>&lt;html&gt;</code>

<code>  </code><code>&lt;</code><code>head</code><code>&gt;</code>

<code>    </code><code>&lt;title&gt;JSP </code><code>test</code> <code>page.&lt;</code><code>/title</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>/head</code><code>&gt;</code>

<code>  </code><code>&lt;body&gt;</code>

<code>    </code><code>&lt;% out.println(</code><code>"Hello,tomcat1"</code><code>); %&gt;</code>

<code>  </code><code>&lt;</code><code>/body</code><code>&gt;</code>

<code>&lt;</code><code>/html</code><code>&gt;</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&gt; vcl.load a5 .</code><code>/test</code><code>.vcl</code>

<code>varnish&gt; 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&gt; vcl.load a6 .</code><code>/test</code><code>.vcl</code>

<code>varnish&gt; 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&gt; vcl.load a7 .</code><code>/test</code><code>.vcl</code>

<code>varnish&gt; 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>&lt;!DOCTYPE HTML PUBLIC </code><code>"-//IETF//DTD HTML 2.0//EN"</code><code>&gt;</code>

<code>&lt;html&gt;&lt;</code><code>head</code><code>&gt;</code>

<code>&lt;title&gt;404 Not Found&lt;</code><code>/title</code><code>&gt;</code>

<code>&lt;</code><code>/head</code><code>&gt;&lt;body&gt;</code>

<code>&lt;h1&gt;Not Found&lt;</code><code>/h1</code><code>&gt;</code>

<code>&lt;p&gt;The requested URL </code><code>/unreferer/logo</code><code>.html was not found on this server.&lt;</code><code>/p</code><code>&gt;</code>

<code>&lt;hr&gt;</code>

<code>&lt;address&gt;Apache</code><code>/2</code><code>.2.15 (CentOS) Server at www.jie.com Port 80&lt;</code><code>/address</code><code>&gt;</code>

<code>&lt;</code><code>/body</code><code>&gt;&lt;</code><code>/html</code><code>&gt;</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,如需转载请自行联系原作者