varnish与apache整合

varnish是一款http反向代理服务器,占用资源少,效率高,能加快您的web站点访问速度

官方站点:https://www.varnish-cache.org/

1.varnish安装

我在ubuntu12上安装的varnish3.0.5版本,依次执行一下命令

  1. curl http://repo.varnish-cache.org/debian/GPG-key.txt | sudo apt-key add -
  2. echo "deb http://repo.varnish-cache.org/ubuntu/ precise varnish-3.0" | sudo tee -a /etc/apt/sources.list
  3. sudo apt-get update
  4. sudo apt-get install varnish

如果是其他系统安装varnish,也可以从官网找到安装步骤:

https://www.varnish-cache.org/releases/varnish-cache-3.0.5

安装过程中可能要你更新或者安装其他依赖的包,按照提示安装完成即可

2.重要目录与脚本

安装完成后,varnish安装在如下几个重要目录

(1)安装目录:/usr/lib/varnish/

(2)配置文件所在目录:/etc/varnish/  默认使用default.vcl配置脚本

(3)启动项所在目录:/usr/sbin/varnishd   其实varnishd就是一个启动项脚本,用它来执行很多重要命令

比如执行 /usr/sbin/varnishd help  就能打印出varnishd这个脚本支持的选项,比如

很多选项,试试或者网上查下资料就知道怎么用

(4)varnish使用工具所在目录:/usr/bin/

比如varnishadm、varnishlog、varnishhist 等等很多实用工具都在这个目录

你可使用find命令列出这些工具


(5)varnish开机启动项  /etc/init.d/varnish

也可用它直接启动、关闭、检测varnish的状态,先查看帮助命令

说明有 start stop restart 等等命令你可以使用,比图

 /etc/init.d/varnish start 就是启动varnish 不过这里没指定启动的参数

 /etc/init.d/varnish status 可以查看varnish的启动状态

3.varnish启动与配置

(1)典型的vcl配置,编辑default.vcl配置脚本,根据自己的实际需求调整

#backend 定义后端服务器:告诉varnish遇到http请求应该从哪里去获取请求对应的内容
#可以指定为web服务器地址,比如apache;也可以指定为应用服务器地址,比如tomcat
#一般来说,varnish先从缓存查找,如果没命中才会去后端服务器请求
backend ihs1 {
	.host = "127.0.0.1";
	.port = "8080";
}

#如果有多个web/应用服务器,说明你有负载均衡设置,那么定义多个后端服务器即可
#backend ihs2 {
#	.host = "127.0.0.1";
#	.port = "8080";
#}

#定义varnish允许来自哪些IP段的清楚缓存的命令
acl purge {
        "localhost";
        "127.0.0.1";
	#"10.23.17.0"/24;
}

#如果多个web服务器要做负载均衡,就这么配置
#director 还有多种方式可以指定
director ihs_director round-robin {
	{ .backend = ihs1;}
	#{ .backend = ihs2;}	# 有多个则加多个后端服务器即可
}

#处理http请求
sub vcl_recv {
	set req.backend = ihs_director;	
	
	#如果是get请求则尝试从缓存查找,因为POST请求一般是表单提交,不要缓存
	if(req.request == "GET" && req.url ~ "^/.*$") {
		unset req.http.cookie;
		if (! req.backend.healthy) {
			set req.grace = 30m;
		} else {
			set req.grace = 15s;
		}
		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;
			}
		}
		return (lookup);
	}

	#如果是BAN命令,说明收到来自客户端清除varnish缓存的命令
	if (req.request == "BAN") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed";
                }
                set req.url = regsuball(req.url,"%28","(");
                set req.url = regsuball(req.url,"%29",")");
                set req.url = regsuball(req.url,"%7C","|");
                if (req.url ~ "^/$") {
                        ban("req.url == " + req.url);
                } else {
                        ban("req.url ~ " + req.url);
                }
                error 200 "Ban added";
        } elsif (req.request == "PURGE") {
                if (!client.ip ~ purge) {
                        error 405 "Not allowed";
                }
                return(lookup);
	}

	return (pass);
}

#命中
sub vcl_hit {
	if (req.request == "PURGE") {
		purge;
		error 200 "Purged.";
    }
}

#未命中
sub vcl_miss {
	if (req.request == "PURGE") {
		purge;
		error 200  "Not in cache.";
	}
}

#处理错误请求
sub vcl_error {
	if (obj.status == 750) {
                set obj.http.Location = "http://www.suning.com/";
                set obj.status = 302;
	}
	return(deliver);
}

#表示varnish已经从后端服务器获取内容,现在将控制权交给varnish来处理
#一般情况下,就是将该内容缓存起来
sub vcl_fetch {		
      
	if(beresp.status >= 400){
		set beresp.ttl = 0s;
		set beresp.http.Cache-Control = "no-cache,no-store,max-age=0";
	}

	if(beresp.http.Content-Length == "0" ){
		set beresp.ttl = 0s;
	}

	if(beresp.http.Cache-Control ~ "no-cache,no-store,max-age=0"){
		set beresp.ttl = 0s; 
	}

	#定义显示在http请求头中消息
	set beresp.http.Server = "SNWS";
	set beresp.grace = 30m;
	unset beresp.http.Set-Cookie;
	set beresp.http.Last-Modified = now;
	set beresp.http.magicmarker = "1";
}

sub vcl_deliver{
	if (resp.http.magicmarker) {
	/* Remove the magic marker */
	unset resp.http.magicmarker;
	/* By definition we have a fresh object */
	set resp.http.age = "0";
	}
	#如果命中,定义显示在http请求头消息中的标志
	#可应firefox的firebug工具查看这些请求头
	if (obj.hits > 0) {
		set resp.http.X-Cache = "Test-HIT_24";
		set resp.http.X-Cache-Hits = obj.hits;
	} else {
		set resp.http.X-Cache = "Test-MISS_24";
	}
	unset resp.http.X-Varnish;
	unset resp.http.Expires;
	set resp.http.Via = "1.1 Xcache_Test_24";
}

(2)启动varnish

第一个注意事项:

启动之前可以先检测varnish的启动状态,有多种方式

/etc/init.d/varnish status   或者  /etc/init.d/varnish status 

如果是处于启动状态,你可以停止:/etc/init.d/varnish stop  或者直接关闭与varnish相关的进程 pkill  varnish


第二个注意事项:

启动varnish,注意你的default.vcl配置,我这里后端服务器配置的是apache

backend ihs1 {
    .host = "127.0.0.1";
    .port = "80";
}

由于apache本身就占用了80端口,用户访问web应用,比如地址是:

http://localhost/demo/index.jsp

那么加了一道varnish缓存之后,这个web请求应该先交给varnish来处理

那么varnish启动时也要占用一个端口,一般生产系统varnish和apache不在同一台机器

并且varnish也要使用80端口才行,不然用户输入地址,你还的让它输个端口号呢。。。

本机测试,80端口已经给apache使用了,就随便用个端口来处理,比如 6081


启动命令如下,我指定了一些配置:

 /usr/sbin/varnishd -f /etc/varnish/default.vcl -s malloc,128M -a 0.0.0.0:6081 -T 127.0.0.1:2000

-f:指定以哪个vcl配置脚本启动

-s:分配内存 malloc 是一种分配内存的函数

-a:指定varnish本身以哪个端口启动,之前以说明apache占用了80端口,此处就随便指定一个

-T:varnish的管理端口

还有很多启动项可以配置,看看官方资料就明白了


4.测试varnish缓存

假设你本机apache或者tomcat应用是启动的,我本机是启动了apache

正常情况下,访问apache的默认主页:http://lolcalhost/

应该打印如下信息:

由于你启动了varnish,且使用的是6081端口

那么为了使varnish处理你的http请求,你应该使用6081端口来访问

注意前面已经说过:生产环境下,varnish和apache应该在不同机器上,都要使用80端口

这里由于在同一个机器,因此 6081 只做演示,看到这个页面,至少说明:

varnish从后端服务器已经取道内容了,也就是

http://localhost:6081/  其实已经转给 apache 的 http://localhost:80 端口处理

并且varnish从apache那边获取到内容了,现在来看看是否有缓存效果

多刷新几次页面,看看效果:

如果看到Hits:3 说明命中了3次,不信你可以把apache停掉

在访问这个页面仍然是可以打开的,因为varnish已经对这个http请求做了整体页面缓存









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值