Varnish搭建CDN内容分发网络

概述:

1.CDN内容分发网络

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,
使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,
CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

2.简述varnish

 在当前主流的Web架构中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。
 而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。
 严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。
 同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,
 以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。

3.用varnish实现cdn的基本原理

图解:
在这里插入图片描述

处理过程:

(1)Receive状态:  也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入Lookup(本地查询)。
(2)Lookup状态:   进入此状态后,会在 hash 表中查找数据,若找到,则进入Hit状态,否则进入miss状态。
(3)Pass状态:     在此状态下,会进入后端请求,即进入fetch状态。
(4)Fetch状态:    在Fetch状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
(5)Deliver状态:  将获取到的数据发送给客户端,然后完成本次请求。

特点:

Lookup:用于处理一般的数据;vcl_hash(ip哈希): 将ip与后端服务器绑定,即:同一台主机始终访问的是同一个后端服务器
Pass:  用于处理动态数据;vcl_backend(fetch): 后端查询 ,它不适合缓存
Pipe:  用于处理大文件

安装包:

varnish-3.0.5-1.el6.x86_64.rpm  
varnish-libs-3.0.5-1.el6.x86_64.rpm

实验环境:

server1   172.25.66.1      varnish服务器
server2	  172.25.66.2      后端服务器1(apache)
server3   172.25.66.3      后端服务器2(apache)

1.varnish的安装与基础配置

1.配置varnish服务端

#1.下载varnish安装包
[root@server1 mnt]# ls
varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
#2.安装varnish软件
[root@server1 mnt]# yum install -y varnish-*
#3.查看配置文件
[root@server1 mnt]# rpm -qc varnish
/etc/logrotate.d/varnish
/etc/sysconfig/varnish
/etc/varnish/default.vcl

在这里插入图片描述

#4.配置varnish服务端口
[root@server1 mnt]# vim /etc/sysconfig/varnish 
###################
66 VARNISH_LISTEN_PORT=80     #默认后端服务器为80(在浏览网址时默认访问的就是80端口,此时便无需在后边加80,形如: www.baidu.com:80)

在这里插入图片描述

#5.查看配置文件参数
[root@server1 mnt]# vim /etc/sysconfig/varnish 

在这里插入图片描述

#查看系统能打开的最大文件
[root@server1 mnt]# sysctl -a | grep file
fs.file-nr = 448	0	47361
fs.file-max = 47361`

在这里插入图片描述
发现问题:

1.varnish服务能打开的最大文件数目远远超过系统能打开的最大文件
2.最大锁定内存空间:82000
3.最大进程数:无限制

解决问题1:

1).更改varnish配置文件参数显然不合理,不提倡使用)
2).增加内存
#查看系统剩余内存
[root@server1 mnt]# free -m
             total       used       free     shared    buffers     cached
Mem:           490        190        299          0         11        125
-/+ buffers/cache:         54        436
Swap:          991          0        991

在这里插入图片描述
增加内存:
在这里插入图片描述

#再次查看系统能打开的最大文件
[root@server1 ~]# sysctl -a | grep file
fs.file-nr = 384	0	188466
fs.file-max = 188466

在这里插入图片描述
解决问题2和问题3:

[root@server1 ~]# vim /etc/security/limits.conf 
#################
varnish          -       nofile        131072        #最大文件主数
varnish          -       memlock       82000         #最大锁定内存空间
varnish          -       nproc         unlimited     #最大进程数

在这里插入图片描述

#6.开启varnish
[root@server1 ~]# /etc/init.d/varnish start
Starting Varnish Cache:                                    [  OK  ]
#此时查看到系统自动生成了varnish用户
[root@server1 ~]# cat /etc/passwd

在这里插入图片描述

#过滤出与varnish有关的进程
[root@server1 ~]# ps aux | grep varnish

在这里插入图片描述

root用户:    master(主进程)   用来监控,读取配置, fork创建子进程 
varnish用户: 子进程
#查看root用户的线程数(只有一个)
[root@server1 ~]# cat /proc/1050/status

在这里插入图片描述

#查看varnish用户的线程数(有很多个)
[root@server1 ~]# cat /proc/1051/status 

在这里插入图片描述

#7.更改主配置文件:制作调度器
[root@server1 ~]# vim /etc/varnish/default.vcl
#################
 7 backend default {
  8   .host = "172.25.66.2";        ##server2的ip
  9   .port = "80";
 10 }

在这里插入图片描述

#8.重启varnish服务 
[root@server1 ~]# /etc/init.d/varnish restart
Stopping Varnish Cache:                                    [  OK  ]
Starting Varnish Cache:                                    [  OK  ]

2.配置后端服务器

#1.安装apahce
[root@server2 ~]# yum install -y httpd
#2.开启apache
[root@server2 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.2 for ServerName
                                                           [  OK  ]
#3.编写默认发布文件
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# ls
[root@server2 html]# vim index.html
####################
<h1>www.westos.org ---- server2</h1>

在这里插入图片描述

#4.重启apache
[root@server2 html]# /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.2 for ServerName
                                                           [  OK  ]

测试:

(1).在物理机上

[root@foundation66 ~]# curl 172.25.66.1
<h1>www.westos.org ---- server2</h1>

(2).在网页上

输入:  172.25.66.1     

当访问varnish端的ip时,直接跳转到了后端服务器server2上
在这里插入图片描述

2.查看缓存命中情况

配置varnish服务端:

#1.更改主配置文件
[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);
}

在这里插入图片描述

#2.重新加载配置
[root@server1 ~]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2019-01-24T14:02:25
VCL compiled.

available       2 boot
active          0 reload_2019-01-24T14:02:25

Done

测试:

只有第一次访问没有命中缓存,之后再访问都会命中缓存

[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述

 [root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述

 [root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述
缓存的清理:

#1.清理所有缓存
[root@server1 ~]# varnishadm ban.url .*$
#测试:
[root@foundation66 ~]# curl -I 172.25.66.1

在这里插入图片描述

#2.清理某个网页的缓存(注意:访问方式改变了)

#第一次访问未命中缓存,之后再访问都能命中缓存
[root@foundation66 ~]# curl -I 172.25.66.1/index.html

在这里插入图片描述

[root@foundation66 ~]# curl -I 172.25.66.1/index.html

在这里插入图片描述

#清理网页index.html缓存
[root@server1 ~]# varnishadm ban.url /index.html
#测试:   
[root@foundation66 ~]# curl -I 172.25.66.1/index.html

在这里插入图片描述

3.配置多个后端服务器

1.配置varnish服务端

#1.编写主配置文件:配置调度器
[root@server1 ~]# vim /etc/varnish/default.vcl
#################
backend web1 {
  .host = "172.25.66.2";     # 后端服务器1(server2)
  .port = "80";
}

backend web2 {
   .host = "172.25.66.3";    # 后端服务器2(server3)
   .port = "80";
}

    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";
       }
}

在这里插入图片描述
注意:要注释掉命中缓存情况的设定
在这里插入图片描述

#2.重新加载配置
[root@server1 ~]# /etc/init.d/varnish reload

2.配置后端服务器

[root@server3 ~]# yum install -y httpd
[root@server3 ~]# cd /var/www/html/
[root@server3 html]# ls
# 编写apache默认发布文件
[root@server3 html]# vim index.html
####################
<h1>bbs.westos.org  ---- server3</h1>

在这里插入图片描述

[root@server3 html]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.3 for ServerName
                                                           [  OK  ]

3.本地解析

#本地解析:便于直接访问域名,无需访问ip
[root@foundation66 ~]# vim /etc/hosts
######################
172.25.66.1 server1 www.westos.org bbs.westos.org

测试:

访问www.westos.org时,调度server2结点,当访问bbs.westos.org时,调度server3结点

[root@foundation66 ~]# curl www.westos.org
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl bbs.westos.org
<h1>bbs.westos.org ---- server3</h1>

4.负载均衡

1.配置varnish服务端

#1.编写主配置文件
[root@server1 ~]# vim /etc/varnish/default.vcl
#################
#配置负载均衡lb
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;
} elsif (req.http.host ~ "^bbs.westos.org") {
        set req.backend = web2;
} else {
       error 404 "westos cache";
       }
}

在这里插入图片描述

#2.重新加载
[root@server1 ~]# /etc/init.d/varnish reload

测试:

发现此时并没有实现负载均衡,因为有缓存

#此时没有实现负载均衡,因为有缓存
[root@foundation66 ~]# curl www.westos.org
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl www.westos.org
<h1>www.westos.org ---- server2</h1>

解决方案:清理缓存

#1).手动清理缓存
[root@server1 ~]# varnishadm ban.url .*$
[root@foundation66 ~]# curl www.westos.org
<h1>bbs.westos.org ---- server3</h1>
[root@server1 ~]# varnishadm ban.url .*$
[root@foundation66 ~]# curl www.westos.org
<h1>www.westos.org ---- server2</h1>

难道每访问一次,都要手动清理缓存?这样显然很麻烦

改进:跳过缓存

#2).更改配置文件
[root@server1 ~]# vim /etc/varnish/default.vcl
#################
 27    return (pass);    #不进行缓存(跳过缓存)

在这里插入图片描述

#重新加载
[root@server1 ~]# /etc/init.d/varnish reload

测试:

#此时便不会有缓存干扰,实现了负载均衡
[root@foundation66 ~]# curl www.westos.org
<h1>www.westos.org ---- server2</h1>
[root@foundation66 ~]# curl www.westos.org
<h1>bbs.westos.org ---- server3</h1>

5.同一台主机上定义多个域名

1.配置后端服务器(本实验在后端1和后端2做均可)

#1.更改配置文件
[root@server3 html]# vim /etc/httpd/conf/httpd.conf 
####################
990 NameVirtualHost *:80       #打开虚拟主机端口

<VirtualHost *:80>             #定义虚拟主机1
    DocumentRoot /www          #定义根目录
    ServerName www.westos.org
</VirtualHost> 
     
<VirtualHost *:80>             #定义虚拟主机2
    DocumentRoot /bbs          #定义根目录
    ServerName bbs.westos.org
</VirtualHost>

在这里插入图片描述
在这里插入图片描述

#2.重启apache
[root@server3 html]# /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: Warning: DocumentRoot [/www] does not exist
Warning: DocumentRoot [/bbs] does not exist
httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.3 for ServerName
                                                           [  OK  ]
#3.建立根目录
[root@server3 html]# mkdir /www
[root@server3 html]# mkdir /bbs
[root@server3 html]# cd /www/
[root@server3 www]# ls
#4.编写发布文件1
[root@server3 www]# vim index.html
###################
<h1>www.westos.org ---- server3</h1>

在这里插入图片描述

[root@server3 www]# cd /bbs/
[root@server3 bbs]# ls
#5.编写发布文件2
[root@server3 bbs]# vim index.html
###################
<h1>bbs.westos.org ---- server3</h1>

在这里插入图片描述

#6.重启apache
[root@server3 bbs]# /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.3 for ServerName
                                                           [  OK  ]

2.本地解析

[root@foundation66 ~]# vim /etc/hosts
######################
172.25.66.1 server1 
172.25.66.3 server3 bbs.westos.org www.westos.org

在这里插入图片描述
测试:

当访问不同的域名时,访问的是同一个主机,即实现了同一台主机上定义多个域名

[root@foundation66 ~]# curl www.westos.org
<h1>www.westos.org ---- server3</h1>
[root@foundation66 ~]# curl bbs.westos.org
<h1>bbs.westos.org ---- server3</h1>

在这里插入图片描述

6.web界面的制作

web界面:也是实现清理缓存的一种方式,但与之前最大的不同在于:它可以批量,高效的清理缓存

安装包:

bansys.zip

配置varnish服务端:

#1.下载安装包
[root@server1 ~]# cd /mnt
[root@server1 mnt]# ls
bansys.zip  varnish-3.0.5-1.el6.x86_64.rpm  varnish-libs-3.0.5-1.el6.x86_64.rpm
#报错:因为没有unzip命令
[root@server1 mnt]# unzip bansys.zip -d /var/www/
-bash: unzip: command not found
#2.安装unzip apache php等(用到了php语言)
[root@server1 mnt]# yum install -y unzip httpd php
#3.解压,-d表示解压路径
[root@server1 mnt]# unzip bansys.zip -d /var/www/html
[root@server1 ~]# cd /var/www/html/
[root@server1 html]# ls
bansys  class_socket.php  config.php  index.php  purge_action.php  static
[root@server1 html]# cd bansys/
[root@server1 bansys]# pwd
/var/www/html/bansys
[root@server1 bansys]# ls
class_socket.php  config.php  index.php  purge_action.php  static
#4.定义varnish主机列表和群组 
[root@server1 bansys]# vim config.php 
######################
$var_group1 = array(
                         'host' => array('172.25.66.1'),             #本机ip
                                                 'port' => '8080',   #不能写80端口,因为varnish服务已经占用了80端口
    
                   );          
$VAR_CLUSTER = array(
                          'www.westos.org' => $var_group1,           #   
                   );

在这里插入图片描述

#5.更改apache的端口;因为varnish已经占用了80端口
[root@server1 bansys]# vim /etc/httpd/conf/httpd.conf 
#####################
 136 Listen 8080
#6.重启apache
[root@server1 bansys]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.66.1 for ServerName
                                                           [  OK  ]
#7.两者皆可查看端口,查看到apache的端口是否更改为8080
[root@server1 bansys]# netstat -tnlp

在这里插入图片描述

[root@server1 bansys]# netstat -antlup

在这里插入图片描述
网页测试:

输入:172.25.66.1:8080

为何访问到的是默认发布目录?
在这里插入图片描述因为bansys里的内容没有共享

[root@server1 bansys]# pwd
/var/www/html/bansys
#8.将bansys里的所有内容移动到/var/www/html/(apahce默认发布目录)中,以达到共享的目的
[root@server1 bansys]# mv * ../
[root@server1 bansys]# cd ..
[root@server1 html]# ls
bansys  class_socket.php  config.php  index.php  purge_action.php  static

再次测试:此时便可以查看到推送界面

输入:172.25.66.1:8080

在这里插入图片描述

#9.配置varnish访问控制
[root@server1 bansys]# vim /etc/httpd/conf/httpd.conf 
#####################

# 定义允许推送的主机ip
acl westos {          
"127.0.0.1";              #本机可以访问  
"172.25.66.0"/24;         #66网段均可访问
}

# 若不在允许ip列表中则报错
sub vcl_recv {
    if (req.request == "BAN"){
        if (!client.ip ~ westos) {
            error 405 "Not allowed.";
    }
    ban("req.url ~ " + req.url);
        error 200 "ban added";
    }
}

在这里插入图片描述
测试:

第一次未命中缓存,之后都可以命中缓存

[root@foundation66 Desktop]# curl -I www.westos.org

在这里插入图片描述

[root@foundation66 Desktop]# curl -I www.westos.org

在这里插入图片描述

网页推送:相当于批量清除缓存
在这里插入图片描述
在这里插入图片描述
发现推送成功后,测试未命中,即完成了缓存的清理

[root@foundation66 Desktop]# curl -I www.westos.org

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lilygg/article/details/86634954