實驗背景:公司有一臺BBS服務器,用的是LNMP的架構搭建的。正好手頭有一臺空閑的虛擬機,于是想著給BBS前端加一臺緩存服務器。于是選定了varnish,搜了很多教程,跌跌撞撞的完成了配置。這其中很多配置的作用我也不是十分了解,這里先給出大體的配置,之后有時間會研究一下其中配置的原理和具體作用。
實驗系統:CentOS 6.4_x86_64
實驗前提:防火墻和selinux都關閉
實驗說明:本實驗共有2臺主機,ip分配如拓撲
實驗軟件:varnish-3.0.7-1 varnish-libs-3.0.7-1
下載地址:http://pan.baidu.com/s/1hq8hgoO
實驗拓撲:
一、安裝并配置varnish
1.在70.186上直接使用yum安裝:
yum -y install varnish-3.0.7-1.el6.x86_64.rpm varnish-libs-3.0.7-1.el6.x86_64.rpm
2.編輯/etc/sysconfig/varnish文件:
vim /etc/sysconfig/varnish------------------------------------------------>## Alternative 3, Advanced configurationVARNISH_VCL_CONF=/etc/varnish/default.vcl //使用的vcl文件VARNISH_LISTEN_PORT=80 //varnish自己監聽的端口VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 //admin管理接口使用的ipVARNISH_ADMIN_LISTEN_PORT=6082 //admin管理接口使用的端口VARNISH_SECRET_FILE=/etc/varnish/secret //密碼文件VARNISH_MIN_THREADS=50 //最小進程數VARNISH_MAX_THREADS=1000 //最大進程數VARNISH_THREAD_TIMEOUT=120 //超過此時間回收空閑進程VARNISH_STORAGE_SIZE=1G //存儲文件大小VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}" //指明使用存儲的類型及文件VARNISH_TTL=120DAEMON_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}"
3.編輯vcl文件:
vim /etc/varnish/default.vcl--------------------------------------------------------->backend default { .host = "192.168.90.186"; .port = "80";}acl local { "localhost"; "127.0.0.1";} 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.request == "PURGE") { if (!client.ip ~ local) { error 405 "Not Allowed."; } return (lookup); } if (req.request == "GET" && req.url ~ "/.(jpg|png|gif|swf|jpeg|flv|bmp|gz|tgz|bz2|tbz|js|CSS|ico)$") { unset req.http.cookie; } if (req.request == "GET" && req.url ~ "/.(js|css).*$") { unset req.http.cookie; } if (req.url ~ "^/images") { unset req.http.cookie; } 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.request == "GET" && req.url ~ "/.(php)($|/?)") { return (pass); } return (lookup); } sub vcl_pipe { return (pipe); } sub vcl_pass { if (req.request == "PURGE") { error 502 "PURGE on a passed object"; } return (pass); } 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 (!obj.ttl > 0s) { return (pass); } 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_fetch { if (beresp.ttl <= 0s || beresp.http.Set-Cookie || beresp.http.Vary == "*") { set beresp.ttl = 120 s; return (hit_for_pass); } if (beresp.http.PRagma ~ "no-cache" || beresp.http.Cache-Control ~ "no-cache" || beresp.http.Cache-Control ~ "private") { return (hit_for_pass); } if (req.request == "GET" && req.url ~ "/.(bmp|jpeg|jpg|png|gif|svg|png|ico|txt|css|js|html|htm)$") { unset beresp.http.set-cookie; set beresp.ttl = 1h; } else { set beresp.ttl = 1800s; } return (deliver); } sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "Hit Via" + " " + server.hostname; } else { set resp.http.X-Cache = "Miss Via" + " " + server.hostname; } return (deliver); } sub vcl_init { return (ok); } sub vcl_fini { return (ok); }
4.啟動varnish,查看端口,并打開瀏覽器測試:
service varnish startss -tnl
二、訪問測試:
1.瀏覽器打開http://192.168.70.186,并隨機訪問一些內容:
2.varnish狀態查看:
varnishstat
3.圖表查看:
varnishhist
4.前端客戶端用瀏覽器的F12功能查看緩存是否命中,這里用Chrome演示:
至此,緩存服務器搭建完畢,這其中還會有些問題,今天先粗淺的演示一下,謝謝大家!QQ:82800452
新聞熱點
疑難解答