一、CDN的了解
CDN(Content Delivery Network)是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
CDN的基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。
搭建CDN系统可以选择3种主流方案:
1. squid 2. varnish 3. Nginx+memcache
二、varnish简介
Varnish是一款高性能的开源HTTP加速器,Varnish的功能与Squid服务器相似,都可以用来做HTTP缓存。 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能优越于Squid
VCL (Varnish Configuration Language)处理流程图
处理过程的步骤有:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
实验:
配置varnish服务器
server1
1.下载安装varnish软件包http://varnish-cache.org/releases/
2.修改varnish的监听端口:
[root@server1 ~]# vim /etc/sysconfig/varnish
66 VARNISH_LISTEN_PORT=80
# 设置为监听80端口
3.修改配置文件
修改安全限制文件,保证流量大时,服务正常
内核允许的最大数
[root@server1 ~]# sysctl -a |grep file
fs.file-nr = 416 0 98862
fs.file-max = 98862
varnish软件的打开文件最大数
默认数量大于内核操作的文件数目.故做如下修改:
[root@server1 varnish]# vim /etc/sysconfig/varnish
8 NFILES=96666
操作系统允许的最大数目:
根据此文件的参数修改内存空间和线程数,文件数应该介于上述两者之间
[root@server1 ~]# vim /etc/sysconfig/varnish
作出如下修改:
[root@server1 ~]# vim /etc/security/limits.conf
varnish - nofile 96667
varnish - memlock 82000
varnish - nproc unlimited
4.开启服务
[root@server1 ~]# /etc/init.d/varnish start
[root@server1 ~]# netstat -antlp
server2网络服务器
下载apache并开启服务
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start
编辑发布内容
[root@server2 ~]# vim /var/www/html/index.html
<h1>www.westos.org</h1>
server1
修改varnish监听服务器的ip
[root@server1 ~]# vim /etc/varnish/default.vcl
backend default {
.host = "172.25.7.1";
.port = "80";
}
varnish重新加载
[root@server1 ~]# /etc/init.d/varnish reload
真机测试:
实验二:查看缓存命中情况
server1:
[root@server1 ~]# vim /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
重新加载varnish
[root@server1 ~]# /etc/init.d/varnish reload
客户端真机测试:
添加本地解析
[root@foundation7 images]# vim /etc/hosts
172.25.7.1 www.westos.org
注意:varnish默认缓存时间为120s,超过120s自动清除缓存
实验三:
通过carnihadm后东清除缓存
varnishadm ban.url .*$ ##清除所有
varnishadm ban.url /index.html ##清除 index.html 页面缓存
varnishadm ban.url /admin/$ ##清除 admin 目录缓存
实验四:定义多个不同域名站点的后段服务器
server1:
修改下列代码:
[root@server1 ~]# vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.7.2";
.port = "80";
}
backend web2 {
.host = "172.25.7.3";
.port = "80";
}
## 当访问 www.westos.org或者westos.com 域名时从 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 = web1;
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
重读配置文件
root@server1 ~]# /etc/init.d/varnish reload
server2:
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# vim /var/www/html/index.html
<h1>www.westos.org</h1>
[root@server2 ~]# /etc/init.d/httpd restart
server3:配置网络服务器
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# /etc/init.d/httpd start
[root@server3 ~]# vim /var/www/html/index.html ##发布页面
<h1>bbs.westos,com</h1>
主机客户端进行测试:
[root@foundation7 varnish]# vim /etc/hosts
172.25.7.1 www.westos.org bbs.westos.org westos.org
实验五:负载均衡的健康状况检测
server1:
[root@server1 ~]# vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.7.2";
.port = "80";
}backend web2 {
.host = "172.25.7.3";
.port = "80";
}
## 把多个后端聚合为一个组,并检测后端健康状况
## Round Robin(中文翻译为轮询调度)是一种以轮询的方式依次将一个域名
## 解析到多个IP地址的调度不同服务器的计算方法。
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; ##调用轮询方法,将访问分发至后端轮询组
return (pass); ##为了测试方便,不进行缓存
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
server2:配置httpd
[root@server2 ~]# vim /var/www/html/index.html
<h1>www.westos.org - server2</h1>
server3:设定虚拟主机
[root@server3 ~]# mkdir /www1
[root@server3 ~]# cd /www1/
[root@server3 www1]# vim index.html
<h1>www.westos.org - server3</h1>
[root@server3 ~]# vim /etc/httpd/conf/httpd.conf
[root@server3 ~]# /etc/init.d/httpd restart
[root@server3 www1]# vim /etc/hosts
172.25.7.3 server3 www.westos.org bbs.westos.org
客户端测试:
注意:当server2的网络服务器挂掉之后,服务器会自动连接server3上的服务器,并且不会有缓存产生,然后正常工作。
实验六:CDN推送平台
server1:
1.安装apache php,并修改口号
[root@server1 ~]# yum install httpd php -y
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf ##因为varnish占用的80端口,所以修改httpd的端口为8080
Listen 8080
2.下载安装包:bansys
http://code.google.com/p/varnish-php-bansys/
[root@server1 ~]# yum install unzip -y ##准备解压
[root@server1 ~]# unzip bansys.zip
3.把解压后的文件放到阿帕彻默认发布目录
4.修改配置文件
cd /var/www/html
vim config.php
5.开启服务
/etc/init.d/httpd start
6.浏览器访问