资讯专栏INFORMATION COLUMN

运维-服务器缓存之varnish

leanote / 3534人阅读

摘要:如带有如下头信息,,默认不会缓存。是一款高性能开源的反向代理服务器和缓存服务器,其开发者是核心的开发人员之一。备份复制备份用默认端口开启你会得到如下信息我们看到,已经开启,但是除了知道这个东西已经监听端口外,我们不知道发生了什么。

varnish
  

小草新blog: http://homeway.me/

一、介绍下吧:

首先了解几个概念,

1. Varnish不缓存带有Set-Cookie头的http输出。

2. 对于HTTP协议中缓存部分,Varnish遵从http协议部分。如:带有如下头信息,Control-Cache: no-store, no-cache, must-revalidate, post-check=0, pre-check=0,默认varnish不会缓存。

3. HTTP协议中缓存部分,Control-Cache优先于Expires,Pragma: no-cache 是HTTP1.0的产物,可以不考虑。

Varnish是一款高性能、开源的反向代理服务器和缓存服务器,其开发者Poul-Henning Kamp是FreeBSD核心的开发人员之一。Varnish采用全新的软件体系结构,和现在的硬件体系配合比较紧密。目前,Varnish可以在FreeBSD6.0/7.0、Solaris和Linux 2.6内核上运行。

Varnish和Squid的对比

Varnish和Squid在完成相同负载的工作时,Squid服务器发生故障的几率要高于Varnish,因此Squid需要经常重启。

Varnish访问速度更快,Varnish采用了 Visual Page Cache技术,所有缓存的数据都直接从内存读取,而Squid从硬盘读取缓存的数据,所以

Varnish在访问速度方面会更快一些。

Varnish可以支持更多的并发连接,因为Varnish的TCP连接与释放比Squid快,所以在高并发连接情况下可以支持更多的TCP连接。

Varnish可以通过管理端口来管理缓存,使用正则表达式就可以批量清除部分缓存,而Squid做不到这一点。

二、安装及配置

强烈建议,不要编译安装,至于我是踩着坑走过来的。

我的安装环境:(请注意主机环境!!)

Linux 
2.6.32-358.6.2.el6.x86_64 #1 
SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 
GNU/Linux
apache 2.2.15

官网讲的简单易用。https://www.varnish-cache.org/installation/redhat

step1

rpm --nosignature -i https://repo.varnish-cache.org/redhat/varnish-4.0.el6.rpm

yum install varnish

step2 备份

复制备份vcl

cp /etc/varnish/default.vcl /etc/varnish/default.vcl.backup

cp /etc/sysconfig/varnish /etc/sysconfig/varnish.backup

step3

用默认端口6021开启varnish

/etc/init.d/varnish start

你会得到如下信息:

[root@varnish ~]# netstat -tanp|grep varnish
tcp        0      0 0.0.0.0:6081                0.0.0.0:*                   LISTEN      1640/varnishd       
tcp        0      0 127.0.0.1:6082              0.0.0.0:*                   LISTEN      1639/varnishd       
tcp        0      0 :::6081                     :::*                        LISTEN      1640/varnishd  

step4

我们看到,varnish已经开启,但是除了知道这个东西已经监听端口外,我们不知道发生了什么。

接下来要做的,就是修改apache的监听端口,将varnish监听端口指向80,将apache监听端口指向一个其他端口,再将varnish出口端口指向apache指向的端口。

这样,client->端口80->varinsh检测cache->apahce->client

vim /etc/sysconfig/varnish

VARNISH_LISTEN_PORT=80

step5

修改出口端口,指到一个没有用的端口就好了,千万不要再1024内就好了。

vim /etc/varnish/default.vcl

backend default {

.host = "127.0.0.1";

.port = "8880";

}

step6

修改apache的入口端口,和上面一个一样。

做个备份吧。

cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.backup



修改吧:

vim /etc/httpd/conf/httpd.conf

Listen *:8880



一直往下拉,还有(如果你已经配置了域名指向的话):

ServerAdmin sharad@example.com

DocumentRoot /var/www/html/

ErrorLog logs/sample-error.log

CustomLog logs/sampleaccess_log common


下面可以测试下了

我在我电脑本地的terminal里面输入:

curl -I http://xiaocaozone.net

可以看到回包:


查看使用的次数:

ls -l /var/log/varnish/

三、介绍下varnish配置信息:

指定一下命令的快捷方式

ln -s /usr/local/varnish/sbin/varnishd /usr/bin/varnishd

ln -s /usr/local/varnish/bin/varnishlog /usr/bin/varnishlog

ln -s /usr/local/varnish/bin/varnishncsa /usr/bin/varnishncsa

ln -s /usr/local/varnish/bin/varnishadm /usr/bin/varnishadm

ln -s /usr/local/varnish/bin/varnishstat /usr/bin/varnishstat

文件位置:

/etc/varnish/ 存放varnish VCL配置文件

/etc/sysconfig/varnish 【CentOS】 存放varnish服务器运行的参数

/etc/default/varnish 【Ubuntu】 存放varnish服务器运行的参数

/usr/sbin/varnishd varnish服务器执行文件

/etc/init.d/varnish 运行程序

varnish命令:

varnishadm 管理Varnish后端的工具 telnet也可以(下面详细介绍)

varnishhist 查看Varnish命中的工具 运行可以看到一张柱状描绘图,|表示缓存命中,#表示未命中,横向代表时间。 【非常有用】

varnishlog 实时显示varnish的请求日志

varnishncsa 以Apache标准的格式combined输出日志

varnishstat 查看状态、参数等,具体查阅百度。【非常有用】

varnishtop 类似top工具,查看varnish相关进程的资源、运行等状况。


接下来测试下命令:

telnet 127.0.0.1 6082

如果没有装telnet装下:

yum install telnet

出现的是一些admin命令:


varnishlog后用浏览器登录网站结果:




varnishstat查看varnish状态:


四、下面是一些varnish原理(抄~)

varnish包含以下几个模块

  

(1)vcl_recv模块

用于接收和处理请求。当请求成功被调用后,Varnish通过判断请求的数据来决定如何处理请求。此模块一般以如下几个关键字结束。

pass:表示进入pass模式,把请求交给vcl_pass模块处理。
pipe:表示进入pipe模式,把请求交给vcl_pipe模块处理。
error code [reason]:表示把错误标识返回给客户端,并放弃处理该请求。错误标识包括200、405等。“reason”是对错误的提示信息。

  

(2)Roulette ist ein sehr geselliges Spiel, alle halten gleicherma?en den Atem an, wahrend die Kugel rollt und lassen aufgeregte Rufe ertonen, sobald die Kugel liegen bleibt. New Roman;”>vcl_pipe模块

此模块在请求进入pipe模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,也就是在当前连接未关闭时,服务器将不变的内容返回给客户端,直到该连接被关闭。

  

(3)vcl_pass模块

此模块表示当请求被pass后,用于将请求直接传递至后端应用服务器。后端应用服务器在接收请求后将数据发送给客户端,但不进行任何数据的缓存,在当前连接下每次都返回最新的内容。

  

(4)lookup

一个请求在vcl_recv中被lookup后,Varnish将在缓存中提取数据。如果缓存中有相应的数据,就把控制权交给vcl_hit模块;如果缓存中没有相应的数据,请求将被设置为pass并将其交给vcl_miss模块。

  

(5)vcl_hit模块

执行lookup指令后,Varnish在缓存中找到请求的内容后将自动调用该模块。

在此模块中,deliver表示将找到的数据发送给客户端,并把控制权交给vcl_deliver模块。

  

(6)vcl_miss模块

执行lookup后,Varnish在缓存中没有找到请求的内容时会自动调用该方法。此模块可以用于判断是否需要从后端服务器获取内容。

在此模块中,fetch表示从后端获取请求的数据,并把控制权交给vcl_fetch模块。

  

(7)vcl_fetch模块

在后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。

  

(8)vcl_deliver模块

当一个没有被缓存的数据交付给客户端的时候被调用。

  

(9)vcl_timeout 模块

在缓存数据到期前调用此模块。

在此模块中,discard表示从缓存中清除到期数据。

  

(10)vcl_discard模块

在缓存数据到期后或缓存空间不够时,自动调用该模块。


看不懂就对了,这样能看懂,varnish就有问题了,看看下面一张图片,琢磨下就会明白。( -_-!! 结合两三个网站教程,偷来的。)



下面一张另一个网站的,我是看不懂了,如果你看得懂就看吧。


=================================

踩着坑,走过来的人,给你几条链接,放心,没坑的:

http://sharadchhetri.com/2013/09/25/how-to-install-and-configure-varnish-3-x-in-centos-and-red-hat/

http://www.programmer.com.cn/14315/ (这个用编译安装就有坑。)

http://www.drupal001.com/2013/05/varnish-cache-php-output/

http://www.drupal001.com/2011/12/varnish-drupal-basic/

http://www.drupal001.com/2011/12/varnish-drupal-advanced/

运维的话,推荐《高性能网站建设指南》刘鑫,虽然里面都是坑(由于你的环境和主机不一样~),但是,工具还是很好的。

夏日小草
2014、08、10

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/7896.html

相关文章

  • 缓存务器Varnish

    摘要:线程对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的根,处理过期的文件。缓存会根据进来的请求保存输出内容的副本当下一个请求到来的时候,如果是相同的,缓存会根据缓存机制决定是直接使用副本响应访问请求还是向源服务器再次发送请求。 博文参考 http://www.178linux.com/76700 http://www.mamicode.com/info-detail-22...

    Baaaan 评论0 收藏0
  • 缓存务器Varnish

    摘要:线程对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的根,处理过期的文件。缓存会根据进来的请求保存输出内容的副本当下一个请求到来的时候,如果是相同的,缓存会根据缓存机制决定是直接使用副本响应访问请求还是向源服务器再次发送请求。 博文参考 http://www.178linux.com/76700 http://www.mamicode.com/info-detail-22...

    MSchumi 评论0 收藏0
  • 缓存务器Varnish

    摘要:线程对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的根,处理过期的文件。缓存会根据进来的请求保存输出内容的副本当下一个请求到来的时候,如果是相同的,缓存会根据缓存机制决定是直接使用副本响应访问请求还是向源服务器再次发送请求。 博文参考 http://www.178linux.com/76700 http://www.mamicode.com/info-detail-22...

    William_Sang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<