首页 > 代码库 > 运维-服务器缓存之varnish
运维-服务器缓存之varnish
varnish
一、介绍下吧:
首先了解几个概念,
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/Linuxapache 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 varnishtcp 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
一直往下拉,还有(如果你已经配置了域名指向的话):
<VirtualHost *:8880>
ServerAdmin sharad@example.com
DocumentRoot /var/www/html/
ErrorLog logs/sample-error.log
CustomLog logs/sampleaccess_log common
</VirtualHost>
下面可以测试下了
我在我电脑本地的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/
运维的话,推荐《高性能网站建设指南》刘鑫,虽然里面都是坑(由于你的环境和主机不一样~),但是,工具还是很好的。