欢迎各位来投稿,投稿邮箱 admin@veimx.com 欢迎各位爱好PHP,linux的朋友们加入我们

Linux下WEB加速缓存器varnish的安装和配置

Linux spade 868℃ 0评论

20160627111724

Varnish HTTP Cache

Varnish是一款高性能的开源HTTP加速器  官方网站:https://www.varnish-cache.org 可能被墙 下期将发布一篇科学上网安全过中国长城防火墙访问国外知名网站

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。

https://www.varnish-cache.org/releases/index.html

20160627112300

如直接选择: redhat版本,点“Instructions(安装说明)“。弹出以下页面:https://www.varnish-cache.org/releases/install_redhat.html#install-redhat 就是安装说明,可以是以yum的方式安装

20160627112519

如果下载源码安装,在download页面选择download source这个选项就是源码安装,varnish相对来说,我们使用yum安装最好,这样下来的软件包最稳定,也是最安全的!

 

Varnish特点

比起squid更加轻量级,大致有以下几个特点:

缓存方式

可以基于内存缓存,也可以在磁盘上缓存

如果期望缓存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或使用SSD X 2 做RAID1避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如果必须要缓存在磁盘上还是建议使用ssd磁盘

可以利用虚拟内存方式,IO性能会非常好,支持设置0-60秒 精确缓存时间

而我们squid是将元数据缓存在内存,存储缓存在硬盘

支持VCL

其配置是通过vcl编程语言来完成的。其配置需要先转换成C代码,所以使用vcl所写的配置,要先转换成C语言代码,因此要依赖于GCC 临时的编译vcl配置的,编译完之后才能运行起来

 

注: Varnish Configuration Language – VCL(varnish配置语言-VCL)。Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish就把VCL转换成二进制代码。

VCL文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。

 

独特的日志存储和管理机制

日志既然保存在内存中,日志可以供多个应用程序所访问,所以一般查看命中率,当前请求有多少get post 方法等等,都需使用专用的工具才可以查看,比如varnishshtopvarnishlog 等命令工具用来查看日志信息

支持使用varnish状态引擎

通过巧妙的状态引擎的设计完成不同的引擎对用户的请求和缓存代理机制进行处理,用配置文件为状态引擎提供状态法则,完成缓存处理、完成代理处理等等

Varnish缓存数据原理

20160627115808

VCL处理流程

20160627114811

(1)Receive(收到,接受)状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass(通过)或Pipe(通道),或者进入Lookup(本地查询)。

(2)Lookup状态,在缓存中查找用户请求的对象,如果缓存中没有其请求的对象,后续操作很可能会将其请求的对象进行缓存;进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态。

(3)Pass状态,在此状态下,会进入后端请求,即进入fetch取状态。

(4)Fetch状态,在Fetch取状态下,对请求,进行后端的获取,发送请求,获得数据,并进行本地的存储。

(5)Deliver提供状态, 将获取到的数据发送给客户端,然后完成本次请求。

(6)pass:绕过缓存,即不从缓存中查询内容或不将内容存储至缓存中;

(7)pipe:不对客户端进行检查或做出任何操作,而是在客户端与后端服务器之间建立专用“管道”,并直接将数据在二者之间进行传送;此时,keep-alive连接中后续传送的数据也都将通过此管道进行直接传送,并不会出现在任何日志中;

varnish20160627120028

如上图:用户通过varnish加速时,有4条线路可选

 

varbish20160627120041

部署Varnish缓存网站

varnish服务器 spade1 IP:192.168.1.3 web服务器 spade2 spade3 IP:192.168.1.4 192.168.1.5

在这里我们使用YUM的方式进行安装,首先我们得配置varnish的YUM源

安装varnish

[root@spade1 ~]# vim /etc/yum.conf //缓存软件包到本地

cachedir=/var/cache/yum/$basearch/$releasever

keepcache=1             #次行修改值为1

安装配置yum源

[root@spade1 ~]# rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm    ## nosignature 是不验证 -i install安装的意思

查看是否配置YUM源

[root@spade1 ~]# cat /etc/yum.repos.d/varnish.repo 
[varnish-4.0]
name=Varnish 4.0 for Enterprise Linux
baseurl=https://repo.varnish-cache.org/redhat/varnish-4.0/el6/$basearch
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-VARNISH

安装varnish 相关的 jemalloc 依赖  主要用于内存的分布

[root@spade1 ~]# yum -y install  http://mirrors.ustc.edu.cn/epel/6Server/x86_64/jemalloc-3.6.0-1.el6.x86_64.rpm

安装 varnish

[root@spade1 ~]# yum -y install varnish

配置文件

/etc/varnish/default.vcl //VCL配置文件

/etc/sysconfig/varnish //主配置文件

启动服务

[root@spade1 ~]# service varnish restart
Stopping Varnish Cache: [失败]
Starting Varnish Cache: [确定]
[root@spade1 ~]# netstat -anptu | grep 6081
tcp 0 0 0.0.0.0:6081 0.0.0.0:* LISTEN 1739/varnishd 
tcp 0 0 :::6081 :::* LISTEN 1739/varnishd

缓存网站配置

[root@spade1 ~]# vim /etc/varnish/default.vcl

# Default backend definition. Set this to point to your content server.

backend default {

.host = “192.168.1.4”;             #修改为真实web服务器地址

.port = “80”;                       #web服务器端口

}

……

sub vcl_deliver {

# Happens when we have all the pieces we need, and are about to send the

# response to the client.

#

# You can do accounting or modifying the final object here.

if (obj.hits > 0) {

set resp.http.X-Cache = “HIT from veimx.com cache”;  }     #添加缓存Head头,可以通过curl命令查看到

else {

set resp.http.X-Cache = “MISS from veimx,.com cache”;  }

return (deliver);

}

[root@spade1 ~]# vim /etc/sysconfig/varnish

修改66行

VARNISH_LISTEN_PORT=80      #6081改为80

重启varnish 服务

[root@spade1 ~]# service varnish restart
Stopping Varnish Cache: [确定]
Starting Varnish Cache: [确定]

测试网站配置

先配置单个网站 我们来测试spade2 这台主机的WEB站点

[root@spade2 ~]# yum -y install httpd   ##安装HTTPD服务

[root@spade2 ~]# echo "WEB---veimx.com--welcome" > /var/www/html/index.html

[root@spade2 ~]# service httpd restart  ##重启HTTP服务

测试命中

http://192.168.1.4  web服务器

20160628133031

http://192.168.1.3  缓存服务器

20160628133049

访问192.168.1.63的使用,(IE11)按F12,出现开发工具,可以查看是命中的

20160628133325

在spade3上使用CURL检测命中

curl是通过url语法在命令行下上传或下载文件的工具软件,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控Web服务器状态。

参数:-I只取http响应头的信息,不取网页内容

[root@spade3 ~]# curl -i 192.168.1.4
HTTP/1.1 200 OK
Date: Thu, 16 Jun 2016 05:21:18 GMT
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Thu, 16 Jun 2016 05:14:45 GMT
ETag: "201d8-19-5355e50fa65a7"
Accept-Ranges: bytes
Content-Length: 25
Connection: close
Content-Type: text/html; charset=UTF-8

WEB---veimx.com--welcome
[root@spade3 ~]# curl -i 192.168.1.3
HTTP/1.1 200 OK
Date: Thu, 16 Jun 2016 05:21:45 GMT
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Thu, 16 Jun 2016 05:14:45 GMT
ETag: "201d8-19-5355e50fa65a7"
Content-Length: 25
Content-Type: text/html; charset=UTF-8
X-Varnish: 98306
Age: 0
Via: 1.1 varnish-v4
X-Cache: MISS from veimx.com cache    ##第一次访问是没有被命中的 我们再次访问下试试
Connection: keep-alive
Accept-Ranges: bytes

WEB---veimx.com--welcome
[root@spade3 ~]# curl -i 192.168.1.3
HTTP/1.1 200 OK
Date: Thu, 16 Jun 2016 05:21:45 GMT
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Thu, 16 Jun 2016 05:14:45 GMT
ETag: "201d8-19-5355e50fa65a7"
Content-Length: 25
Content-Type: text/html; charset=UTF-8
X-Varnish: 98309 98307
Age: 20
Via: 1.1 varnish-v4
X-Cache: HIT from veimx.com cache   ##命中成功
Connection: keep-alive
Accept-Ranges: bytes

WEB---veimx.com--welcome

若多次为没有命中,我们需要检测web服务器上的配置的keepalived功能是否正常,web服务器都提供长连接的方式,所谓长连接就是客户端一次请求完后,不关闭连接,保持一段时间的连接,下次此客户端再次请求时,不用创建新连接,复用所保持的连接即可。从理论上,长连接可以免去大量建立和关闭连接的资源消耗,但同时也有大量连接被占用的代价。因此可以初步判断长连接比短连接能带来更高的TPS,更低的CPU消耗,更少的IO,更高的内存占用。

[root@spade2 ~]# vim /etc/httpd/conf/httpd.conf

KeepAlive on            #默认为off,改为on

Varnish缓存不同域名网站

配置spade3这台web服务器

 

[root@spade3 ~]# yum -y install httpd

[root@spade3 ~]# echo "WEB--veimx3.com--welcome--192.168.1.5--spade3" > /var/www/html/index.html

[root@spade3 ~]# service httpd restart
停止 httpd: [失败]
正在启动 httpd: [确定]

Varnish服务器配置

[root@spade1 ~]# vim /etc/varnish/default.vcl 

# Default backend definition. Set this to point to your content server.
backend www {
.host = “192.168.1.4”;
.port = “80”;
}

.port = “80”;
}
backend bbs {
.host = “192.168.1.5”;
.port = “80”;
}

sub vcl_recv {
# Happens before we check if we have this in cache already.
#
if (req.http.host ~ “^(www.)?veimx.com”) {
set req.http.host = “www.veimx.com”;
set req.backend_hint = www; } elsif (req.http.host ~ “^bbs.veimx.com”) {
set req.backend_hint = bbs;
} else { return (synth(999,”Sorry,This Page Not Fond”)); }
}

sub vcl_backend_response {
# Happens after we have read the response headers from the backend.
#
# Here you clean the response headers, removing silly Set-Cookie headers
# and other mistakes your backend does.
}

sub vcl_deliver {
# Happens when we have all the pieces we need, and are about to send the
# response to the client.
#
# You can do accounting or modifying the final object here.
if (obj.hits > 0) {

set resp.http.X-Cache = “HIT from veimx.com cache”; } #添加缓存Head头,可
以通过curl命令查看到

else {

set resp.http.X-Cache = “MISS from veimx.com cache”; }

return (deliver);
}

安装如上配置文件进行参考修改。。。。。然后重载下varnish 服务

[root@spade1 ~]# service varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2016-06-28T13:52:42
VCL compiled.
VCL 'reload_2016-06-28T13:52:42' now active
available 0 boot
active 0 reload_2016-06-28T13:52:42

Done

测试

我们再次开一台主机spade4,用来做实验,,配置本地HOST文件 不懂的可以百度下,,,

[root@spade4 ~]# vim /etc/hosts

192.168.1.3 www.veimx.com
192.168.1.3 bbs.veimx.com

[root@spade4 ~]# yum install -y elinks //elinks测试命令抓取数据给我们

[root@spade4 ~]# elinks www.veimx.com --dump
 WEB---veimx.com--welcome
[root@spade4 ~]# elinks bbs.veimx.com --dump
 WEB--veimx3.com--welcome--192.168.1.5--spade3

测试curl 命令

[root@spade4 ~]# curl -i www.veimx.com
HTTP/1.1 200 OK
Date: Thu, 16 Jun 2016 05:50:46 GMT
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Thu, 16 Jun 2016 05:14:45 GMT
ETag: "201d8-19-5355e50fa65a7"
Content-Length: 25
Content-Type: text/html; charset=UTF-8
X-Varnish: 10 8
Age: 28
Via: 1.1 varnish-v4
X-Cache: HIT from veimx.com cache
Connection: keep-alive
Accept-Ranges: bytes

WEB---veimx.com--welcome
[root@spade4 ~]# curl -i bbs.veimx.com
HTTP/1.1 200 OK
Date: Thu, 16 Jun 2016 05:51:32 GMT
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Thu, 16 Jun 2016 05:28:08 GMT
ETag: "201d8-2e-5355e80d809a9"
Content-Length: 46
Content-Type: text/html; charset=UTF-8
X-Varnish: 32774 3
Age: 43
Via: 1.1 varnish-v4
X-Cache: HIT from veimx.com cache
Connection: keep-alive
Accept-Ranges: bytes

WEB--veimx3.com--welcome--192.168.1.5--spade3

用浏览器直接访问 192.168.1.3

20160628140658

 

 

Varnish缓存清理

清理之前,我们先测试缓存是否命中

[root@spade4~]# curl -I www.veimx.com/index.html   // spade4上做客户端测试

Via: 1.1 varnish-v4

X-Cache: HIT from xuegod cache

Connection: keep-alive

[root@spade1~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 ban req.url == /index.html //删除单个页面

[root@spade4 ~]# curl -I www.veimx.com/index.html

Via: 1.1 varnish-v4

X-Cache: MISS from xuegod cache

Connection: keep-alive

[root@spade1 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 ban req.url == .*$ //删除所有页面

[root@spade1 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 ban req.url == /admin/* //删除目录

== 符合 !=不符合   ~ 正则匹配   !~ 非正则匹配

Varnish配置文件详解

VARNISH_VCL_CONF=/etc/varnish/default.vcl  # 配置文件路径

VARNISH_LISTEN_PORT=80                    #varnish 监听地址   修改为80

VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1    #   文本界面CLI监听地址

VARNISH_ADMIN_LISTEN_PORT=6082             #   文本界面CLI监听端口

VARNISH_SECRET_FILE=/etc/varnish/secret     #  进入CLI安全密钥

VARNISH_MIN_THREADS=50                      # 启动varnish时默认启动多少个线程

VARNISH_MAX_THREADS=1000                     #varnish最大线程数

VARNISH_THREAD_TIMEOUT=120                   # 线程超时时间

VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin  # 指定varnish将数据存在硬盘的那个文件

VARNISH_STORAGE_SIZE=1G #硬盘缓存大小

VARNISH_STORAGE=“file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}” #  明确定义varnish将数据缓存在硬盘  #不要将数据缓存到硬盘中

VARNISH_STORAGE=“malloc,1024M”       #定义内存缓存

VARNISH_TTL=120                    # varnish TTL生存周期

启动时加载的变量:

DAEMON_OPTS=“-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \

-f ${VARNISH_VCL_CONF} \

-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \

-t ${VARNISH_TTL} \

-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \

-u varnish -g varnish \

#             -S ${VARNISH_SECRET_FILE} \

-s ${VARNISH_STORAGE}”

 



转载请注明:巴蜀风博客-个人爱好博客-你的私人博客 » Linux下WEB加速缓存器varnish的安装和配置

喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情