CDN实现varnish缓存

一、虚拟机封装

1.1.安装6.5版本的虚拟机

redhat6.5安装教程

1.2.完成后对虚拟机进行以下配置:

(1)更改主机名:

vi /etc/sysconfig/network   #6.5文本编辑器为vi

(2)配置ip:

vi /etc/sysconfig/network-scripts/ifcfg-eth0

删除/etc/udev/rules.d/70XXXXXX(否则新建的虚拟机快照网络起不来)

配置好后重启网络服务:

/etc/init.d/network restart  #6的写法

(3)添加地址解析

vi /etc/hosts

(4)关闭火墙

/etc/init.d/iptables stop
/etc/init.d/ip6tables stop
chkconfig iptables off
chkconfig ip6tables off

(5)设置selinux为disabled

vi /etc/sysconfig/seliniux

(6)配置yum源

vi /etc/yum.repo.d/rhel-source.repo

(7)安装基本软件

yum install -y vim lftp openssh-clients -y

配置好后poweroff,不要再打开!

2.在真机中清除虚拟机base的缓存

yum whatprovides */virt-sysprep
yum install 1:libguestfs-tools-c-1.32.7-3.el7.x86_64 -y
virt-sysprep -d base   ##清除虚拟机base的缓存

3.建立快照

(1)

 cd /var/lib/libvirt/images/
qemu-img create -f qcow2 -b base.qcow2 vm1
qemu-img create -f qcow2 -b base.qcow2 vm2
qemu-img create -f qcow2 -b base.qcow2 vm3

vm1设置2048M,vm2,vm3,分别设置512M


(2.)更改vm2和vm3的ip和主机名

vim /etc/sysconfig/network
vim /etc/sysconfig/network-scripts/ifcfg-eth0

更改完成后reboot

二、缓存第一节点:client--->cdn

  • 缓存在内存里,在硬盘里
  • 存储的时间,缓存更新
  • 缓存的东西,有选择的进行缓存,降低数据库的压力,缓存热点数据
  • 访问量体现:缓存在内存里,有多少内容是在缓存里读取的--命中率(hit),hit/(hit+miss),命中率高,用的人多。
  1. pv--page view(页面访问,判断访问量)
  2. uv--user view(用户访问)都是
  3. active connection
  4. qps --quest per second 每秒的请求量
  • 缓存对象:生命周期,定期清理缓存内容,强迫更新
  • 缓存空间耗尽:LRU 最近最少使用的缓存
  • 缓存的5个处理步骤:(通过url键值对)解析请求--查询缓存--新鲜度检测--发送响应--记录在日志里

1.配置varnish

在server1:

(1)安装varnish

安装好后cat /etc/passwd 会自动建立一个用户,名为:vainish

(2)查看配置文件:

vim /etc/sysconfig/vatnish

(3)查看内核允许打开文件的最大数

sysctl -a | grep file

改变可打开文件大小,要大于131072(方法:更改内存大小2048)

(4)更改主机安全限制

vim  /etc/security/limits.conf
写入:
varnish		-	nofile		131072
varnish		-	memlock		82000  ##default log size
varnish		-	nproc		unlimited ##maximum number of threads

进程(独立使用内存,)是封闭的,线程是开放的,线程是并发进行的,线程的内存是交叉使用的)

线程缺点:只要一个线程有问题其他线程也会出问题

(5)修改varnish监听端口为80

vim /etc/sysconfig/varnish 

66 行 VARNISH_LISTEN_PORT=80

 /etc/init.d/varnish restart #重启服务

netstat -tnlp  #查看端口是否打开

(6)设置varnish 默认文件

vim /etc/varnish/default.vcl
##修改varnish监听的网络服务器的ip

更改 .host="172.25.60.2" #方向代理172.25.60.2

(7)查看varnish开启的进程

pa aux | grep varnish

第一个是:超级用户的进程master:监控子进程,当子进程产生错误关闭时 root进程再fork一个
第二个是:子进程

cat /proc/2002/status  #2002为进程号

server2:#server2作为网络服务器
(1)安装httpd

/etc/init.d/httpd start

(2)编辑默认发布文件

vim /var/www/html/index.html

在物理机上:打开firefox,访问:172.25.60.1

方向代理不接受请求,会抛向网络服务器

三、查看缓存命中情况

1.查看缓存

(1)设置varnish 默认文件

vim /etc/varnish/default.vcl
##配置一个后端服务器
backend web1 {
  .host = "172.25.38.2";
  .port = "80";
}


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

(2)在物理机上测试缓存命中:

curl -I 172.25.86.1

  • 第一次miss,在服务器上取的
  • 第二次及以上:hit 在缓存里取的
  • Age:存在缓存里的时间,默认最多120秒

2.清除缓存

varnishadm ban.url .*$  #,清除所有缓存,清除后第一次访问:miss,Age=0

图为清除前后对比:

varnishadm ban.url /index.html #清除指定页面缓存

清除指定页面后,访问172.25.60.1状态还是hit,而访问被清除缓存的页面的状态是miss

四、定义多个不同域名站点的后段服务器

1.在server2/3:配置网络服务 群组

定义两个客户端,不同域名进入不同的主机

yum install httpd -y
vim /var/www/html/index.heml

分别写:
<h1>server2,example.com</h1>
<h1>server3,example.com</h1>

2.server1上:设置varnish 默认文件

vim /etc/varnish/default.vcl

backend web1 {
  .host = "172.25.60.2";
  .port = "80";
}
backend web2 {
  .host = "172.25.60.3";
  .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";
}
}

读缓存,如果在,从缓存中读取,如果不再向deliver请求

3.在物理机(真机)上:

添加本地解析:

vim /etc/hosts

172.25.60.1 server1 www.westos.org bbs.westos.org

curl www.westos.org
curl bbs.westos.org

五、设置轮循实现负载均衡

1.设置varnish 默认文件

server1:

vim /etc/varnish/default.vcl


director lb round-robin{  #轮循
{.backend=web1;}
{.backend=web2;}
}

set req.backend = lb;
return (pass);

不让他缓存:return (pass);每次访问都取原服务器读取;

/etc/init.d/varnish reload

2.在物理机(真机)上:

测试:curl www.westos.org

curl -I  www.westos.org  #每次都是miss

六、varnish虚拟主机

一台服务器部署两个apache服务

1.在server3上:配置虚拟主机

vim /etc/httpd/conf/httpd.conf
#文件内容:
990 NameVirtualHost *:80


<VirtualHost *:80>
 DocumentRoot /www
 ServerName www.westos.org
</VirtualHost>

<VirtualHost *:80>
 DocumentRoot /bbs
 ServerName bbs.westos.org
</VirtualHost>

2.编辑默认发布目录

mkdir /www /bbs

vim /www/index.html
vim /bbs/index.html

<h1>server3 - www.westos.org</h1>

<h1>server3 - bbs.westos.org</h1>

/etc/init.d/httpd restart  #重启服务

3.在物理机(真机)上:

curl www.westos.org

七、推送平台搭建

1. 安装服务

yum install httpd php unzip -y

2. 将http的端口改为8080  (因为varnish用的80端口)

vim /etc/httpd/conf/httpd.conf
Listen 8080   
/etc/init.d/httpd start
/etc/init.d/httpd restart

3. 解压bansys.zip包,将解压后的内容放在,/var/www/html/

vim /var/www/html/config.php
<?php
 //varnish主机列表
 //可定义多个主机列表
 $var_group1 = array(
                        'host' => array('172.25.60.1'),
                                                'port' => '8080',                
                    );

 //varnish群组定义
 //对主机列表进行绑定
 $VAR_CLUSTER = array(
                         'www.westos.org' => $var_group1,
                     );


 //varnish版本
 //2.x和3.x推送命令不一样
 $VAR_VERSION = "3";

?>

4. vim /etc/varnish/default.vcl

acl westos {
"127.0.0.1";
"172.25.60.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";
}

/etc/init.d/varnish restart

5.在物理机上测试:

(1)清除全部缓存

curl -I www.westos.org #多访问几次,记录在缓存中

打开firefox:http://172.25.60.1:8080/

curl -I www.westos.org  #缓存信息被清除

(2)清除指定页面的缓存:

 curl -I www.westos.org/index.html  ##访问指定界面,记录在 缓存中

 curl -I www.westos.org

清除指定页面的缓存:

再次访问:

 curl -I www.westos.org/index.html  ##清除的指定页面缓存被清除,状态为miss

 curl -I www.westos.org     #缓存没有被清除,状态为hit

八、VCL 处理流程

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

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马克图布s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值