W3TC Varnish反向代理配置文件

Published on

昨天在装varnish cache,参考着各路教程一路都挺顺利,就是最后运行的时候开始报错了

Job for varnish.service failed because the control process exited with error code. See "systemctl status varnish.service" and "journalctl -xe" for details.

继续发现是VCL配置文件的问题,用默认的default.vcl就能正常启动。但是默认的配置基本不支持W3TC的purge,总不能每次都到后台手动清理吧,于是把之前报错的W3TC的varnish-sample-config.vcl还原,看具体哪里报错。

又经过了一番搜索找到了这篇Upgrading to Varnish 4,发现问题的原因是W3TC的配置文件是给varnish 3.0用的,而我装的4.0并不兼容旧版的VCL,所以对照着报错内容和升级指导把W3TC的sample config修改了一下。

#添加vcl版本申明
vcl 4.0;

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

acl purge {
  # Web server with plugin which will issue PURGE requests
  "localhost";
}

sub vcl_recv {
#这几句语法有变,同时最后的vcl_hit和vcl_miss部分也不再需要了
#  if (req.request == "PURGE") {
#    if (!client.ip ~ purge) {
#      error 405 "Not allowed.";
#    }
  if (req.method == "PURGE") {
    if (!client.ip ~ purge) {
      return(synth(405,"Not allowed."));
    }
    ban("req.url ~ ^" + req.url + "$ && req.http.host == " + req.http.host);
  }

#新版默认启用压缩,所以这部分不需要了
  # Normalize content-encoding
#  if (req.http.Accept-Encoding) {
#    if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|lzma|tbz)(\?.*|)$") {
#      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 {
#      remove req.http.Accept-Encoding;
#    }
#  }

  # Remove cookies and query string for real static files
  if (req.url ~ "\.(bz2|css|flv|gif|gz|ico|jpeg|jpg|js|lzma|mp3|mp4|pdf|png|swf|tbz|tgz|txt|zip)(\?.*|)$") {
    unset req.http.cookie;
    set req.url = regsub(req.url, "\?.*$", "");
  }

  if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)" ||
      req.url ~ "preview=true" ||
      req.url ~ "xmlrpc.php") {
    return (pass);
  }

#语法更改  return (lookup);
  return (hash);
}

#这部分语法有变
#sub vcl_fetch {
  # Don't cache backend
#  if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)" ||
#      req.url ~ "preview=true" ||
#      req.url ~ "xmlrpc.php") {
    # Dont modify anything, it's (pass) object
#  } else {
#    unset beresp.http.set-cookie;

#    if (beresp.status == 307) {
      # Don't cache temporary redirects like ?repeat=w3tc
#      set beresp.ttl = 0h;
#    } else if (req.url ~ "\.(bz2|css|flv|gif|gz|ico|jpeg|jpg|js|lzma|mp3|mp4|pdf|png|swf|tbz|tgz|txt|zip)$") {
#      set beresp.ttl = 30d;
#    } else {
#      set beresp.ttl = 4h;
#    }
#  }
#}
sub vcl_backend_response {
  # Don't cache backend
  if (bereq.url ~ "wp-(login|admin|comments-post.php|cron.php)" ||
      bereq.url ~ "preview=true" ||
      bereq.url ~ "xmlrpc.php") {
    # Dont modify anything, it's (pass) object
  } else {
    unset beresp.http.set-cookie;

    if (beresp.status == 307) {
      # Don't cache temporary redirects like ?repeat=w3tc
      set beresp.ttl = 0h;
    } else if (bereq.url ~ "\.(bz2|css|flv|gif|gz|ico|jpeg|jpg|js|lzma|mp3|mp4|pdf|png|swf|tbz|tgz|txt|zip)$") {
      set beresp.ttl = 30d;
    } else {
      set beresp.ttl = 4h;
    }
  }
}

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

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

没有注释的干净版本

vcl 4.0;

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

acl purge {
  # Web server with plugin which will issue PURGE requests
  "localhost";
}

sub vcl_recv {
  if (req.method == "PURGE") {
    if (!client.ip ~ purge) {
      return(synth(405,"Not allowed."));
    }
    ban("req.url ~ ^" + req.url + "$ && req.http.host == " + req.http.host);
  }

  # Remove cookies and query string for real static files
  if (req.url ~ "\.(bz2|css|flv|gif|gz|ico|jpeg|jpg|js|lzma|mp3|mp4|pdf|png|swf|tbz|tgz|txt|zip)(\?.*|)$") {
    unset req.http.cookie;
    set req.url = regsub(req.url, "\?.*$", "");
  }

  if (req.url ~ "wp-(login|admin|comments-post.php|cron.php)" ||
      req.url ~ "preview=true" ||
      req.url ~ "xmlrpc.php") {
    return (pass);
  }

  return (hash);
}

sub vcl_backend_response {
  # Don't cache backend
  if (bereq.url ~ "wp-(login|admin|comments-post.php|cron.php)" ||
      bereq.url ~ "preview=true" ||
      bereq.url ~ "xmlrpc.php") {
    # Dont modify anything, it's (pass) object
  } else {
    unset beresp.http.set-cookie;

    if (beresp.status == 307) {
      # Don't cache temporary redirects like ?repeat=w3tc
      set beresp.ttl = 0h;
    } else if (bereq.url ~ "\.(bz2|css|flv|gif|gz|ico|jpeg|jpg|js|lzma|mp3|mp4|pdf|png|swf|tbz|tgz|txt|zip)$") {
      set beresp.ttl = 30d;
    } else {
      set beresp.ttl = 4h;
    }
  }
}

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *