CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
Varnish原理:varnish是一个http反向代理的缓存。它从客户端接收请求然后尝试从缓存中获取数据来响应客户端的请求,如果varnish不能从缓存中获得数据来响应客户端,它将转发请求到后端(backend servers),获取响应同时存储,最后交付给客户端。
具体配置:
server1 充当varnish server2和3充当服务器
server1: 172.25.62.1
server2:172.25.62.2
server3:172.25.62.3
真机:172.25.62.250
server1上获取安装包进行安装
安装完成之后开始文件配置
[root@server1 ~]# vim /etc/security/limits.conf ##修改最大文件数
varnish - 65535 #在最后一行添加
[root@server1 ~]# vim /etc/sysconfig/varnish
##因为要用http服务测试所以把varnish的端口改为80 并且修改最大文件数
8 NFILES=65535
66 VARNISH_LISTEN_PORT=80
[root@server1 ~]# vim /etc/varnish/default.vcl ##修改varnish配置文件
8 .host = "172.25.62.2"; ##后端服务器的ip
9 .port = "80"; ##端口
[root@server1 ~]# /etc/init.d/varnish start ##启动varnish
server2上:在server上安装httpd服务并在默认发布目录下写入文件
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# vim index.html
<h1>hello server2</h1>
[root@server2 html]# /etc/init.d/httpd start ##开启服务
测试: 在浏览器输入server1的ip(172.25.62.1)看见的是server2中index.html中的内容 如果无法访问可能是你的防火墙没关
2.利用varnish查看缓存命中情况
需要在真机上添加本地解析
[root@foundation62 varnish]# vim /etc/hosts
172.25.62.1 www.westos.org bbs.westos.org
在server1上:
[root@server1 ~]# vim /etc/varnish/default.vcl ##添加下面内容到配置文件
11 sub vcl_deliver {
12 if (obj.hits > 0) {
13 set resp.http.X-Cache = "HIT from westos cache";
14 }
15 else {
16 set resp.http.X-Cache = "MISS from westos cache";
17 }
18 return (deliver);
19 }
[root@server1 ~]# /etc/init.d/varnish restart ##重启服务
##检测:真机(客户端) curl -I www.westos.org
#第一次没找到,会去server2服务器找(返回的age的值为0)找到后会缓存起来
curl -I www.westos.org
#第二次直接从缓存区域拿出来,提供给客户端
3.负载均衡
定义多个不同域名站点的后端服务器 访问其他域名时报错404
新开一台机器server3安装htpd服务 同样在默认发布目录下写上文件
[root@server3 ~]# yum install -y httpd
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# vim index.html
<h1>hello server3</h1>
[root@server3 html]# /etc/init.d/httpd start
在server1上:
[root@server1 ~]# vim /etc/varnish/default.vcl
7 backend web1 {
8 .host = "172.25.62.2";
9 .port = "80";
10 }
11 backend web2 {
12 .host = "172.25.62.3";
13 .port = "80";
14 }
15 sub vcl_recv {
16 if (req.http.host ~ "^(www.)?westos.org") {
17 set req.http.host = "www.westos.org";
18 set req.backend = web1; ##当访问www.westos.com时从web1上获取数据
19 } elsif (req.http.host ~ "^bbs.westos.org") {
20 set req.backend = web2; ##当访问bbs.westos.com时从web2上获取数据
21 } else {error 404 "westos cache"; ##访问其他域名时报错
22 }
23 }
24 sub vcl_deliver {
25 if (obj.hits > 0) {
26 set resp.http.X-Cache = "HIT from westos cache";
27 }
28 else {
29 set resp.http.X-Cache = "MISS from westos cache";
30 }
31 return (deliver);
32 }
[root@server1 ~]# /etc/init.d/varnish restart #$重启服务
测试:
4.轮询
在server1上:
7 backend web1 {
8 .host = "172.25.62.2"; ##web1对应的IP是172.25.62.2
9 .port = "80";
10 }
11 backend web2 {
12 .host = "172.25.62.3"; ##web2对应的IP是172.25.62.3
13 .port = "80";
14 }
15 director lb round-robin {
16 { .backend = web1; }
17 { .backend = web2; }
18 }
19 sub vcl_recv {
20 if (req.http.host ~ "^(www.)?westos.org") {
21 set req.http.host = "www.westos.org";
22 set req.backend = lb;
23 return (pass);
24 } elsif (req.http.host ~ "^bbs.westos.org") {
25 set req.backend = lb;
26 return (pass); ##为了测试方便不进行缓存
27 } else {error 404 "westos cache";
28 }
29 }
30
31 sub vcl_deliver {
32 if (obj.hits > 0) {
33 set resp.http.X-Cache = "HIT from westos cache";
34 }
35 else {
36 set resp.http.X-Cache = "MISS from westos cache";
37 }
38 return (deliver);
39 }
[root@server1 ~]# /etc/init.d/varnish restart
测试:在真机上 curl www.westos.org 重复几次会得到不同的index.html结果
5.varnish搭建cdn推送平台
在server1上安装php和httpd 并将httpd的端口改为8080
[root@server1 ~]# yum install -y php httpd
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
136 Listen 8080
[root@server1 ~]# /etc/init.d/httpd start
2.获取bansys.zip包并解压到apache默认发布目录下
[root@server1 ~]# unzip bansys.zip -d /var/www/html/##没有unzip命令可以用yum安装 -d指定目录
[root@server1 ~]# cd /var/www/html/bansys/
[root@server1 bansys]# vim config.php
<?php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.6.2.1'),
'port' => '8080', );
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group3,
'bba.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
server1上修改varnish文件
[root@server1 bansys]# vim /etc/varnish/default.vcl
7 acl westos{
8 "127.0.0.1";
9 "172.25.62.0"/24;
10 }
11 backend web1 {
12 .host = "172.25.62.2"; ##web1对应的IP是172.25.62.2
13 .port = "80";
14 }
15 backend web2 {
16 .host = "172.25.62.3"; ##web2对应的IP是172.25.62.3
17 .port = "80";
18 }
19 director lb round-robin {
20 { .backend = web1; }
21 { .backend = web2; }
22 }
23 sub vcl_recv {
24 if (req.request == "BAN"){
25 if (!client.ip ~ westos){
26 error 405 "Not allowed.";
27 }
28 ban("req.url ~ " + req.url);
29 error 200 "ban added";
30 }
31 if (req.http.host ~ "^(www.)?westos.org") {
32 set req.http.host = "www.westos.org";
33 set req.backend = lb;
34 return (pass);
35 } elsif (req.http.host ~ "^bbs.westos.org") {
36 set req.backend = lb;
37 return (pass); ##为了测试方便不进行缓存
38 } else {error 404 "westos cache";
39 }
40 }
41 sub vcl_deliver {
42 if (obj.hits > 0) {
42 if (obj.hits > 0) {
43 set resp.http.X-Cache = "HIT from westos cache";
44 }
45 else {
46 set resp.http.X-Cache = "MISS from westos cache";
47 }
48 return (deliver);
49 }
[root@server1 bansys]# /etc/init.d/varnish restart
测试:在真机浏览器http://172.25.62.1:8080/bansys/