Varnish相关功能实现

简介:

Varnish是一款高性能的开源http加速器,现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构,下面就varnish的相关功能实现做个总结

Varnish安装

下载地址:http ://repo.varnish-cache.org 目前最新版本为5.2.0:
最新版本
本次测试用的是varnish-3.0.5-1版本的rpm包:
版本
直接yum安装即可:

yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y

安装好以后在/etc/varnish/目录下会自动生成varnish主配置文件和密钥,varnish全局配置文件路径为:/etc/sysconfig/varnish

[root@server1 varnish]# ls
default.vcl  secret          #default.vcl 为varnish主配置文件,secret为密钥
[root@server1 varnish]# 

至此vaenish的安装就完成了

反向代理功能实现:

环境搭建

server1:172.25.7.1  #安装varnish
server2:172.25.7.2  #安装httpd

1.编辑varnish主配置文件: vim /etc/varnish/default.vcl

  7 backend default {
  8   .host = "172.25.7.2";  #意为当客户端访问本机时,本机到ip为172.25.7.2主机去取数据
  9   .port = "80";      #端口为80,即httpd服务端口
 10 }

vim /etc/sysconfig/varnish #编辑varnish全局配置文件,将默认6081端口修改为80端口,即当客户端访问本机80端口时,本机到172.25.7.2的80端口去找:

VARNISH_LISTEN_PORT=80  #将文件中此处默认的6081端口修改为80

如不修改默认端口,客户端在访问时,在ip后加上默认端口也行,即:

curl 172.25.7.1:6081

/etc/init.d/varnish start #启动varnish服务

2.在172.25.7.2主机的安装httpd,

yum install httpd -y

并在默认发布目录下新建并编辑测试页:
vim /var/www/html/index.html

<h1>www.hc.com-server2</h1>

/etc/init.d/httpd start #启动httpd服务

3.测试
在客户端访问安装了varnish的主机ip,这里直接在客户机终端进行访问:

[root@hguan07 ~]# curl 172.25.7.1 #修改端口后访问方式
<h1>www.hc.com-server2</h1>

未修改varnish默认端口访问方式:

[root@hguan07 ~]# curl 172.25.7.1:6081
<h1>www.hc.com-server2</h1>

反向代理测试成功,但如果服务端(172.25.7.2)修改了测试页中的内容,客户端访问的内容并不会第一时间改变,这是因为varnish主机中缓存没有过期,为了第一时间让客户端访问到服务端更新后的内容,需要做cdn推送,这里用varnishadm ban.url .*$命令来手动清除缓存,然后客户端再访问的时候,就可以看到服务端更新后的内容:

清除缓存测试
首先将172.25.7.2主机中的httpd测试页内容做如下修改:

<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server2</h1>

查看客户端访问效果:

[root@hguan07 ~]# curl 172.25.7.1    #依然访问的是之前的页面,因为缓存还没有用完
<h1>www.hc.com-server2</h1>
[root@hguan07 ~]# curl 172.25.7.1
<h1>www.hc.com-server2</h1>
[root@hguan07 ~]# curl 172.25.7.1
<h1>www.hc.com-server2</h1>

在安装了varnish的172.25.7.1主机手动清除缓存:

[root@server1 ~]# varnishadm ban.url .*$

客户端再次访问效果:

[root@hguan07 ~]# curl 172.25.7.1
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server2</h1>
[root@hguan07 ~]# curl 172.25.7.1
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server2</h1>

在这个过程中,客户端只和安装了varnish的主机进行交互,而实际访问的内容则是在(172.25.7.2)上

varnish的主机就是做了代理的服务,当客户端访问时,先查看缓存(cache)中是否有数据,如果没有,就去后端服务器中取,如果有,就直接反馈给客户端,这样比客户端直接访问服务器速度更快,而且也减轻了后端服务器的压力

定义多个不同域名站点的后端服务器

增加一台主机server3:

server3:172.25.7.3  #安装httpd

1.同样是编辑varnish主配置文件: vim /etc/varnish/default.vcl

backend server2 {
  .host = "172.25.7.2";    #定义一个后端服务器地址和端口
  .port = "80";
}

backend server3 {         
  .host = "172.25.7.3";    #定义另一个后端服务器地址和端口
  .port = "80";
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?hc.com") {     #客户端访问www.hc.com到server2去取,看到的是server2主机上的内容
set req.http.host = "www.hc.com";
set req.backend = server2;
} elsif (req.http.host ~ "^bbs.hc.com") {   #客户端访问bbs.hc.com时到server3去取
set req.backend = server3;
} else {
    error 404 "hc cache";
    }       #客户端访问其他时直接报错
}
[root@server1 ~]# /etc/init.d/varnish restart #重启varnish
Stopping Varnish Cache:                                   [  OK  ]
Starting Varnish Cache:                                   [  OK  ]

2.在server3主机下载httpd:

yum install httpd -y

新建并编辑默认发布文件测试页:vim /var/www/html/index.html

<h1>www.hc.com-server3</h1>
[root@server3 ~]# /etc/init.d/httpd start  #启动httpd

3.在客户端做本地解析,因为没有做DNS,所以需要做本地解析:
vim /etc/hosts #本地解析文件

172.25.7.1  server1 www.hc.com bbs.hc.com

测试
在客户端进行访问,测试也是在终端进行:

[root@hguan07 ~]# curl www.hc.com  
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server2</h1>
[root@hguan07 ~]# curl bbs.hc.com
<h1>www.hc.com-server3</h1>

访问其他时报错,包括本机ip:
访问效果

负载均衡

1.编辑配置文件: vim /etc/varnish/default.vcl

director lb round-robin {  #负载均衡方式为轮询
        { .backend = server2; }
        { .backend = server3; }
}

sub vcl_recv {
        if (req.http.host ~ "^(www.)?hc.com") {
                set req.http.host = "www.hc.com";
                set req.backend = lb;
                return (pass); #为了测试方便,不进行缓存
                }
        elsif (req.http.host ~ "^bbs.hc.com") {
                set req.backend = server3;
                }
        else    {
                error 404 "hc cache";
                }

}

刷新varnish:

[root@server1 ~]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2017-10-02T21:58:51
VCL compiled.

available       2 boot
active          0 reload_2017-10-02T21:58:51

Done

2.将server2上的测试页内容修改为以下,便于测试:
vim /var/www/html/index.html

<h1>www.hc.com-server2</h1>

测试
为了便于观察负载均衡情况,使用for循环语句:

[root@hguan07 ~]# for i in {1..6}; do curl www.hc.com ; done
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server3</h1>
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server3</h1>
<h1>www.hc.com-server2</h1>
<h1>www.hc.com-server3</h1>

负载均衡实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值