varnish搭建cdn网络
varnish搭建cdn网络
概述:
client->dns->cdn->server->cdn->cache->client
CDN分发网络:
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
用varnish实现CND:
在当前主流的Web架构中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。
处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
##安装
http :// repo . varnish - cache . org / redhat / varnish -3.0/ el 6/ x 86_64/
yum localinstall varnish-3.0.3-1.el6.x86_64.rpm
varnish-libs-3.0.3-1.el6.x86_64.rpm -y
1.查看缓存命中情况
准备工作:
在westos1里:
(1)更改ip
cd /etc/sysconfig/network-scripts
ls
vim ifcfg-eth0
######
/etc/init.d/network restart #重启网络
ip addr #查看ip
(2)更改主机名
hostname server1
hostname #查看主机名
同理:在westos2里:
设定ip为172.25.52.22
更改主机名为server2
实验:
在主机中
下载 varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
再打开两个shell
ssh连接server1和server2
在server1和server2中
# 这样才能使用scp命令
yum whatprovides */scp # 找安装包
yum install openssh-clients-5.3p1-94.el6.x86_64 -y #安装
在主机中
将下载的包scp传给sever1和server2
scp varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm [email protected]:
scp varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm [email protected]:
在server1中(cdn服务器)
ls
yum install * -y # 安装varnish
/etc/init.d/varnish start # 打开服务
##配置varnish服务端口
vim /etc/sysconfig/varnish
###########
更改:
66 VARNISH_LISTEN_PORT=80
vim /etc/sysconfig/varnish #查看数据
############
#编辑限制cpu最大处理文件
vim /etc/security/limits.conf
#############
添加:
varnish - nofile 131073
varnish - memlock 82000
varnish - nproc unlimited
/etc/init.d/varnish reload #重新加载varnish服务
cd /etc/varnish/
ls
##配置一个后端服务器
vim default.vcl
########
更改:
backend default {
.host = "172.25.52.22"; #server2的ip
.port = "80";
}
在server2里(apache后台服务器):
yum install httpd -y
/etc/init.d/httpd start
#apache默认发布目录为/var/www/html
cd /var/www/html
vim index.html
######
写入:
www.westos.org
在主机里:
#本地解析(做本地解析是为了可以在网页上进行测试)
vim /etc/hosts
#######
添加:
172.25.52.11 server1 www.westos.org
在网页上测试:
输入172.25.52.11 会出现 www.westos.org
输入www.westos.org 会出现 www.westos.org
在server1里
cd /etc/varnish/
vim 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);
}
/etc/init.d/varnish reload
在主机里
#本地解析
vim /etc/hosts
#######
添加:
172.25.52.11 www.westos.org
测试:
在主机中
curl www.westos.org -I
curl www.westos.org -I
##通过 varnishadm 手动清除缓存
# varnishadm ban.url .*$ #清除所有
# varnishadm ban.url /index.html #清除 index.html 页面缓存
# varnishadm ban.url /admin/$ #清除 admin 目录缓存
2.定义多个不同域名站点的后端服务器
准备工作:
再添加一个westos3子盘
并更改ip为172.25.52.33
更改主机名为server3
实验:
在server3中:
yum install httpd -y
/etc/init.d/httpd start
cd /var/www/html
vim index.html
######
写入:
bbs.westos.org
在server1中:
cd /etc/varnish/
vim default.vcl
#######
#定义多个不同域名站点的后端服务器
更改:
backend web1 {
.host = "172.25.52.22";
.port = "80";
}
添加:
backend web2 {
.host = "172.25.52.33";
.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 = web1;
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
/etc/init.d/varnish reload
在主机中:
vim /etc/hosts
#####
添加:
172.25.52.11 www.westos.org bbs.westos.org
测试:
在真机中:
curl 172.25.52.11/index.html -I
curl www.westos.org/index.html -I
curl bbs.westos.org/index.html -I
当访问 www.westos.org 域名时,从 web1(server2 172.25.52.22) 上取数据,缓存在cdn中
当访问 bbs.westos.org 域名时,从 web2(server3 172.25.52.33) 上取数据,缓存在cdn中
3.定义负载均衡
在server3中:
cd /var/www/html
mkdir /www1
cd /www1
vim index.html
#####
写入:
www.westos.org server3
vim /etc/httpd/conf/httpd.conf
#######
取消注释:
990 NameVirtualHost *:80
添加:
1010 <VirtualHost *:80>
1011 DocumentRoot /var/www/html
1012 ServerName bbs.westos.org
1013 </VirtualHost>
1014
1015 <VirtualHost *:80>
1016 DocumentRoot /www1
1017 ServerName www.westos.org
1018 </VirtualHost>
/etc/init.d/httpd reload
在server1中:
cd /etc/varnish
vim default.vcl
######
添加:
#把多个后端聚合为一个组,并检测后端健康状况
director lb round-robin {
{
.backend = web1;
}
{
.backend = web2;
}
}
更改:
#当访问 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 = lb;
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
vim /etc/hosts
#####
更改:
172.25.52.03 server3 www.westos.org bbs.westos.org
在server2中
cd /var/www/html
vim index.html
######
更改:
www.westos.org server2
测试:
curl www.westos.org
在server1中:
cd /etc/varnish
vim default.vcl
######
更改:
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";
}
}
测试:
curl www.westos.org
3.varnish cdn 推送平台
在主机中:
下载 bansys.zip 并用scp传给server1
systemctl stop firewalld
systemctl restart httpd
在server1里:
yum install httpd -y
/etc/init.d/httpd start
vim /etc/httpd/conf/httpd.conf
######
Listen 8080 #修改端口
yum install php -y
yum install unzip -y
unzip bansys.zip -d /var/www/html #解压
cd /var/www/html/bansys/
ls
mv * ..
ls
cd ..
ls
vim config.php
#####
/etc/init.d/httpd restart
netstat -antlp
在网页测试:
输入172.25.52.11:8080
在server1里
cd /etc/varnish/
vim default.vcl
######
添加:
##设定访问控制
acl westos {
"127.0.0.1";
"172.25.52.0"/24;
}
sub vcl_recv {
添加:
if (req.request == "BAN") {
if (!client.ip ~ westos) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
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";
}
}
/etc/init.d/varnish reload
在网页上测试:
输入172.25.52.11:8080
选择HTTP ----------> 输入 /index.html ---------> 提交
在主机中测试:
curl www.westos.org/index.html
每提交一次就会更改一次
提交之前:
提交之后:
总结:
(1)如果ssh连接不了虚拟机,则:
vim .ssh/known_hosts
###########
删除所有内容
(2)排错思想:
如果所有操作都做完了但仍然没有出现正确的现象该怎么办?
此时需要检查:
火墙是否关闭 /etc/init.d/iptables stop
apache是否打开 /etc/init.d/httpd restart
varnish服务是否重启 /etc/init.d/varnish restart
varnish的重新加载 /etc/init.d/varnish reload
配置文件是否编写正确