Pressflow 5 and Varnish
-
10-10-2019 - |
문제
We're currently running a site with:
Pressflow 5.23.50
Varnish 2.1.4
I suspect some of the problems I'm running to are based on the wide variety of documentation and that some of it is up to date and some of it isn't.
Currently I get these response headers:
Server Apache/2.2.3 (CentOS)
X-Powered-By PHP/5.1.6
X-Drupal-Cache HIT
Etag "1294852404-1"
Cache-Control public, max-age=0
Last-Modified Wed, 12 Jan 2011 17:13:24 GMT
Expires Sun, 19 Nov 1978 05:00:00 GMT
Vary Cookie,Accept-Encoding
Content-Encoding gzip
Content-Type text/html; charset=utf-8
X-Cacheable YES
Content-Length 7621
Date Wed, 12 Jan 2011 17:59:49 GMT
X-Varnish 1305826372
Age 0
Via 1.1 varnish
Connection keep-alive
X-Cache MISS
Varnish Config:
We are using the Global Redirect module and I have included the appropriate check as I've found online in it.
backend default {
.host = "127.0.0.1";
.port = "7900";
# .connect_timeout = 600s;
# .first_byte_timeout = 600s;
# .between_bytes_timeout = 600s;
# .max_connections = 25000;
}
sub vcl_recv {
set req.backend = default;
set req.grace = 5m;
remove req.http.X-Forwarded-For;
set req.http.X-Forwarded-For = client.ip;
# Properly handle different encoding types
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;
}
}
# Force lookup if the request is a no-cache request from the client
if (req.http.Cache-Control ~ "no-cache") {
return (pass);
}
## Default request checks
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.request != "GET" && req.request != "HEAD") {
# We only deal with GET and HEAD by default
return (pass);
}
## Modified from default to allow caching if cookies are set, but not http auth
if (req.http.Authorization) {
/* Not cacheable by default */
return (pass);
}
## Remove has_js and Google Analytics cookies.
set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(__[a-z]+|has_js)=[^;]*", "");
## Remove a ";" prefix, if present.
set req.http.Cookie = regsub(req.http.Cookie, "^;\s*", "");
## Remove empty cookies.
if (req.http.Cookie ~ "^\s*$") {
unset req.http.Cookie;
}
## Catch Drupal theme files - THIS BREAKS UPDATE.PHP DO NOT USE
#if (req.url ~ "^/sites/") {
# unset req.http.Cookie;
#}
# Catch Drupal misc files (like drupal.js and jquery.js)
#if (req.url ~ "^/misc/") {
# unset req.http.Cookie;
#}
# Drupal js/css doesn't need cookies, cache them
if (req.url ~ "^/modules/.*\.(js|css)\?") {
unset req.http.Cookie;
}
## Pass cron jobs and server-status
if (req.url ~ "cron.php") {
return (pass);
}
## Don't cache install
if (req.url ~ "install.php") {
return (pass);
}
# if (req.url ~ "index.php") {
# unset req.http.Cookie;
# }
# This is for Global Redirect.
if (req.url ~ "node\?page=[0-9]+$") {
set req.url = regsub(req.url, "node(\?page=[0-9]+$)", "\1");
return (lookup);
}
## Don't cache Drupal logged-in user sessions
if (req.http.Cookie ~ "(VARNISH|DRUPAL_UID)") {
return (pass);
}
return (lookup);
}
# Per-session cache
sub vcl_hash { if (req.http.Cookie) { set req.hash += req.http.Cookie; } }
sub vcl_fetch {
# These status codes should always pass through and never cache.
if (beresp.status == 404 || beresp.status == 503 || beresp.status == 500) {
set beresp.http.X-Cacheable = "NO: beresp.status";
set beresp.http.X-Cacheable-status = beresp.status;
return (pass);
}
# Grace to allow varnish to serve content if backend is lagged
set beresp.grace = 5m;
if (!beresp.cacheable) {
set beresp.http.X-Cacheable = "NO: !beresp.cacheable";
return (pass);
}
# All tests passed, therefore item is cacheable
set beresp.http.X-Cacheable = "YES";
return (deliver);
}
#
sub vcl_deliver {
# return (deliver);
#add cache hit data
if (obj.hits > 0) {
#if hit add hit count
set resp.http.X-Cache = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Cache = "MISS";
}
}
sub vcl_error {
if (obj.status == 503 && req.restarts < 5) {
set obj.http.X-Restarts = req.restarts;
restart;
}
}
I've also added this to the bottom of settings.php:
$conf['reverse_proxy'] = TRUE;
$conf['reverse_proxy_addresses'] = array('127.0.0.1');
I also have Drupal set to "Aggressive Caching" on the performance page.
Is there some little thing I'm missing or maybe a direction someone could point me towards on other things to try?
해결책
Many modules will either start a session or add a cookie that will cause the page to not be cacheable. There are a number of possibilities and solutions found here:
https://wiki.fourkitchens.com/display/PF/Modules+that+break+caching,+and+how+to+fix+them
some tips on debugging which module is starting a session.
다른 팁
I would take a look at the lullabot article too:
Configuring Varnish for High-Availability with Multiple Web Servers
http://www.lullabot.com/articles/varnish-multiple-web-servers-drupal
They have a full varnish config for drupal to start from, as well as a proper varnish status check php script.