因为在网站里面有大些页面要频繁查询数据库,导致页面打开缓慢.本来是有做CDN,但是对于一些访问很少的页面,CDN会把缓存的内容清理掉.所以就只能在我们自己的服务器上进行缓存.
最后选择了varnish这个软件.安装是用yum进行安装的.没有使用源码编译.
在这里主要记录一下配置的记录.
最开始架构时没有想做专业的缓存服务器,所以现在要加缓存功能,就只能在WEB服务器上添加一个服务.
方法1:
使用varnish接管80端口,并代理到后端WEB服务器.
方法2:
使用WEB服务代理到varnish的端口,varnish的后端为提供WEB服务的站点.
因为我的服务器上有好几个WEB服务,所以就只选择了第二种方法.
将原先的站点端口改为其他端口,然后再写一个反向代理配置文件,代理到varnish上.
- # 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 = "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 reqreq.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.http.Authorization || req.http.Cookie) {
- /* Not cacheable by default */
- return (pass);
- }
- return (lookup);
- if (req.http.Accept-Encoding) {
- if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
- # No point in compressing these
- remove req.http.Accept-Encoding;
- } elsif (req.http.Accept-Encoding ~ "gzip") {
- set req.http.Accept-Encoding = "gzip";
- } elsif (req.http.Accept-Encoding ~ "deflate") {
- set req.http.Accept-Encoding = "deflate";
- }else {
- # unkown algorithm
- remove req.http.Accept-Encoding;
- }
- set req.grace = 15s;
- }
- if (req.url ~ "\.(css|jpg|jpeg|png|gif|swf)$") {
- unset req.http.Cookie;
- 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);
- if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|flv|ico|jpeg)$") {
- set beresp.ttl = 1d;
- }
- if (req.url ~ "\.(js|css|jpg|jpeg|png|gif|swf)$") {
- unset beresp.http.set-cookie;
- set beresp.ttl = 1d;
- }
- if (req.request == "GET" && req.url ~ "\.(htm|html)$") {
- set beresp.ttl = 1d;
- }
- if (beresp.http.Pragma ~ "no-cache" ||
- beresp.http.Cache-Control ~ "no-cache" ||
- beresp.http.Cache-Control ~ "private") {
- return(deliver);
- }
- if(beresp.status == 404 || beresp.status == 300) {
- error 404;
- }
- set beresp.grace = 30m;
- }
- sub vcl_deliver {
- return (deliver);
- 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";
- }
- }
- 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);
- }
在网上参考大神们的文档修改的,各位牛人们帮着看看有没有什么问题.
本来想加上对一些规则的注释,但是发现写不好,怕误导别人,所以还是不写的好.