1.
安装环境,其他软件,varnish需要这些软件的支持。
yum install -y automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig
libedit*
2.
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.34/pcre-8.34.zip
手动下载地址:http://sourceforge.net/projects/pcre/files/pcre/
安装pcre
unzip -o pcre-8.34.zip
cd pcre-8.34
./configure --prefix=/usr/local/pcre/
make
make install
3
安装varnish
wget http://repo.varnish-cache.org/source/varnish-3.0.4.tar.gz
tar zxvf varnish-3.0.4.tar.gz
cd varnish-3.0.4
export PKG_CONFIG_PATH=/usr/local/pcre/lib/pkgconfig/
./configure --prefix=/usr/local/varnish --enable-dependency-tracking --enable-debugging-symbols --enable-developer-warnings
make
make install
cp redhat/varnish.initrc /etc/init.d/varnish --varnish的启动脚本
cp redhat/varnish.sysconfig /etc/sysconfig/varnish --varnish配置文件
cp redhat/varnish_reload_vcl /usr/local/varnish/bin/ --此文件用于修改配置文件后重新加载,这样避免重启造成已缓存文件丢失
新建文件,用来做缓存输出。
mkdir /data/varnish/cache
touch /data/varnish/cache/varnish_cache.data
修改配置
/usr/local/varnish/etc/varnish/default.vcl修改,配置
启动
/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s file, ,2G -T 192.168.1.216:2000 -a
注:192.168.1.216:100
192.168.1.216:2000是通过telnet访问的端口,-a后面的192.168.1.216:100是监听的http。也就是访问192.168.1.216:100,varnish就会执行,反向代理到后端主机
关闭varnish命令
pkill varnishd
端口访问:telnet 192.168.1.216 2000
如果无法没有找到telnet:yum
install
telnet
/usr/local/varnish/bin/varnishlog -n /data/varnish/cache
/usr/local/varnish/bin/varnishstat -n /data/varnish/cache
用url访问查看是否缓存(X-Cache)
/usr/bin/curl -I 192.168.1.216:100
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
域名实例:
开启varnish:
#########################/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s file, ,1G -T www.51buylink.com:2000 -a www.51buylink.com:80 //注释
标准开启写法(上面的哪行是错误的,在magento站不会更新):/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s file, ,1G -T www.51buylink.com:2000 -a :80
default.vcl:
backend default1 {
.host = "113.10.149.150";
.port = "81";
}
nginx.conf
listen 81;
server_name 113.10.149.150,www.51buylink.com;
root /www/web/51buylink.com;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
记录varnish日志
/usr/local/varnish/bin/varnishncsa -w /data/logs/varnish.log &
查看命中率:
/usr/local/varnish/bin/varnishstat
1675 0.00 0.06 Client requests received 为服务端接收的客户端请求次数
179 0.00 0.01 Cache hits 为命中缓存,从缓存中取得数据返回给客户端的次数,即命中率
11 0.00 0.00 Cache misses 为跳过pass缓存,从后端服务应用中取得数据返回给用户的次数,及查找缓存没有命中的
用help看看可以使用哪些Varnish命令:
/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 help
default.vcl的配置:
# This is a basic VCL configuration file for PageCache powered by Varnish for Magento module.
# default backend definition. Set this to point to your content server.
backend default1 {
.host = "192.168.1.216";
.port = "80";
}
backend default2 {
.host = "192.168.1.215";
.port = "80";
}
# admin backend with longer timeout values. Set this to the same IP & port as your default server.
director webserver random{
{.backend = default1; .weight = 5;}
{.backend = default2; .weight = 5;}
}
# add your Magento server IP to allow purges from the backend
acl purge {
"localhost";
"127.0.0.1";
}
import std;
sub vcl_recv {
set req.backend = webserver;
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" &&
req.request != "PURGE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
# purge request
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
ban("obj.http.X-Purge-Host ~ " + req.http.X-Purge-Host + " && obj.http.X-Purge-URL ~ " + req.http.X-Purge-Regex + " && obj.http.Content-Type ~ " + req.http.X-Purge-Content-Type);
error 200 "Purged.";
}
# switch to admin backend configuration
if (req.http.cookie ~ "adminhtml=") {
// set req.backend = admin;
}
# we only deal with GET and HEAD by default
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
}
# normalize url in case of leading HTTP scheme and domain
set req.url = regsub(req.url, "^http[s]?://[^/]+", "");
# collect all cookies
std.collect(req.http.Cookie);
# static files are always cacheable. remove SSL flag and cookie
if (req.url ~ "^/(media|js|skin)/.*\.(png|jpg|jpeg|gif|css|js|swf|ico)$") {
unset req.http.Https;
unset req.http.Cookie;
}
# not cacheable by default
if (req.http.Authorization || req.http.Https) {
return (pass);
}
# do not cache any page from index files
if (req.url ~ "^/(index)") {
return (pass);
}
# as soon as we have a NO_CACHE cookie pass request
if (req.http.cookie ~ "NO_CACHE=") {
return (pass);
}
# remove Google gclid parameters
set req.url = regsuball(req.url,"\?gclid=[^&]+$",""); # strips when QS = "?gclid=AAA"
set req.url = regsuball(req.url,"\?gclid=[^&]+&","?"); # strips when QS = "?gclid=AAA&foo=bar"
set req.url = regsuball(req.url,"&gclid=[^&]+",""); # strips when QS = "?foo=bar&gclid=AAA" or QS = "?foo=bar&gclid=AAA&bar=baz"
return (lookup);
}
# sub vcl_pipe {
# # Note that only the first request to the backend will have
# # X-Forwarded-For set. If you use X-Forwarded-For and want to
# # have it set for all requests, make sure to have:
# # set bereq.http.connection = "close";
# # here. It is not set by default as it might break some broken web
# # applications, like IIS with NTLM authentication.
# return (pipe);
# }
#
# sub vcl_pass {
# return (pass);
# }
#
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
if (req.http.cookie ~ "PAGECACHE_ENV=") {
set req.http.pageCacheEnv = regsub(
req.http.cookie,
"(.*)PAGECACHE_ENV=([^;]*)(.*)",
"\2"
);
hash_data(req.http.pageCacheEnv);
remove req.http.pageCacheEnv;
}
if (!(req.url ~ "^/(media|js|skin)/.*\.(png|jpg|jpeg|gif|css|js|swf|ico)$")) {
call design_exception;
}
return (hash);
}
#
# sub vcl_hit {
# return (deliver);
# }
#
# sub vcl_miss {
# return (fetch);
# }
sub vcl_fetch {
if (beresp.status == 500) {
set beresp.saintmode = 10s;
return (restart);
}
set beresp.grace = 5m;
# enable ESI feature if needed
if (beresp.http.X-Cache-DoEsi == "1") {
set beresp.do_esi = true;
}
# add ban-lurker tags to object
set beresp.http.X-Purge-URL = req.url;
set beresp.http.X-Purge-Host = req.http.host;
if (beresp.status == 200 || beresp.status == 301 || beresp.status == 404) {
if (beresp.http.Content-Type ~ "text/html" || beresp.http.Content-Type ~ "text/xml") {
if ((beresp.http.Set-Cookie ~ "NO_CACHE=") || (beresp.ttl < 1s)) {
set beresp.ttl = 0s;
return (hit_for_pass);
}
# marker for vcl_deliver to reset Age:
set beresp.http.magicmarker = "1";
# Don't cache cookies
unset beresp.http.set-cookie;
} else {
# set default TTL value for static content
set beresp.ttl = 4h;
}
return (deliver);
}
return (hit_for_pass);
}
sub vcl_deliver {
# debug info
if (resp.http.X-Cache-Debug) {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Cache = "MISS";
}
set resp.http.X-Cache-Expires = resp.http.Expires;
} else {
# remove Varnish/proxy header
remove resp.http.X-Varnish;
remove resp.http.Via;
remove resp.http.Age;
remove resp.http.X-Purge-URL;
remove resp.http.X-Purge-Host;
}
if (resp.http.magicmarker) {
# Remove the magic marker
unset resp.http.magicmarker;
set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
set resp.http.Pragma = "no-cache";
set resp.http.Expires = "Mon, 31 Mar 2008 10:00:00 GMT";
set resp.http.Age = "0";
}
}
# sub vcl_error {
# set obj.http.Content-Type = "text/html; charset=utf-8";
# set obj.http.Retry-After = "5";
# synthetic {"
#
# # "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
#
#
#
"} + obj.status + " " + obj.response + {"
#
#
#
Error "} + obj.status + " " + obj.response + {"
#
"} + obj.response + {"
#
Guru Meditation:
#
XID: "} + req.xid + {"
#
#
Varnish cache server
#
#
# "};
# return (deliver);
# }
#
# sub vcl_init {
# return (ok);
# }
#
# sub vcl_fini {
# return (ok);
# }
sub design_exception {
}