具体的部署搭建方法就不详细介绍,按照官网的方法安装varnish即可,下面说一说,在部署中遇到的一些问题,记录一下。
1、安装时出现libc版本过低的问题:系统的glibc版本太低,软件编译时使用了较高版本的glibc引起的
解决方法:
查看系统glibc支持的版本:
可以看到最高只支持2.12版本,所以考虑编译解决这个问题,
下载2.14版本的glibc:http://www.gnu.org/software/libc/下载最新版本,我这里下载了glibc-2.14.tar.xz
解压到任意目录准备编译:
Sudo -i
Tar -zxvfglibc-2.14.tar.gz
Cd glibc-2.14
Mkdirbuild
Cd build
../configure--prefix=/usr/local/glibc-2.14
Make -j4
Makeinstall
修改libc.so.6的软连接:
ln -s/usr/local/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
2、一些依赖包缺少的报错问题:
configure: error: rst2man is needed to build Varnish, please install python-docutils. 缺少 python-docutils configure: error: requires an X/Open-compatible Curses library 缺少 ncurses-devel configure: error: neither libedit nor another readline compatible library found 缺少 libedit-devel + libtoolize --copy --force ./autogen.sh: line 44: libtoolize: command not found 缺少 libtool
解决方法:yum安装相应的包即可。
Varnish处理请求的主要处理方法 1. vcl_recv 首先接收请求,判断是否要进一步处理,还是直接转发给后端(pass)等。 此过程中可以使用和请求相关的变量,例如客户端请求的url,ip,user-agent,cookie等,此过程中可以把不需缓存的地址,通过判断(相等、不相等、正则匹配等方法)转给后端,例如gif/png/jpg/css/js等静态文件; 2. vcl_fetch 当从后端服务器获取内容后会进入此阶段,除了可以使用客户端的请求变量,还可以使用从后端获取的信息(bersp),如后端返回的头信息,设置此信息的缓存时间TTL等; 3. vcl_miss 缓存未命中时中要做的处理 4. vcl_hit 缓存命中后做的处理 5. vcl_deliver 发送给客户端前的处理 6. vcl_pass 交给后端服务器 7. vcl_hash 设置缓存的键值key Varnish处理流程 首次请求时过程如下: recv->hash->miss->fetch->deliver 缓存后再次请求: recv->hash->hit->deliver(fetch的过程没了,这就是我们要做的,把要缓存的页面保存下来) 直接交给后端pass的情况: recv->hash->pass->fetch->deliver(直接从后端获取数据后发送给客户端,此时Varnish相当于一个中转站,只负责转发)
1、启动:
service varnish start
或者:
/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,512M -g varnish -u varnish -T 127.0.0.1:6081 -a 0.0.0.0:80
-f:选项用于指定Varnishd使用的配置文件的路径。
-s malloc,2G:–s选项用来确定Varnish使用的存储类型和存储容量,这里使用的是malloc类型(malloc是一个C函数,用于分配内存空间),2G 定义多少内存被malloced。
-T:127.0.0.1:6081是Varnish基于文本方式的一个管理接口,启动后可以在不停止Varnish的情况下来管理Varnish。管理端口6081可以指定。因为不是任何人都可以访问Varnish管理端口,所以这里推荐只监听本机端口。
-a:0.0.0.0:80中-a选项表示Varnish监听所有IP发给80端口的HTTP请求。
2、varnish缓存配置:
backend web1 { .host = "127.0.0.1"; .port = "80"; .connect_timeout = 1s; #连接超时时间 } #图片、swf等静态文件设置缓存,其他类型文件pass到后端. sub vcl_recv { if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For ", " client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } if (req.url ~ "\.(png|gif|jpg|swf|css|js)$") { return (lookup); } return (pass); } sub vcl_pipe { set bereq.http.connection = "close"; return (pipe); } sub vcl_pass { return (pass); }3、针对上面的配置,进行如下测试:
查看varnish缓存:varnishstat
通过ab -c 100 -n 8000 -X xx.xx.xx.xx:6081 -r http://test.vip.com/job.png 访问,结果如下
“Client connectionsaccepted”表示客户端向反向代理服务器成功发送HTTP请求的总数量。
“Client requestsreceived”表示到现在为止,浏览器向反向代理服务器发送HTTP请求的累计次数。由于可能会使用长连接,因此这个值一般会大于“Clientconnections accepted”的值。
“Cachehits”表示反向代理服务器在缓存区中查找并且命中缓存的次数。
“Cachemisses”表示直接访问后端主机的请求数量,也就是非命中数。
“N structobject”表示当前被缓存的数量。
“N expiredobjects”表示过期的缓存内容数量。
“N LRU movedobjects”表示被淘汰的缓存内容个数。
测试直接Miss到后端:
通过curl命令访问一个不是图片文件,根据配置,是不会缓存的,查看varnish的hits数是否有增加:
4、缓存清理:
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 url.purge /job.png
(待完善)