2014-04-14 11:47:01
来 源
IT技术网
Varnish
本文介绍CentOS系统下配置安装varnish服务器,希望对于Varnish入门者给与帮助。更多Varnish资源请本站内搜索。
我们到官方网站找到最新版本,目前是3.0.1

先执行

rpm --nosignature -i http://repo.varnish-cache.org/redhat/varnish-3.0/el5/noarch/varnish-release-3.0-1.noarch.rpm

指定安装包下载源,然后安装

yum install varnish

安装成功后,修改配置文件。

先假定我的Varnish安装在192.168.0.50上,另外有一台192.168.0.51服务器,我想通过varnish服务来代理针对于50上nginx和51上的nginx项目。这时将50的80端口分给varnish,将nginx的端口改为81或者8080等其它端口。设定abc.com 项目内容在50的nginx上,def.com项目内容在51的nginx上,这时将这2个域名都解析到50的80端口上,也就是varnish上。

vi /etc/varnish/default.vcl

# This is a basic VCL configuration file for varnish.  See the vcl(7)

# man page for details on VCL syntax and semantics.

#

# Default backend definition.  Set this to point to your content

# server.

#

backend default {

  .host = "127.0.0.1";

  .port = "81";

}

backend test {

  .host = "192.168.0.51";

  .port = "80";

}

#

# Below is a commented-out copy of the default VCL logic.  If you

# redefine any of these subroutines, the built-in logic will be

# appended to your code.

 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 != "GET" &&

req.request != "HEAD" &&

req.request != "PUT" &&

req.request != "POST" &&

req.request != "TRACE" &&

req.request != "OPTIONS" &&

req.request != "DELETE") {

/* Non-RFC2616 or CONNECT which is weird. */

return (pipe);

}

if (req.request != "GET" && req.request != "HEAD") {

/* We only deal with GET and HEAD by default */

return (pass);

}

if (req.http.Authorization || req.http.Cookie) {

/* Not cacheable by default */

return (pass);

}

if (req.http.host ~ "abc.com") {

set req.backend = default;

}

elseif (req.http.host ~ "def.com") {

set req.backend = test;

}

else{

error 404 "Unknown HostName!";

}

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);

}

return (hash);

 }

 sub vcl_hit {

return (deliver);

 }

 sub vcl_miss {

return (fetch);

 }

 sub vcl_fetch {

if (beresp.ttl <= 0s ||

beresp.http.Set-Cookie ||

beresp.http.Vary == "*") {

/*

* Mark as "Hit-For-Pass" for the next 2 minutes

*/

set beresp.ttl = 120 s;

return (hit_for_pass);

}

return (deliver);

 }

 sub vcl_deliver {

return (deliver);

 }

 sub vcl_error {

set obj.http.Content-Type = "text/html; charset=utf-8";

set obj.http.Retry-After = "5";

synthetic {"

 <?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>"} + obj.status + " " + obj.response + {"</title>

   </head>

   <body>

<h1>Error "} + obj.status + " " + obj.response + {"</h1>

<p>"} + obj.response + {"</p>

<h3>Guru Meditation:</h3>

<p>XID: "} + req.xid + {"</p>

<hr>

<p>Varnish cache server</p>

   </body>

 </html>

 "};

return (deliver);

 }

 sub vcl_init {

return (ok);

 }

 sub vcl_fini {

return (ok);

 }

按上诉配置后保存。

然后个人没有用系统自带的service启动,写了shell命令进行启动,可将其保存为restart_varnish.sh,启动时执行即可。内容如下:

pkill varnish

/usr/sbin/varnishd -u www -g www -f /etc/varnish/default.vcl -p http_max_hdr=256 -p http_req_hdr_len=8192 -p http_resp_hdr_len=16384 -p connect_timeout=30s -p send_timeout=60s -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:80

其中用户www和用户组www都是之前通过groupadd和useradd建好的,专门是用来操作varnish的。

配置中的优化以及细节参数以后再写。

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。