欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

操作 - 服务器缓存 varnish

最编程 2024-05-03 21:41:26
...


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​

可以看到回包:

查看使用的次数:

​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://www.programmer.com.cn/14315/​​​​ (这个用编译安装就有坑。)
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

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

夏日小草
2014、08、10


  • ​2014年08月10日发布​


推荐阅读