Web Summer Camp, September 1st, 2017
apt-get install varnish
apt-get install varnish
/etc/default/varnish, replace port 6081 by port 80
service apache2 restart
service varnish restart
httpstatusdogs.com
GET /path
HTTP/1.1 200 OK
Content-Type: text/html
<html>...</html>
twitter.com/stevelosh/status/372740571749572610
wget -Sq --spider ezvarnish.websc/solutions/expiration.php
curl -o /dev/null -sD - ezvarnish.websc/solutions/expiration.php
HTTP 1.1, RFC 2616, Sections 13.2 and 13.3
Cache-Control: s-maxage=3600, max-age=900
Expires: Thu, 15 May 2014 08:00:00 GMT
cd /var/www/html/summercamp/ezvarnish
git pull
sudo ./installation/enable-varnish.sh
curl -sD - ezvarnish.websc/noinfo.php
curl -sD - ezvarnish.websc/exercises/expiration.php
ETag: 82901821233
If-None-Match: 82901821233
304 Not Modified
curl -sD - ezvarnish.websc/exercises/etag.php
curl -H "If-None-Match: abc" -sD - ezvarnish.websc/exercises/etag.php
Last-Modified: Tue, 13 May 2014 08:13:20 GMT
If-Modified-Since: Tue, 13 May 2014 08:13:20 GMT
304 Not Modified
curl -sD - ezvarnish.websc/exercises/last-modified.php
curl -H "If-Modified-Since: {previous timestamp}" -sD - ezvarnish.websc/exercises/last-modified.php
gmdate('r') does not work as timezone is output as "+0000" instead of "GMT".
Cache-Control: s-maxage=0, private, no-cache
www.varnish-cache.org/trac/browser/bin/varnishd/default.vcl?rev=3.0 (Varnish 3)
www.varnish-cache.org/trac/browser/bin/varnishd/builtin.vcl?rev=4.0 (Varnish 4)
curl -sD - ezvarnish.websc/exercises/nocache.php
curl -sD - ezvarnish.websc/cookie.php
curl -H "Cookie: x" -sD - ezvarnish.websc/solutions/expiration.php
GET /resource
Accept: application/json
GET /resource
Accept: text/xml
Vary: Accept
curl -sD - ezvarnish.websc/exercises/content-negotiation.php
curl -H "Accept: application/json" -sD - ezvarnish.websc/exercises/content-negotiation.php
# app/config/config.yml
fos_http_cache:
cache_control:
rules:
# only match login.example.com
-
match:
host: ^login.example.com$
headers:
cache_control: { s_maxage: 0 }
vary: [Accept-Encoding, Accept-Language]
# match all actions of a specific controller
-
match:
attributes:
_controller: ^AcmeBundle:Default:.*
headers:
cache_control:
public: true
max_age: 15
s_maxage: 30
last_modified: "-1 hour"
Think carefully and test thoroughly
sub vcl_backend_response {
set beresp.http.X-TTL = beresp.ttl;
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}
backend default {
.host = "127.0.0.1";
.port = "8888";
}
backend legacy {
.host = "127.0.0.1";
.port = "8888";
}
sub vcl_recv {
if (req.url ~ "^/archive/") {
set req.backend_hint = legacy;
} else {
set req.backend_hint = default;
}
}
sub vcl_recv {
if (req.http.Cookie) {
if (req.url ~ "^/cache") {
remove req.http.Cookie;
}
}
}
curl -H "Cookie: x" -sD - ezvarnish.websc/solutions/expiration.php
sub vcl_recv {
set req.http.cookie = ";" + req.http.cookie;
set req.http.cookie = regsuball(req.http.cookie, "; +", ";");
set req.http.cookie = regsuball(req.http.cookie, ";(PHPSESSID)=", "; \1=");
set req.http.cookie = regsuball(req.http.cookie, ";[^ ][^;]*", "");
set req.http.cookie = regsuball(req.http.cookie, "^[; ]+|[; ]+$", "");
if (req.http.Cookie == "") {
remove req.http.Cookie;
}
}
varnish-cache.org/trac/wiki/VCLExampleRemovingSomeCookies #RemovingallBUTsomecookies
Group based caching
# config/varnish/common.vcl
include "fos_custom_ttl.vcl";
include "user_context.vcl";
sudo service varnish restart
ezvarnish.websc/user-context/ (with your browser)
cd /var/www/html/summercamp/ezvarnish
sudo ./installation/disable-varnish.sh