网站加速器 |varnish实现cdn加速
用varnish实现cdn加速概念
CDN的全称是Content Delivery Network,即内容奋发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
市面上有很多CDN供应商,比较著名有Akamai (全球最大),chinacache,webluker,cloudflare,chinacache,如果需要自己搭建CDN系统,有3种主流方案可以选择squid,varnish,Nginx+memcache
在当前主流的Web架构中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。
用varnish实现cdn加速过程
一,准备环境
1,创建3个子虚拟机
配置为
2,ip也要进行修改,防止冲突
vm1 172.25.28.1 vm1作为varnish服务器
vm2 172.25.28.2
vm3 172.25.28.3
修改之后要重启服务 /etc/init.d/network restart
二,vm1安装varnish服务软件
1,安装服务
varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
配置文件/etc/varnish/default.vcl ,/etc/sysconfig/varnish
2,修改配置文件
/etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80 #监听80端口
[[email protected] ~]# ulimit -a 显示目前资源限制的设定
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7820
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024 系统支持可以打开的最大文件数
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7820 系统支持最多进程
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
[[email protected] varnish]# sysctl -a 查看内核允许的限制信息
内核运行的限制信息>=操作系统运行的限制>=程序本身允许的(不能超过太多)
修改操作系统允许的限制信息/etc/security/limits.conf
# End of file
varnish - nofile 131073
varnish - memlock 82000
varnish - nproc unlimited
注意:在 /etc/sysconfig/varnish中我们可以看到程序运行的限制信息
#NFILES=131072
#MEMLOCK=82000
#NPROCS="unlimited"
3,启动varnish服务
[[email protected] varnish]# /etc/init.d/varnish start
4,绑定ip端口
/etc/varnish/default.vcl
backend default {
.host = "172.25.28.2"; web服务器ip
.port = "80";
}
5,重新加载vainish
[[email protected] varnish]# /etc/init.d/varnish reload
三,配置vm2 web服务器
1,修改主机名
hostname server2
vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=server2
2,安装启动apache
yum install httpd -y
/etc/init.d/httpd start
创建apache默认发布页面index.html
[[email protected] html]# cat index.html
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
/var/www/html/index.html
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
四,客户端本地测试
直接输入varnish缓存服务端的ip可以查看到web服务端的发布网页
为了后面实验方便,做客户端本地解析
这里解析到varnish缓存端
/etc/hosts
172.25.28.1 www.westos.org westos.org bbs.westos.org
[[email protected] ~]# curl -I www.westos.org curl -I 显示请求头信息
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 06:30:28 GMT
ETag: "4000c-139-572095d46d2be"
Content-Type: text/html; charset=UTF-8
Content-Length: 313
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 06:42:42 GMT
X-Varnish: 1502385460 1502385457
Age: 114 #这个是缓存周期,120s,如果客户端在120s之内访问,那么会去缓存访问,如果超过了120s,那么回去web服务器缓存,120s重新计时
Via: 1.1 varnish
Connection: keep-alive
[[email protected] ~]# curl www.westos.org 直接显示页面
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
/var/www/html/index.html
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
#查看curl命中情况
/etc/varnish/default.vcl
写在backend default语句块后面
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 重新加载
[[email protected] ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 06:30:28 GMT
ETag: "4000c-139-572095d46d2be"
Content-Type: text/html; charset=UTF-8
Content-Length: 313
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 06:56:58 GMT
X-Varnish: 1502385463
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from westos cache # 首次查看一定是MISS,没有缓存
[[email protected] ~]# curl -I www.westos.org
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 28 Jul 2018 06:30:28 GMT
ETag: "4000c-139-572095d46d2be"
Content-Type: text/html; charset=UTF-8
Content-Length: 313
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 06:57:00 GMT
X-Varnish: 1502385464 1502385463
Age: 2
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from westos cache # 有缓存,HIT
在varnish服务端通过 varnishadm 手动清除缓存
varnishadm ban.url .*$ #清除所有
varnishadm ban.url /index.html #清除 index.html 页面缓存
varnishadm ban.url /admin/$ #清除 admin 目录缓存
五,多个web服务器
1,vm3修改主机名
hostname server3
vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=server3
2,安装启动apache
yum install httpd -y
/etc/init.d/httpd start
创建apache默认发布页面index.html
[[email protected] html]# cat index.html
bbs.westos.org====================server3
bbs.westos.org====================server3
bbs.westos.org====================server3
/var/www/html/index.html
bbs.westos.org====================server3
bbs.westos.org====================server3
bbs.westos.org====================server3
bbs.westos.org====================server3
3,修改vainish缓存服务端的配置文件
加入
backend default {
.host = "172.25.28.3"; web2服务器的ip
.port = "80";
}
把两个default修改为web1和web2区别
sub vcl_recv {
if (req.http.host ~ "^(www.)?westos.org") { #westos.org和www.westos.org都访问web1,正则表达式
set req.http.host = "www.westos.org";
set req.backend = web1; ## web1语句块
} elsif (req.http.host ~ "^bbs.westos.org") { #以bbs.westos.org开头的访问web2
set req.backend = web2; ##web2语句块
} else {error 404 "westos cache";
}
}
注意!!! 访问除了这三个之外所有都是404错误,包括访问ip,解析了也没用!!!
/etc/init.d/varnish reload 重新加载
4,本地服务端访问测试
六,轮询
服务器挂掉了,在已经缓存的120s内还可以访问,超过这个时期就无法访问
[[email protected] html]# /etc/init.d/httpd stop
Stopping httpd: [ OK ]
[[email protected] ~]# curl -I www.westos.org
HTTP/1.1 503 Service Unavailable
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
Content-Length: 419
Accept-Ranges: bytes
Date: Sat, 28 Jul 2018 07:33:01 GMT
X-Varnish: 1502385504
Age: 0
Via: 1.1 varnish
Connection: close # 连接断开
X-Cache: MISS from westos cache
1,建立轮询机制,在vm3中建立虚拟主机
/etc/httpd/conf/httpd.conf
NameVirtualHost *:80 打开虚拟主机80端口
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName bbs.westos.org ##要解析到的地址
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www1
ServerName www.westos.org ##要解析到的地址
</VirtualHost>
2,建立发布目录
[[email protected] ~]# mkdir /www1
[[email protected] www1]# cat index.html
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
/www1
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
重启服务 /etc/init.d/httpd restart
vm3做解析
vim /etc/hosts
172.25.28.3 server3 www.westos.org bbs.westos.org
#进行轮询是在两个服务器里面,当本地访问 www.westos.org时,本地解析访问172.25.28.1varnish缓存服务器,如果缓存里面有,就访问缓存,如果没有,就直接去web服务器,无论是访问www.westos.org还是westos.org都会返回westos标签的两个服务器,web1和web2,如果轮到了web1,那么直接去访问172.25.28.2,它对应的默认发布目录是/var/www/html,如果轮到了web2,那么就去访问172.25.28.3,这个ip有两个站点,所以vm3里面需要添加解析,判断访问哪一个,bbs.westos.org和www.westos.org.
3,把多个后端聚合为一个组,检测后端健康状况
/etc/varnish/default.vcl
director westos 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 = westos; #两个label一样
return (pass); #为了测试方便,不进行缓存,省去120s时间
} elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
/etc/init.d/varnish reload 重新加载
4,客户端测试,server2和server3轮流被访问
[[email protected] ~]# curl www.westos.org
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
/var/www/html/index.html
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
www.westos.org--------------server2
[[email protected] ~]# curl www.westos.org
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
/www1
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
www.westos.org******************server3
##如果没有写return (pass);那么要等120s缓存周期过去了才可以换另一个服务器应答,手动清空全部缓存后就会换一个web服务器
如果其中一个挂掉,另外一个还可以继续工作,如果两个都挂掉,出现503报错
[[email protected] ~]# curl www.westos.org
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>503 Service Unavailable</title>
</head>
<body>
<h1>Error 503 Service Unavailable</h1>
<p>Service Unavailable</p>
<h3>Guru Meditation:</h3>
<p>XID: 1502385525</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>