企业CDN缓存 varnish--varnish的基本搭建(1)

一  varnish的概述及原理

前面我先给大家讲述一下基本原理和思想,帮助大家彻底理解什么是varnish加速器
虽然互联网企业大多数使用nginx这个功能比较多的服务器,但是单学一个varnish服务器可以让大家彻底理解原理
1.什么是varnish?

Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好
之前的squid加速器(代理缓存服务器)是将从服务器要回来的资源放在自己的硬盘里,客户读取的速率很慢,代理的效率低
现在的varnish加速器(代理缓存服务器)是将从服务器要回来的资源放在自己的内存里,客户读取的速率很快,代理的效率高
varnish代理服务器的工作方式有两种
(1)仅仅作为一个代理服务器:帮客户端去问服务端要数据,要回来的数据直接给客户端自己不缓存一份,这种情况是客户的隐私信息、
热点信息、更新比较快的数据,不缓存,只代理。
(2)既代理又缓存:帮客户端去问服务端要数据,要回来的数据先给自己缓存一份,然后再发给客户端,这种情况是用于更新比较慢的数据,此时varnish既代理又缓存。
2.为什么要有varnish加速缓存代理服务器?

比如:我们国家使用微信的用户非常多,微信的服务商腾讯总部在深圳
当每个地区的用户使用微信访问腾讯服务器的资源的时候,访问量太大
对于深圳的服务器来说,会造成很大的访问压力,甚至会造成服务器瘫痪
对于每个地区的用户来数,如果都去访问腾讯的总部服务器,会造成网络拥塞,使得客户的访问很缓慢,不利于用户的使用
现在腾讯总部给每个地区都放varnish代理服务器,每个地区的微信使用用户想访问深圳资源的时候
都会间接去问自己地区的varnish代理服务器要资源
如果varnish代理服务器上面没有资源,此时varnish代理服务器就会去向深圳的服务器要资源,将要回来的资源视情况而定给自己缓存一份,然后再给客户端发一份。这种情况下,varnish代理服务器的数量远远少于微信用户的数量,即使所有的varnish代理服务器同时向深圳总部的服务器要资源的时候,也不会给深圳的服务器造成很大的压力,对微信使用的客户端和深圳总部的服务端都有好处
假如代理服务器缓存了一些更新慢的数据,当客户端再次要这个数据的时候,代理服务器会直接返回给客户端,不需要再去问深圳的服务器要资源,那么这就是把varnish服务器叫做加速器的原因,加快了客户端和服务端之间的访问速率
注意:以上我是仅仅使用微信举个例子,其实所有的互联网企业使用加速器的原理是一样的
3.varnish加速器的工作流程(这里我稍后会画一张图给大家)

Varnish与一般服务器软件类似,分为master(management)进程和child(worker ,主要做cache的工作)进程。
master进程读入命令,进行一些初始化,然后fork并监控child进程。
child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
针对文件缓存部分,master读入存储配置,调用合适的存储类型,然后创建/读入相应大小的缓存大文件。
接着,master初始化管理该存储空间的结构体。这些变量都是全局变量,在fork以后会被child进程所继承(包括文件描述符)。
在child进程主线程初始化过程中,将前面打开的存储大文件整个mmap到内存中
(如果超出系统的虚拟内存,mmap失败,进程会减少原来的配置mmap大小,然后继续mmap)
此时创建并初始化空闲存储结构体,挂到存储管理结构体,以待分配。
接着,真正的工作开始,Varnish的某个负责接受新HTTP连接的线程开始等待用户,如果有新的HTTP连接过来,它总负责接收,
然后叫醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP请求的URI,查找已有的object,
如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。
分配缓存的过程是这样的:它根据所读到object的大小,创建相应大小的缓存文件。
为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。
然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。
如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。
如果缓存已满,就根据LRU机制,把最旧的object释放掉。
释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期
如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存
注意释放时会检查该存储内存块前面或后面的空闲内存块
如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。
整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中
如果系统内存不足,系统会自动将其换到swap空间,而不需要varnish程序去控制。

 

 

 

二. 搭建一个最基本的varnish代理缓存服务器

因为在后边的学习中会用到很多 的虚拟机所以首先需要搭建一个7.3 或者7.5版本的虚拟机

1.封装与一个7,5的虚拟机

虚拟机封的注意事项和要求

############rhel6.5虚拟机封装#################
1.网络安装rhel6.5虚拟机
virt-manager --> create a new virtual machine --> Network Install --> URL:http://172.25.254.250/rhel6.5/x86_64/dvd --> Memory: 512M --> 10G disk

2.基础配置
English --> us --> 关闭ipv6,只打开ipv4 --> GO(如果失败,就手动配置IP)

3.系统配置
进入系统,做以下修改:
1)主机名:
vi /etc/sysconfig/network
HOSTNAME=server1

2)做解析
vi /etc/hosts
172.25.0.1  server1
172.25.0.2  server2
172.25.0.3  server3
172.25.0.4  server4
172.25.0.5  server5
172.25.0.6  server6

3)网络配置
rm -fr /etc/udev/rules.d/70-persistent-net.rules	##查看这个文件,里面记录了本机的eth0网卡的硬件地址,如果不删除,以后做的快照虚拟机网络都会有问题

vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
ONBOOT="yes"
IPADDR=172.25.0.1
PREFIX=24

4)yum源配置
vi /etc/yum.repos.d/rhel-source.repo

[rhel-source]
name=Red Hat Enterprise Linux $releasever - $basearch - Source
baseurl=http://172.25.0.250/rhel6.5/x86_64/dvd
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

5)关闭selinux
vi /etc/sysconfig/selinux

SELINUX=disabled

6)关闭防火墙
/etc/init.d/iptables stop
/etc/init.d/ip6tables stop

chkconfig iptables off
chkconfig ip6tables off

7)安装一些必须的软件
yum install -y vim lftp openssh-clients

8)封装完成,以后这个虚拟机不要打开,它是母盘,用它来做快照,不然,每打开一次,这个母盘就会改变
'为了避免手残,在虚拟机管理器里把这个虚拟机删掉'
'*注意*:删除时,把那个/var/lib/libvirt/images/xxx.qcow2的那个勾点掉,不然会把刚封装好的虚拟机删了'

##############rhel7虚拟机封装##############
1.网络安装rhel7.3虚拟机
virt-manager --> create a new virtual machine --> Network Install --> URL:http://172.25.254.250/rhel7.3/x86_64/dvd --> Memory: 1024M --> 20G disk  ###注意:可以本地安装

2.最小化安装,自动分区

3.修改ip地址
vim /etc/sysconfig/network-scripts/ifcfg-eth0

BOOTPROTO=static
DEVICE=eth0
ONBOOT=yessysys
IPADDR=172.25.136.4
PREFIX=24
GATEWAY=172.25.136.250
DNS1=114.114.114.114		#后期可能要上网

'这里可能学生都不是eth0,需要修改配置文件,后面写'

4.关闭并禁用NetworkManager	##会影响网络配置、DNS等
systemctl stop NetworkManager
systemctl disable NetworkManager

5.配置yum源
[rhel7.3]
name=rhel7i.3
baseurl=http://172.25.136.250/rhel7.3/x86_64/dvd
gpgcheck=0

6.安装一些基础软件
yum install -y vim lftp net-tools	##网络工具,不装没有ifconfig等命令

7.修改上面网卡名不是eth0的

vim /boot/grub2/grub.cfg

 99        linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/rhel-root ro rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet LANG=en_US.UTF-8 net.ifnames=0
'在这一行最后加上 net.ifnames=0 , 这样以后做的快照都是eth0'

8.关闭selinux

9.关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld

10.修改主机名
1)hostname1ictl set-hostname server1

2)也可以修改配置文件
vim /etc/hostname
server1

11.添加解析
172.25.0.250  foundation0.ilt.example.com	##物理机解析也加上
172.25.0.1    server1
172.25.0.2    server2
172.25.0.3    server3
172.25.0.4    server4
172.25.0.5    server5
172.25.0.6    server6
172.25.0.7    server7

'配置完,关机'

12.清理临时及缓存文件

###如果在虚拟机管理器中删除了母盘 则不能使用此命令
virt-sysprep -d rhel7.3		##-d后面加的是母盘的名字

因为每次开机都会生成一些临时文件,缓存文件等,如果不清除,每次的快照都会有这些东西,快照会变大

 

 

2. 选择本地安装

 

3. 选择7.5的镜像

 

选择镜像的内大小

 

给虚拟机命名

 

选择第一个安装

 

进入页面后选择语言

 

 

选择时区

 

 

分配内存空间

 

 

选择自动创建分区

 

自动创建好的分区如下

 

 

以上步骤装好后开始安装(因为是无图安装所以安装的过程会比较快)

 

 

设置管理员密码

 

 

 

 

 

 

 

 

 

 

2. 安装完虚拟机第一步先进行的网络的设置

 

 

3. 配置yum源 安装一些必要的软件

 

 

 

4. 关闭 NetworkManager这个服务(网络管理员)
因为这个服务管理主机的网络,DNS等等,如果不关闭,我修改了网络配置文件之后
如果重启网络服务, NetworkManager这个服务可能会还原我的设置

1.systemctl stop NetworkManager
2.systemctl disable NetworkManager
3.systemctl status NetworkManager

  

 

5. vim /boot/grub2/grub.cfg编辑开机引导文件
在100行后面加上 net.ifnames=0
使得给redhat虚拟机建立快照的网卡名称是eth开头,我们之后的实验所用的所有虚拟机都给装的这个虚拟机建立快照

 

 

6. 做本地解析 vim /etc/hosts

 

 

7. 将selinux的状态改为disable

 

 

 

8. 关闭防火墙

systemctl stop firewalld
systemctl disabled firewalld

 

9. 修改主机名称

 

10. 检查完之后poweroff关闭虚拟机

 

11. 虚拟机每开启一次,就会产生日志,生成很多文件,占用内存

    步骤三:在真机上面清理redhat虚拟机的缓存

在真机上面:
yum install libguestfs-tools-c-1.32.7-3.el7.x86_64 -y
cd /var/lib/libvirts/images
ls查看虚拟机母盘的名字
virt-sysprep -d rhel7.5

 

 

 

 

三. 建立虚拟机快照

 

 

 

三. 实验准备

1. 分别准备两台虚拟机server1和server2

将真机上面的三个varnish安装包给server1快照
在server1上面 yum install -y 安装varnish服务

 

 

 

2. 查看varnish的相关配置文件

rpm -qa | grep varnish查看版本
rpm -qc varnish查看一下服务的配置文件

 

 

 

id varnish安装varnish服务之后就会自动建立这个用户

 

 

 

 

3. vim /etc/logrotate.d/varnish是基本的环境变量

vim /usr/lib/systemd/system/varnish.service是varnish服务启动脚本
里面有一些最基本的参数:允许开启的文件个数 内存锁定大小
ulimit -l   查看系统的内存大小
free -m     查看系统的剩余内存
sysctl -a | grep file   查看系统允许开启文件的最大个数
ulimit -n   查看系统的内存数

 

 

4. 查看varnish系统 的服务为软件

 

 

5. vim /etc/security/limits.conf系统参数限制文件

varnish nofile 131072
varlish memlock 82000
systemctl start varnish

 

 

6. 临时改变缓存文件的个数和内存参数

ulimit -n 131072     指定缓存文件的个数为131072
ulimit -l 85         指定缓存的大小为85 
ulimit -a            查看缓存的参数 

 

 

 

7. 在server2上安装httpd服务

 

 

8. 修改varnish主配置文件

 

   server1上面设置,将server1作为一个代理服务器,它的后端服务器是server2这个web服务器
    客户端请求web服务器的资源通过server1这个代理服务器

vim /etc/varnish/defaults.cvl
将ip改为172.25.6.2(改称node2的ip)
80
systemctl restart varnish
netstat -tnlp | grep varnish

\

 

9. 测试:在真机上

curl 172.25.6.1

访问被拒绝

 

netstat -tnlp | grep varnish   查看80端口是否打开

 

 

 

10 . 80端口没有开启需要在varnish服务文件中加入相关的命令

vim /usr/lib/systemd/system/varnish.service
ExecStart=/usr/sbin/varnishd -a :80 -T  localhost:6082 -f /etc/varnish/default.vcl -s malloc,256m   输入相关的命令

 

 

11. 再次查看80是否开启

(80端口已经开启)

检查server1和server2的网络是否可以ping通

 

12. 测试:

步骤:在真机上面进行测试,真机是一个客户端
真机想通过server1(varnish代理缓存服务器)访问server2(web服务器)的web资源
curl 172.25.6.1(找的是172.25.6.2的资源)

真机上访问代理server1   server1将访问server2 得到的内容在反馈给真机  从而实现了varnish的代理

 

 

 

 

四. varnish相关进程的查看

 

ps ax | grep varnish       查看varnish相关的连接

 

查看varnish相关进程的日志参数以及查看

 

五. varnish缓存的验证

1.修改配置文件中的参数


        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. 测试:curl -I 172.25.6.1/index.html

第一次没有一缓存

MISS from westos cache  

 

3. 有缓存

MISS from westos cache

 

4. 在server1上面varnishadm ban req.url “~” /index.html 清除缓存

 

再次验证

第一次访问没有缓存

 

  •  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值