├── Dockerfile ├── default.vcl └── start.sh /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:14.04.1 2 | MAINTAINER Ben Hall "Ben@BenHall.me.uk" 3 | 4 | RUN apt-get update -qq && \ 5 | apt-get upgrade -yqq && \ 6 | apt-get -yqq install varnish && \ 7 | apt-get -yqq clean 8 | 9 | # Make our custom VCLs available on the container 10 | ADD default.vcl /etc/varnish/default.vcl 11 | 12 | ENV VARNISH_PORT 80 13 | 14 | # Expose port 80 15 | EXPOSE 80 16 | 17 | ADD start.sh /start.sh 18 | CMD ["/start.sh"] -------------------------------------------------------------------------------- /default.vcl: -------------------------------------------------------------------------------- 1 | backend default { 2 | .host = "{VARNISH_BACKEND_HOST}"; 3 | .port = "{VARNISH_BACKEND_PORT}"; 4 | } 5 | 6 | sub vcl_recv { 7 | if (req.request == "PURGE") { 8 | return(lookup); 9 | } 10 | if (req.url ~ "^/$") { 11 | unset req.http.cookie; 12 | } 13 | } 14 | 15 | sub vcl_hit { 16 | if (req.request == "PURGE") { 17 | set obj.ttl = 0s; 18 | error 200 "Purged."; 19 | } 20 | } 21 | 22 | sub vcl_miss { 23 | #if purge request was not found, send 404 error 24 | if (req.request == "PURGE") { 25 | error 404 "Not in cache."; 26 | } 27 | #if request was not meant for the Wordpress admin interface, unset cookies 28 | if (!(req.url ~ "wp-(login|admin)")) { 29 | unset req.http.cookie; 30 | } 31 | #remove cookies from static resources 32 | if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") { 33 | unset req.http.cookie; 34 | set req.url = regsub(req.url, "\?.$", ""); 35 | } 36 | if (req.url ~ "^/$") { 37 | unset req.http.cookie; 38 | } 39 | } 40 | 41 | sub vcl_fetch { 42 | set beresp.ttl = 1w; 43 | 44 | if (req.url ~ "^/$") { 45 | unset beresp.http.set-cookie; 46 | } 47 | 48 | #bypass the proxy if the url contains the admin, login, preview or the xmlrpc 49 | if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true" || req.url ~ "xmlrpc.php") { 50 | return (hit_for_pass); 51 | } 52 | 53 | if (!(req.url ~ "wp-(login|admin)")) { 54 | unset beresp.http.set-cookie; 55 | } 56 | } 57 | 58 | 59 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | for name in VARNISH_BACKEND_PORT VARNISH_BACKEND_HOST VARNISH_BACKEND_DOMAIN 4 | do 5 | eval value=\$$name 6 | sed -i "s|{${name}}|${value}|g" /etc/varnish/default.vcl 7 | done 8 | 9 | varnishd -f /etc/varnish/default.vcl -s malloc,100M -a 0.0.0.0:${VARNISH_PORT} 10 | varnishlog 11 | --------------------------------------------------------------------------------