5

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



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

<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

可以看到回包:


http://xc-blog.qiniudn.com/img/20140810-varnish-1.png

查看使用的次数:

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就有问题了,看看下面一张图片,琢磨下就会明白。( -_-!! 结合两三个网站教程,偷来的。)



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


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

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

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

夏日小草
2014、08、10

夏日小草
2.2k 声望139 粉丝

[链接]