Support » Plugin: Proxy Cache Purge » good varnish 4 default.vcl

Viewing 15 replies - 1 through 15 (of 19 total)
  • Plugin Author Ipstenu (Mika Epstein)

    (@ipstenu)

    🏳️‍🌈 Plugin Review Team Rep

    Not yet.

    gabu69

    (@gabu69)

    Got this one:

    #
    # This is an example VCL file for Varnish.
    #
    # It does not do anything by default, delegating control to the
    # builtin VCL. The builtin VCL is called when there is no explicit
    # return statement.
    #
    # See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/
    # and http://varnish-cache.org/trac/wiki/VCLExamples for more examples.
    
    # Update of varnish 4 to work with wordpress
    # Marker to tell the VCL compiler that this VCL has been adapted to the
    # new 4.0 format.
    vcl 4.0;
    
    # Default backend definition. Set this to point to your content server.
    backend default {
        .host = "127.0.0.1";
        .port = "8080";
        .connect_timeout = 600s;
        .first_byte_timeout = 600s;
        .between_bytes_timeout = 600s;
        .max_connections = 800;
    }
    
    # Only allow purging from specific IPs
    acl purge {
        "localhost";
        "127.0.0.1";
    }
    
    # This function is used when a request is send by a HTTP client (Browser)
    sub vcl_recv {
    	# Normalize the header, remove the port (in case you're testing this on various TCP ports)
    	set req.http.Host = regsub(req.http.Host, ":[0-9]+", "");
    
    	# Remove has_js and CloudFlare/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*", "");
    
    	# Allow purging from ACL
    	if (req.method == "PURGE") {
    		# If not allowed then a error 405 is returned
    		if (!client.ip ~ purge) {
    			return(synth(405, "This IP is not allowed to send PURGE requests."));
    		}
    		# If allowed, do a cache_lookup -> vlc_hit() or vlc_miss()
    		return (purge);
    	}
    
    	# Post requests will not be cached
    	if (req.http.Authorization || req.method == "POST") {
    		return (pass);
    	}
    
    	# --- WordPress specific configuration
    
    	# Did not cache the admin and login pages
    	if (req.url ~ "wp-(login|admin)" || req.url ~ "preview=true") {
    	return (pass);
    	}
    
    	# Remove the "has_js" cookie
    	set req.http.Cookie = regsuball(req.http.Cookie, "has_js=[^;]+(; )?", "");
    
    	# Remove any Google Analytics based cookies
    	set req.http.Cookie = regsuball(req.http.Cookie, "__utm.=[^;]+(; )?", "");
    
    	# Remove the Quant Capital cookies (added by some plugin, all __qca)
    	set req.http.Cookie = regsuball(req.http.Cookie, "__qc.=[^;]+(; )?", "");
    
    	# Remove the wp-settings-1 cookie
    	set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-1=[^;]+(; )?", "");
    
    	# Remove the wp-settings-time-1 cookie
    	set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-time-1=[^;]+(; )?", "");
    
    	# Remove the wp test cookie
    	set req.http.Cookie = regsuball(req.http.Cookie, "wordpress_test_cookie=[^;]+(; )?", "");
    
    	# Are there cookies left with only spaces or that are empty?
    	if (req.http.cookie ~ "^ *$") {
    		    unset req.http.cookie;
    	}
    
    	# Cache the following files extensions
    	if (req.url ~ "\.(css|js|png|gif|jp(e)?g|swf|ico)") {
    		unset req.http.cookie;
    	}
    
    	# Normalize Accept-Encoding header and compression
    	# https://www.varnish-cache.org/docs/3.0/tutorial/vary.html
    	if (req.http.Accept-Encoding) {
    		# Do no compress compressed files...
    		if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
    			   	unset 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 {
    			unset req.http.Accept-Encoding;
    		}
    	}
    
    	# Check the cookies for wordpress-specific items
    	if (req.http.Cookie ~ "wordpress_" || req.http.Cookie ~ "comment_") {
    		return (pass);
    	}
    	if (!req.http.cookie) {
    		unset req.http.cookie;
    	}
    
    	# --- End of WordPress specific configuration
    
    	# Did not cache HTTP authentication and HTTP Cookie
    	if (req.http.Authorization || req.http.Cookie) {
    		# Not cacheable by default
    		return (pass);
    	}
    
    	# Cache all others requests
    	return (hash);
    }
    
    sub vcl_pipe {
    	return (pipe);
    }
    
    sub vcl_pass {
    	return (fetch);
    }
    
    # The data on which the hashing will take place
    sub vcl_hash {
     	hash_data(req.url);
     	if (req.http.host) {
         	hash_data(req.http.host);
     	} else {
         	hash_data(server.ip);
     	}
    
    	# If the client supports compression, keep that in a different cache
        	if (req.http.Accept-Encoding) {
            	hash_data(req.http.Accept-Encoding);
    	}
    
    	return (lookup);
    }
    
    # This function is used when a request is sent by our backend (Nginx server)
    sub vcl_backend_response {
    	# Remove some headers we never want to see
    	unset beresp.http.Server;
    	unset beresp.http.X-Powered-By;
    
    	# For static content strip all backend cookies
    	if (bereq.url ~ "\.(css|js|png|gif|jp(e?)g)|swf|ico") {
    		unset beresp.http.cookie;
    	}
    	# Don't store backend
    	if (bereq.url ~ "wp-(login|admin)" || bereq.url ~ "preview=true") {
    		set beresp.uncacheable = true;
    		set beresp.ttl = 30s;
    		return (deliver);
    	}
    
    	# Only allow cookies to be set if we're in admin area
    		if (!(bereq.url ~ "(wp-login|wp-admin|preview=true)")) {
            	unset beresp.http.set-cookie;
    	}
    
    	# don't cache response to posted requests or those with basic auth
    	if ( bereq.method == "POST" || bereq.http.Authorization ) {
            	set beresp.uncacheable = true;
    		set beresp.ttl = 120s;
    		return (deliver);
        	}
    
        	# don't cache search results
    	if ( bereq.url ~ "\?s=" ){
    		set beresp.uncacheable = true;
                    set beresp.ttl = 120s;
                    return (deliver);
    	}
    
    	# only cache status ok
    	if ( beresp.status != 200 ) {
    		set beresp.uncacheable = true;
                    set beresp.ttl = 120s;
                    return (deliver);
    	}
    
    	# A TTL of 2h
    	set beresp.ttl = 2h;
    	# Define the default grace period to serve cached content
    	set beresp.grace = 30s;
    
    	return (deliver);
    }
    
    # The routine when we deliver the HTTP request to the user
    # Last chance to modify headers that are sent to the client
    sub vcl_deliver {
    	if (obj.hits > 0) {
    		set resp.http.X-Cache = "cached";
    	} else {
    		set resp.http.x-Cache = "uncached";
    	}
    
    	# Remove some headers: PHP version
    	unset resp.http.X-Powered-By;
    
    	# Remove some headers: Apache version & OS
    	unset resp.http.Server;
    
    	# Remove some heanders: Varnish
    	unset resp.http.Via;
    	unset resp.http.X-Varnish;
    
    	return (deliver);
    }
    
    sub vcl_init {
     	return (ok);
    }
    
    sub vcl_fini {
     	return (ok);
    }

    But im not sure what couldnt be right, trying to purge sometimes al the cache and it will simply not work

    Plugin Author Ipstenu (Mika Epstein)

    (@ipstenu)

    🏳️‍🌈 Plugin Review Team Rep

    What happens if you run this from the command line?

    curl -X PURGE "http://example.com/.*"

    Change example.com to your domain, obviously 🙂

    gabu69

    (@gabu69)

    mmmmmmmmmmmmm
    weird:

    <!DOCTYPE html>
    <html>
      <head>
        <title>405 This IP is not allowed to send PURGE requests.</title>
      </head>
      <body>
        <h1>Error 405 This IP is not allowed to send PURGE requests.</h1>
        <p>This IP is not allowed to send PURGE requests.</p>
        <h3>Guru Meditation:</h3>
        <p>XID: 524322</p>
        <hr>
        <p>Varnish cache server</p>
      </body>
    </html>

    why isnt it allowed :S

    gabu69

    (@gabu69)

    Though was /etc/hosts not having my host in
    127.0.0.1

    added my host and now got this:

    <!DOCTYPE html>
    <html>
      <head>
        <title>200 Purged</title>
      </head>
      <body>
        <h1>Error 200 Purged</h1>
        <p>Purged</p>
        <h3>Guru Meditation:</h3>
        <p>XID: 32770</p>
        <hr>
        <p>Varnish cache server</p>
      </body>
    </html>

    so what’s wrong

    Plugin Author Ipstenu (Mika Epstein)

    (@ipstenu)

    🏳️‍🌈 Plugin Review Team Rep

    Please use CODE tags (see the happy toolbar above the text box? There’s a button called ‘code’ 🙂 It’s great) to post code. Makes it readable 😉

    The error 200 is actually not an error. That’s a success.

    And I think if you’re getting that via the command line, the purge command via the plugin should work now 🙂

    gabu69

    (@gabu69)

    Yea, but it doesnt actually, I mod a post and its not updating :S

    Do you offer consulting services to check the server and see whats wrong?

    Plugin Author Ipstenu (Mika Epstein)

    (@ipstenu)

    🏳️‍🌈 Plugin Review Team Rep

    I don’t 🙁

    Have you tried using W3TC’s plugin with your Varnish install? It’s worked in places where mine hasn;t.

    gabu69

    (@gabu69)

    Yea just have tried it :S

    Weird thing is i have 2 websites in 2 ubuntu servers

    same install in:

    nginx + hhvm + varnish + cloudflare

    and one works and the other one doesnt purge cache :S so weird

    Plugin Author Ipstenu (Mika Epstein)

    (@ipstenu)

    🏳️‍🌈 Plugin Review Team Rep

    Same error? Yeah, its’ gotta be a server thing then 🙁 Sorry, I know less about nginx and hvvm than I do varnish 4.

    Cloudflare though… Make sure you set a varnish IP!

    define('VHP_VARNISH_IP','123.45.67.89');

    Make that the IP of your server.

    I am using same config as Gabu69 for some time now for WP.
    Works great and had no problems with WP.
    However, recently installed phpMyAdmin for obvious reasons.
    So added following:

    sub vcl_recv {
            # Ignore phpMyAdmin
            if (req.url ~ "^/phpMyAdmin") {
              return (pass);
            }

    Now still having troubles with the sessions.
    Can anyone explain how to tell Varnish to not trash the session data of phpmyadmin ?

    Plugin Author Ipstenu (Mika Epstein)

    (@ipstenu)

    🏳️‍🌈 Plugin Review Team Rep

    Don’t put phpmyadmin in wordpress’ folder, for one. Ssl secure it for another. That’s your database, man, it needs https. And it shouldn’t be installed under your user account, it should be owned by the server.

    I don’t use Varnish v 4 right now, so I really can’t offer you help debugging your own VCLs.

    Firewalled testing environment. Solved it already. Just pulling hairs out because of a typo. Thanks anyway.

    Plugin Author Ipstenu (Mika Epstein)

    (@ipstenu)

    🏳️‍🌈 Plugin Review Team Rep

    What was the typo? 🙂

    Working Varnish 4 configuration for WordPress https://gist.github.com/nadirlc/46987b42447cf8e3be79

Viewing 15 replies - 1 through 15 (of 19 total)
  • The topic ‘good varnish 4 default.vcl’ is closed to new replies.