介绍:
Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。
varnish项目是2006年发布的第一个版本0.9.距今已经有十多年了,此文档之前也提过varnish还不稳定,那是2007年时候编写的,经过varnish开发团队和网友们的辛苦耕耘,现在的varnish已经很健壮。很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。相信在反向代理,web加速方面,varnish已经有足够能力代替squid。
本篇博客主要介绍varnish在做代理服务器方面的一些功能和用法,与squid相比较,到底胜在了何处。
实验环境:
4台PC:redhat linux7.3版本,处于同一网段,配置好IP和yum源,关闭firewalld,selinux处于disable状态 ,关闭NetworkManager【可以创建一台虚拟主机,封装作为源主机,其余都用其快照】
主机PC : 测试主机:【IP】172.25.14.250
node1 :varnish代理服务器:【IP】172.25.14.1
node2 :web服务器1:【IP】172.25.14.2
node3 :web服务器2:【IP】172.25.14.3
实验准备:
可以自行搜索下载
jemalloc-3.6.0-1.el7.x86_64.rpm 【内存管理软件包】
varnish-libs-4.0.5-1.el7.x86_64.rpm【库文件包】
varnish-4.0.5-1.el7.x86_64.rpm【软件安装包】
varnish服务器配置:
将上述三个软件包发送至node1服务器上,使其作为varnish服务器,进行代理服务。
yum install -y * #将软件包中内容下载出来
rpm -qc varnish #查看varnish配置文件
#/etc/logrotate.d/varnish #日志配置文件、基本环境变量
#/etc/varnish/default.vcl #主配置文件
#/etc/varnish/varnish.params #环境配置说明文件
当我们安装好varnish后,系统会自动生成一个varnish用户,之后开启varnish服务后,会产生两个varnish进程,一个所有者是root,一个所有者是varnish用户。而varnish用户开启的这个进程才是主要的服务进程。root主要起监控的作用。
/usr/lib/systemd/system/varnish.service
是服务启动脚本,我们vim打开查看:
LimitNOFILE=131072 #最大文件个数 :系统中的文件描述符是有限的,所以会限制能打开文件的个数。
LimitMEMLOCK=82000 #varnish服务占用系统的最大内存
在系统中:
ulimit -l 查看系统最大可加锁内存,即系统最大内存
free -m 以字节来显示当前内存的使用情况
sysctl -a | grep file #系统描述符的使用情况
因为我们这里用的是虚拟机,当内存不足时可以在虚拟机管理器中添加内存,将其改为2048【注意关机状态下修改】
vim /etc/security/limits.conf #更改系统参数限制文件,添加varnish的限制
# - 代表默认类型
#item 为对应的选择【最大限制文件】【最大锁定内存】
#value为其值
vim /etc/varnish/varnish.params #更改varnish服务的配置文件,将监听端口改为80,因为我们后面要做代理服务器,httpd使用的是80端口
systemctl start varnish #开启varnish
systemctl status varnish #查看varnish状态
netstat -tnlp #查看已经开启的服务的监听端口
ps aux | grep varnish #过滤出varnish的进程【有两个,root用户和varnish用户分别有一个】
第一部分:简单实现varnish代理服务器的功能:代理一个web服务器:
以上我们的varnish代理服务器node1的基础配置就完成了。下面来配置我们的web服务器1:
web服务器node2:
下载httpd服务
编写默认发布文件
开启服务
测试,完成
yum install httpd #下载httpd服务
vim /var/www/html/index.html #编写默认发布文件 #我写入的是www.xyy.com
systemctl start httpd #开启服务
curl localhost #测试,访问本地,可以看到默认发布文件中的内容
这样我们的web1服务器就搭建完成了。
返回varnish代理服务器,选择代理web1,更改位置文件中的IP为web1的IP
node1:varnish服务器:
vim /etc/varnish/default.vcl #更改配置文件,设置代理主机的IP和监听端口
systemctl restart varnish #重启服务
测试主机:
去访问我们的varnish代理服务器,会得到web服务器的资源【默认发布文件中的内容】
curl 172.25.14.1 #访问代理服务器
第二部分:对有无缓存的不同返回结果
在varnish代理服务器主机上,我们写入当有缓存时和没有缓存时的不同:如果有缓存,则返回HIT from… 如果没有缓存,则返回MISS from…
vim /etc/varnish/default.vcl
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from xyy cache";
}
else {
set resp.http.X-Cache = "MISS from xyy cache";
}
return (deliver);
改完后重启服务:systemctl restart varnish
在测试主机250上进行测试:curl IP -I
会得到第一次miss即没有缓存,第二次以及之后都是HIT,命中缓存。
在varnish服务器node1上,可以采用varnishadm ban req.url "~" /
来清除缓存,然后再次用测试主机访问时,就会再次变为没有缓存的miss状态了。
如何写varnish的配置文件可以查看varnish的官方网站,有使用说明。
https://www.varnish-software.com/
也可以使用man vcl
,查看帮助文档
第三部分:代理多台web服务器:
varnish主要的两个作用:代理服务器和缓存数据。那么作为中转站点,当然不可以只转发存储一台服务器上的资源。所以我们需要再添加一个为web服务器node3,也让varnish去代理。
node3:
安装httpd,编写默认发布文件,开启服务,检测
yum install httpd -y
vim /var/www/html/index.html
systemctl start httpd
curl localhost
varnish代理服务器node1:
编写varnish配置文件,写入代理的两个web服务器的IP和端口,并写入调度的规则,重启服务
vim /etc/varnish/default.vcl
systemctl restart varnish #重启服务
172.25.14.250测试主机进行测试:
先写入解析:vim /etc/hosts
,将两个web服务器的资源写到varnish服务器的IP对应关系中,然后curl 域名 进行测试。【实现访问web1中的资源时,代理服务器会查找web1,访问web2中的资源时,代理服务器会查找web2】
第四部分:负载均衡
当主机去访问web1域名时,会通过代理服务器,让代理服务器提供答案,而代理服务器通过负载均衡模块,可以从web1和web2中轮循获得资源。
varnish代理服务器node1:
vim /etc/varnish/default.cvl
import为导入模块,使我们已经下载好的库模块
sub vcl_init_ 相当于负载均衡的函数
在下面第二张图中,我们访问www.xyy.com时,会调用该函数,使其轮循访问web2的资源
return(pass)代表不缓存,即能达到每次访问的内容不同。
第五部分:代理的一个站点多个域:
百度旗下的百度贴吧,百度地图,百度百科等一系列服务都在百度的主服务器上,是一个主服务器上有多个虚拟主机的应用。在代理时,也会遇到代理的一个站点有多个虚拟主机的情况。
web2:
首先我们在web2这个服务器主机上编写虚拟主机文件,使其上有多个虚拟主机。
然后创建虚拟主机的默认发布目录,并写入默认发布文件
重启httpd服务。
cd /etc/httpd/conf.d
ls
vim vhost.conf
<VirtualHost *:80>
DocumentRoot /www
ServerName www.westos.org
</VirtualHost>
<Directory "/www">
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot /bbs
ServerName bbs.westos.org
</VirtualHost>
<Directory "/bbs">
Require all granted
</Directory>
#一个虚拟主机的域名和web1相同,这样当我们访问web1时,会通过代理服务器访问到web2,实现同一域名对应多态服务器主机,达到负载均衡的效果。
mkdir /www /bbs
vim /www/index.html
www
vim /bbs/index.html
bbs
systemctl restart httpd
测试主机:
curl web1的域名,会获得为web1的资源,和web2中的相同域名的资源。而直接访问web2的资源,会通过代理服务器,再获得指定的资源。
第六部分:图形界面管理:
我们采用指令清除缓存的方式不是所有人都会的,所以我们需要一个图形化管理的方式。
这部分内容需要提前写好php文件,因为是以网页的形式呈现的。作者这里已经有自己的文件压缩包,所以就做一个简单的记录。
1.在varnish上安装httpd,unzip,php
2.解压php包到http默认发布目录,将解压出的目录中的所有内容移动到默认发布目录,编辑其中的config.php文件,改后图如下。
3.更改http使用的端口为8080,不和varnish冲突。
4.开启httpd服务。
5.在浏览器搜索:varnish服务器IP:8080
6.选择http,推送即要清除的文件【.*为清除所有】【/index.html清除默认发布文件,即缓存资源】
大大的小小阳