实验环境:
一个客户端,一个反向代理,多个后端服务器
代理服务器关掉防火墙,selinux设置为disabled,让它们处于同一个网段,方便测试
代理:cdn加速,反向代理,负载均衡
客户端:测试
后端服务器:提供服务
正向代理:客户端知道服务器端,但是必须通过一个代理服务器
反向代理:客户端不知道服务器端,知道代理服务器端,访问代理服务器端,由代理服务器转发请求,转发回应消息。
varnish工作原理图
实验步骤:
1、下载并安装varnish
2、修改配置文件
1)、/etc/varnish/varnish.params :修改端口为80
2)、 /etc/varnish/default.vcl :添加代理服务器的信息
backend default {
.host = "代理的ip地址"
.port = "80"
}
2、配置缓存命中
1)、/etc/varnish/default.vcl
2)、测试
curl -I 代理服务器ip地址
3、清空缓存
1)、命令清空缓存:
varnishadm ban.url "~" / //清除所有
varnishadm ban.url "~" /index.html //清除index.html页面缓存
2)、界面清空缓存:
获取压缩包bansys.zip
配置:
yum install httpd php unzip -y
unzip bansys.zip -d /var/www/html/ #-d指定解压路径
cd /var/www/html/
ls
mv bansys/* ../ #把解压的内容移到上以及目录/var/www/html
配置 /var/www/html/config.php 文件:
<?php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.60.1'),
'port' => '8080',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.com' => $var_group1,
);
?>
/etc/varnish/default.vcl:设置访问控制,缓存清理功能
acl westos { #设置访问控制
"127.0.0.1"; #允许自己
"172.25.60.0"/24; #允许172.25.60/24网段
}
if (req.method == "BAN") {
if (!client.ip ~ westos) {
return (synth(405,"Not allowed."));
}
ban("req.url ~ " + req.url);
return(purge); #清理缓存
}
4、反向代理
1)、vim /etc/varnish/default.vcl
#配置两个web服务器
backend web1 {
.host = "172.25.60.2";
.port = "80";
}
backend web2 {
.host = "172.25.60.3";
.port = "80";
}
#当访问 www.westos.org 域名时从 web1 上取数据,访问 bbs.westos.org 域名时到 web2 取数据,访问其他页面报错。
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
}
elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
}
else {
return (synth(405));
}
2)、客户端解析测试
根据本地解析,都解析到了172.25.1.101(server1),它通过varnish的配置文件规则访问不同的服务器
5、负载均衡
1)、 /etc/varnish/default.vcl
##导入directors模块,进行轮询等操作
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
##定义负载均衡模式
sub vcl_init {
new lb = directors.round_robin(); //轮询上面定义的两个站点web1和web2
lb.add_backend(web1);
lb.add_backend(web2);
}
##修改访问模式
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
#访问www.westos.org去轮询web1h和web2
return(pass)
#因为存在缓存,为了测试方便,不进行缓存。
}
elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
#访问bbs.westos.org时去访问web2
}
else {
return (synth(405));
}
}
2)、测试