当客户端访问服务器时,首先到达的是CDN反向代理,如果代理没有找到需要的资源,再到达后端服务器。之前写过使用squid做CDN的反向代理,但varnish是开源的高性能的HTTP加速器,挪威最大的在线报纸 Verdens Gang 仅使用了3台Varnish就代替了原来的12台Squid,性能比以前更好。所以大多数公司都使用varnish来做CDN的反向代理。
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率(hit/(hit+miss) )。CDN的关键技术主要有内容存储和分发技术。 —来自百度百科
CDN的缓存有生命周期,会定期清理,也会在缓存空间耗尽的时候将LRU(最近最少使用)清理掉。
URL:当用户发出请求时,首先会查询缓存,然后进行新鲜度检测,如果不够新鲜会重新读取,再给用户发送发送响应并记录到日志。
接下来进行varnish反向代理的搭建
我们使用两台虚拟机
server1:作代理主机
server2:作被访问的主机
在server1上:
1.首先在官网上获取varnish的资源
2.安装varnish
rpm -qc varnish-3.0.5-1.el6.x86_64 ##查看配置文件位置
查看配置文件
最大打开文件个数:(NFILES=131072)
内存需求:(MEMLOCK=82000)
进程数:(NPROCS=“unlimited”)不限制
查询系统信息
ulimit -l #查看系统内存信息
sysctl -a | grep file #查看系统文件数
我们的最大打开文件数满足需求但是内存不满足,这时候我们需要让varnish受到限制。
3.添加信息
在varnish开启时会产生root和自身的两个进程,我们可以在/etc/security/limits.conf添加信息,让varnish以为自己会得到想要的一切。
vim /etc/security/limits.conf
varnish - nofile 131072
varnish - memlock 82000
varnish - nproc unlimited
4.修改通过代理服务器要访问的主机
vim /etc/varnish/default.vcl
backend default {
.host = "172.25.80.2";
.port = "80";
}
5.修改端口
vim /etc/sysconfig/varnish
66 VARNISH_LISTEN_PORT=80
6.重启服务
/etc/init.d/varnish restart
netstat -antlp | grep 80(查看端口)
server2主机上
1.安装apache服务
yum install httpd -y
2.编写默认发布文件
vim /var/www/html/index.html
server2.example.com
3.重启httpd服务
/etc/init.d/httpd restart
测试:
在浏览器输入代理的ip,实际上看到的是服务器
如何查看是否名中缓存
1.在配置文件编辑是否命中的反馈信息
vim /etc/varnish/default.vcl
11
12 sub vcl_deliver {
13 if (obj.hits>0){
14 set resp.http.X-Cache = "HIT from westos cache"; #命中显示
15 }
16 else {
17 set resp.http.X-Cache = "MISS from westos cache"; #未命中显示
18 }
19 return (deliver);
20 }
2.重新让读取配置文件(一定不能restart)
/etc/init.d/varnish reload
3.在客户端验证是否命中代理的缓存
curl -I 172.25.80.1
4.清理代理的缓存信息
varnishadm ban.url .*$ #清除所有缓存
varnishadm ban.url /index.html #清除url部分,可能并不会达到效果(再次执行清除所有缓存的命令)
客户端再次访问172.25.80.1/index.html 会未命中
验证:清一次在客户端进行查看
注意:默认的缓存存在最大时间是120s(/etc/sysconfig/varnish)
定义不同域名站点的后端服务器,通过域名会访问不同的后端服务器
首先打开server3
打开httpd服务
vim /var/www/html/index.html
server3.example.com
1.修改配置文件
vim /etc/varnish/default.vcl
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org"; #将以www.westos.org开头,但可以忽略www的网址提议规定为www.westos.org
set req.backend = web1;
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
重新加载
/etc/init.d/varnish reload
2.修改server2和server3后端服务器的默认发布页面
server2:
server2:www.westos.org
server3:
server3:bbs.westos.org
3.在客户端进行地址解析
vim /etc/hosts
4 172.25.80.1 server1 www.westos.org bbs.westos.org
测试
负载均衡
目的: 让客户端访问www.westos.org的时候,客户端主机server2和server3轮循;访问bbs.westos.org时,只访问server3
1.在server1上设定varnish代理主机配置文件
vim /etc/varnish/default.vcl
director lb round-robin {
{.backend = web1;}
{.backend = web2;}
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb; ##当访问www.westos.org时进入轮询
return (pass); #跳过缓存,便于看到实验效果
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {
error 404 "westos cache";
}
}
/etc/init.d/varnish reload
测试
2.在server3上建立虚拟主机
vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot /www
ServerName www.westos.org
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /bbs
ServerName bbs.westos.org
</VirtualHost>
mkdir /www
vim /www/index.html
<h1>server3 - www.westos.org</h1>
mkdir /bbs
vim /bbs/index.html
<h1>server3 - bbs.westos.org</h1>
测试
搭建清理缓存的推送平台
1.首先在server1上开启httpd服务
2.获取平台的搭建资源并解压
yum install unzip-6.0-1.el6.x86_64 -y
unzip bansys.zip -d /var/www/html
mv /var/www/html/bansys/* /var/www/html
3.下载php服务
yum install php -y
4.修改配置文件
vim /var/www/html/config.php
<?php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.80.1'),
'port' => '8080',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
5.修改httpd端口启动服务
vim /etc/httpd/conf/httpd.conf
Listen 8080
/etc/init.d/httpd start
查询端口
netstat -tnlp
tcp 0 0 :::8080 :::*
6.修改varnish的配置文件
vim /etc/varnish/default.vcl
sub vcl_recv {
if (req.request == "BAN") {
if (!client.ip ~ westos) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}
测试