varnish
如果是RedHat/CentOS系统,在安装varnish的时候首先要安装以下软件包automakeautoconflibtoolncurses-devellibxsltgroffpcre-devel
如果是RedHat/CentOS系统,在安装varnish的时候首先要安装以下软件包
automake
autoconf
libtool
ncurses-devel
libxslt
groff
pcre-devel
pkgconfig
groupadd www
useradd www -g www -s /sbin/nologin
mkdir -p /data/varnish/{cache,logs}
chmod w /data/varnish/{cache,logs}
chown -R www:www /data/varnish/{cache,logs}
cd /opt
yum install -y automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig
wget http://sourceforge.net/projects/varnish/files/varnish/2.1.3/varnish-2.1.3.tar.gz/download
tar -zxvf varnish-2.1.3.tar.gz
cd varnish-2.1.3
./configure --prefix=/usr/local/varnish
make;make install
http://blog.sina.com.cn/s/blog_48f9c0840100lten.html
http://kerry.blog.51cto.com/172631/402923/
#============================ varnish配置 ===========================
vi /usr/local/varnish/etc/varnish/kerry.vcl
backend kerry { #定义后端服务器名
.host = "192.168.9.203"; #定义后端服务器IP
.port = "80"; #定义后端服务器端口
}
backend king {
.host = "192.168.9.204";
.port = "80";
}
#定义访问控制列表,充许那些IP清除varnish 缓存
acl local {
"localhost";
"127.0.0.1";
}
#判断host请求针对那个后端服务器
sub vcl_recv {
if (req.http.host ~ "^(www.)?kerry.com$") { #泛域名的写法"^(.*.)?kerry.com$"
set req.backend = kerry;
}
elsif (req.http.host ~ "^(www.)?king.com$") {
set req.backend = king;
}
else {
error 404 "Unknown HostName!"; #如果都不匹配,返回404错误
}
#不充许非访问控制列表的IP进行varnish缓存清除
if(req.request == "PURGE") {
if (!client.ip ~ local) {
error 405 "Not Allowed.";
return (lookup);
}
}
#清除url中有jpg|png|gif等文件的cookie
if (req.request == "GET" && req.url ~ ".(jpg|png|gif|swf|jpeg|ico)$") {
unset req.http.cookie;
}
#取消服务器上images目录下所有文件的cookie
if (req.url ~ "^/images") {
unset req.http.cookie;
}
#判断req.http.X-Forwarded-For,如果前端有多重反向代理,这样可以获取客户端IP地址。
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);
}
#针对请求和url地址判断,是否在varnish缓存里查找
if (req.request != "GET" && req.request != "HEAD") {
return (pass);
} ## 对非GET|HEAD请求的直接转发给后端服务器
if (req.http.Authorization || req.http.Cookie) {
return (pass);
}
if (req.request == "GET" && req.url ~ ".(php)($|?)") {
return (pass);
} #对GET请求,且url里以.php和.php?结尾的,直接转发给后端服务器
return (lookup)