网站加速器 |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端口

[root@server1 ~]# 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

[root@server1 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服务

[root@server1 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

[root@server1 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

[root@server2 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

[root@foundation28 ~]# 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

[root@foundation28 ~]# 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 重新加载

[root@foundation28 ~]# 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,没有缓存

[root@foundation28 ~]# 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

[root@server3 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内还可以访问,超过这个时期就无法访问

[root@server2 html]# /etc/init.d/httpd stop

Stopping httpd:                                            [  OK  ]

 

[root@foundation28 ~]# 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,建立发布目录

 

[root@server3 ~]# mkdir /www1

[root@server3 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标签的两个服务器,web1web2,如果轮到了web1,那么直接去访问172.25.28.2,它对应的默认发布目录是/var/www/html,如果轮到了web2,那么就去访问172.25.28.3,这个ip有两个站点,所以vm3里面需要添加解析,判断访问哪一个,bbs.westos.orgwww.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轮流被访问

[root@foundation28 ~]# 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

[root@foundation28 ~]# 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报错

[root@foundation28 ~]# 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>

 

 

猜你喜欢

转载自blog.csdn.net/ha_weii/article/details/81276672