一、Varnish的安装、命令使用及配置文件介绍
二、以案例方式介绍如何配置Varnish
三、服务验证
一、Varnish的安装、命令使用及配置文件介绍
1、配置YUM源,使用yum安装Varnish
2、查看Varnish生成的文件
1234567891011121314151617
|
/etc/rc .d /init .d /varnish /etc/rc .d /init .d /varnishlog /etc/rc .d /init .d /varnishncsa /etc/sysconfig/varnish /etc/varnish /etc/varnish/default .vcl /usr/bin/varnish_reload_vcl /usr/bin/varnishadm /usr/bin/varnishhist /usr/bin/varnishlog /usr/bin/varnishncsa /usr/bin/varnishreplay /usr/bin/varnishsizes /usr/bin/varnishstat /usr/bin/varnishtest /usr/bin/varnishtop |
3、Varnish服务配置文件介绍
123456789101112131415161718192021222324252627
|
NFILES=131072 MEMLOCK=82000 NPROCS= "unlimited" RELOAD_VCL=1 VARNISH_VCL_CONF= /etc/varnish/default .vcl VARNISH_LISTEN_PORT=80 VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 VARNISH_ADMIN_LISTEN_PORT=6082 VARNISH_SECRET_FILE= /etc/varnish/secret VARNISH_MIN_THREADS=50 VARNISH_MAX_THREADS=1000 VARNISH_THREAD_TIMEOUT=120 VARNISH_STORAGE_FILE= /var/lib/varnish/varnish_storage .bin VARNISH_STORAGE_SIZE=1G VARNISH_MEMORY_SIZE=64M VARNISH_STORAGE= "malloc,${VARNISH_MEMORY_SIZE}" VARNISH_TTL=120 DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ -f ${VARNISH_VCL_CONF} \ -T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \ -t ${VARNISH_TTL} \ -w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \ -u varnish -g varnish \ -S ${VARNISH_SECRET_FILE} \ -s ${VARNISH_STORAGE}" |
4、启动Varnish
12345
|
[root@varnish ~] [root@varnish ~] tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 20303 /varnishd tcp 0 0 127.0.0.1:6082 0.0.0.0:* LISTEN 20301 /varnishd tcp 0 0 :::80 :::* LISTEN 20303 /varnishd |
5、Varnishd命令介绍
123456789101112131415
|
-a address:port -b address:port -d -f file -p param=value -P file -n dir -s kind[,storageoptions] -t -T address:port -V -w int[,int[,int]] -w min,max,timeout 如:-w3,25600,50 |
6、Varnishadm命令使用介绍
12345678910111213141516171819202122232425262728293031
|
varnishadm: invalid option -- 'h' usage: varnishadm [-n ident] [-t timeout] [-S secretfile] -T [address]:port command [...] -n is mutually exlusive with -S and -T 注释:常用选项 -S:指定密钥文件 -T:指定服务器地址与端口;如管理一个Varnish服务器,连接到Varnish服务器: varnish> help help [ command ] ping [timestamp] auth response quit banner status start stop vcl.load <configname> <filename> vcl.inline <configname> <quoted_VCLstring> vcl.use <configname> vcl.discard <configname> vcl.list vcl.show <configname> param.show [-l] [<param>] param. set <param> <value> panic.show panic. clear storage.list backend.list backend.set_health matcher state ban.url <regexp> ban <field> <operator> <arg> [&& <field> <oper> <arg>]... ban.list |
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
二、以案例方式介绍如何配置Varnish
A、环境介绍
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzYvNi83LzcvNzkvMTkzZGFjY2E4MGQ5NzgzOTMwYTZhYTZhNTE3MjY0NDUuanBl.jpe?w=700&webp=1)
架构简单描述:安装一个论坛程序,在Varnish服务器上做动静分离,将动态页面的请求都转发到"lamp"服务器组,"lamp"服务器组的数据库安装在"lamp1"服务器上面;将静态页面转发到"web"服务器组,对请求的静态内容做缓存
------------------------------------------------------------------------------------------------
B、安装lamp服务器并架设好论坛 更多详细安装请看前面博客...
1、在lamp1与lamp2服务器上安装服务并测试
12345678
|
[root@lamp1 ~] [root@lamp1 ~] [root@lamp1 ~] ------------------------------------------------------------------------ [root@lamp2 ~] [root@lamp2 ~] |
2、在Lamp1与Lamp2服务器创建php测试页面并访问验证,做法相同,这里只介绍一次
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzEvNS82LzgvNDAvNzJmNmRhNDBjZjE2OWE4MmM1MDIyNjk2Njg5MDJmYTcuanBl.jpe?w=700&webp=1)
3、安装论坛程序 点此下载
1234567891011
|
[root@lamp1 ~] mysql> create database bbs; mysql> grant all on bbs.* to 'bbsuser' @ '172.16.%.%' identified by 'bbspass' ; mysql> flush privileges; 注释:为论坛创建一个数据库并授权用户访问 ------------------------------------------------------------------------ [root@lamp1 ~] [root@lamp1 ~] [root@lamp1 ~] [root@lamp1 ~] |
4、访问"lamp1"服务器地址安装论坛
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzIvOS80LzQvMTcvZDQzMzljY2IwODllNGMxMWQ2NzZkYjJhZjc2YWFkMDYuanBl.jpe?w=700&webp=1)
5、点击我同意-->下一步-->(全新安装 Discuz! X)下一步-->安装数据库界面
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNi83LzUvMTMvYTMzMGQ5YmQyOGE1ZjEzY2FlZmFhODY2YTBjYTM3YmIuanBl.jpe?w=700&webp=1)
6、下一步-->安装完成-->访问主页并登录测试
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzEvMy81LzkvNjcvMjcwNmNmMmZkZTc1NWQ0MDk5Y2JlZmU0MTYxZmU5OGUuanBl.jpe?w=700&webp=1)
7、将论坛程序拷贝到lamp2服务器上一份并访问测试
12
|
[root@lamp1 ~] [root@lamp2 ~] |
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvNy85LzIvODcvYTA2ZWZjNWM1ODU3ZjM5OWYzOGFmZTdjOGY0ZjJjMTIuanBl.jpe?w=700&webp=1)
------------------------------------------------------------------------------------------------
C、安装web服务器并创建测试页访问
123
|
[root@web ~] [root@web ~] [root@web ~] |
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzkvNC83LzYvNDYvNzcxMjU1NWI5MDNmMjY1M2FjNTgwZDkyY2MyM2RjZjEuanBl.jpe?w=700&webp=1)
将Lamp1服务器上的论坛程序拷贝到WEB服务器一份,因为需要论坛中的一些静态文件如:(.jpg|.html)结尾的文件等
D、Varnish安装及配置,这里不再介绍如何安装,在第一部分已经介绍了如何安装
1、在第一部分中我们已经修改过默认监听端口为"80",接下来为Varnish提供一个VCL配置文件,建议基于默认的配置文件基础上修改,修改前备份一下文件
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
|
[root@varnish ~] [root@varnish varnish] [root@varnish varnish] acl purgers { "127.0.0.1" ; "172.16.0.0" /16 ; } probe dynamic { .url = "/index.html" ; .interval = 5s; .timeout = 1s; .expected_response = 200; } probe static { .url = "/index.html" ; .interval = 5s; .timeout = 1s; .expected_response = 200; } backend app1 { .host = "172.16.14.2" ; .port = "80" ; .probe = dynamic; } backend app2 { .host = "172.16.14.3" ; .port = "80" ; .probe = dynamic; } backend web { .host = "172.16.14.4" ; .port = "80" ; .probe = static; } director apps random { { .backend = app1; .weight = 2; } { .backend = app2; .weight = 2; } } sub vcl_recv { if (req.url ~ "\.php(\?\.*|$)" ) { set req.backend = apps; } else { set req.backend = web; } return (lookup); if (req.request == "PURGE" ) { if (!client.ip ~ purgers) { error 405 "Method not allowed" ; } return (lookup); } 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.request != "GET" && req.request != "HEAD" && req.request != "PUT" && req.request != "POST" && req.request != "TRACE" && req.request != "OPTIONS" && req.request != "DELETE" ) { return (pipe); } if (req.request != "GET" && req.request != "HEAD" ) { return (pass); } if (req.http.Authorization || req.http.Cookie) { return (pass); } if (req.http.Accept-Enconding) { if (req.url ~ "\.(jpg|jpeg|gif|bmp|png|flv|gz|tgz|tbz|mp3)$" ) { remove req.http.Accept-Encoding; remove req.http.Cookie; } else if (req.http.Accept-Encoding ~ "gzip" ) { set req.http.Accept-Encoding = "gzip" ; } else if (req.http.Accept-Encoding ~ "deflate" ) { set req.http.Accept-Encoding = "deflate" ; } else { remove req.http.Accept-Encoding; } } if (req.request == "GET" && req.url ~ "\.(jpeg|jpg|gif|png|bmp|swf)$" ) { unset req.http.cookie; } if (req.http.referer ~ "http://.*" ) { if (!(req.http.referer ~ "http://.*\.baidu\.com" || req.http.referer ~ "http://.*\.google\.com.*" )) { set req.http.host = "www.allen.com" ; set req.url = "http://172.16.14.4/error.html" ; } } } sub vcl_hash { hash_data(req.url); if (req.http.host) { hash_data(req.http.host); } else { hash_data(server.ip); } return ( hash ); } sub vcl_hit { if (req.request == "PURGE" ) { purge; error 200 "Purged." ; } return (deliver); } sub vcl_miss { if (req.request == "PURGE" ) { purge; error 404 "Not In Cache." ; } return (fetch); } sub vcl_pass { if (req.request == "PURGE" ) { error 502 "Purged On A Passed Object." ; } return (pass); } sub vcl_fetch { if (req.request == "GET" && req.url ~ "\.(html|jpg|png|bmp|jpeg|gif|js|ico|swf|css)$" ) { set beresp.ttl = 1d; set beresp.http.expires = beresp.ttl; } else { set beresp.ttl = 1h; } return (deliver); } sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "HIT" ; } else { set resp.http.X-Cache = "MISS" ; } } ---------------------------------------------------------------------- [root@varnish ~] ---------------------------------------------------------------------- [root@varnish ~] varnish> help varnish> vcl.load acl_1 default.vcl 200 VCL compiled. varnish> vcl.list 200 active 7 boot available 0 acl_1 varnish> vcl.use acl_1 200 varnish> quit ------------------------------------------------------------------------ 注释: -S:指定varnish的密钥文件 -T:指定varnish服务器地址及管理端口,默认端口为 "6082" |
2、如果要想让后端服务器记录客户端的真实IP地址需要修改Apache记录日志格式,如下:
1 |
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined |
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
三、服务验证
1、对服务器做压力测试,如下:
12345678910111213141516171819202122232425262728293031
|
[root@localhost ~] Concurrency Level: 1000 Time taken for tests: 6.812 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Non-2xx responses: 10051 Total transferred: 2281577 bytes HTML transferred: 0 bytes Requests per second: 1468.04 [ Time per request: 681.179 [ms] (mean) Time per request: 0.681 [ms] (mean, across all concurrent requests) Transfer rate: 327.10 [Kbytes /sec ] received ---------------------------------------------------------------------- [root@localhost ~] Concurrency Level: 1000 Time taken for tests: 2.594 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Non-2xx responses: 10056 Total transferred: 3117360 bytes HTML transferred: 0 bytes Requests per second: 3855.05 [ Time per request: 259.400 [ms] (mean) Time per request: 0.259 [ms] (mean, across all concurrent requests) Transfer rate: 1173.59 [Kbytes /sec ] received ---------------------------------------------------------------------- 注释:从上面数据中可以看出,经过缓存做压力测试并发量高 |
2、测试缓存是否能命中
1234567891011121314151617181920212223242526272829
|
[root@lamp2 ~] HTTP /1 .1 301 Moved Permanently Server: Apache /2 .2.15 (CentOS) X-Powered-By: PHP /5 .3.3 location: forum.php Content-Type: text /html ; charset=UTF-8 Content-Length: 0 Accept-Ranges: bytes Date: Wed, 09 Oct 2013 01:09:01 GMT X-Varnish: 2142028839 Age: 0 Via: 1.1 varnish Connection: keep-alive X-Cache: MISS ------------------------------------------------------------------------ [root@lamp2 ~] HTTP /1 .1 301 Moved Permanently Server: Apache /2 .2.15 (CentOS) X-Powered-By: PHP /5 .3.3 location: forum.php Content-Type: text /html ; charset=UTF-8 Content-Length: 0 Accept-Ranges: bytes Date: Wed, 09 Oct 2013 01:09:08 GMT X-Varnish: 2142028841 2142028839 Age: 7 Via: 1.1 varnish Connection: keep-alive X-Cache: HIT |
3、验证动、静分离的效果
12
|
[root@web ~] Stopping httpd: [ OK ] |
注释:从上图中可以看出,提供静态页面的服务停止后,所有图片都不能显示,当然把服务再启动起来就可以访问正常了,这里就不在测试了...
4、验证健康状态检测
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzgvMi82LzMvNi9kYjU5ZDQzM2M3MGJiODQ1ZjNlMzczYmM4MjAzYWVhMi5qcGU%3D.jpe?w=700&webp=1)
5、查看缓存命中率状态;命中率的高低
![Varnish在企业中的应用 Varnish在企业中的应用](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9pbWdzLzQvOC84LzkvNDYvYzJmYjhmYWQ3Yjk2MTU4ZDYyNDQ3MTUyYWY2Njc0ZWIuanBl.jpe?w=700&webp=1)
6、验证手动清除缓存
123456789101112131415161718192021222324252627282930313233
|
[root@lamp2 ~] <?xml version= "1.0" encoding= "utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > <html> < head > <title>200 Purged.< /title > < /head > <body> <h1>Error 200 Purged.< /h1 > <p>Purged.< /p > <h3>Guru Meditation:< /h3 > <p>XID: 580728625< /p > <hr> <p>Varnish cache server< /p > < /body > < /html > ---------------------------------------------------------------------- [root@lamp2 ~] HTTP /1 .1 301 Moved Permanently Server: Apache /2 .2.15 (CentOS) X-Powered-By: PHP /5 .3.3 location: forum.php Content-Type: text /html ; charset=UTF-8 Content-Length: 0 Accept-Ranges: bytes Date: Wed, 09 Oct 2013 02:03:03 GMT X-Varnish: 580728626 Age: 0 Via: 1.1 varnish Connection: keep-alive X-Cache: MISS 注释:由于上面清除了缓存,这里第一次请求为 "MISS" |
到此,Varnish的配置及验证已全部完成,