Nov 02

The simplest way to test syntax is to use the administration console via telnet on a Dev/QA Varnish machine. Your current running Varnish should allow your IP/localhost to connect if you have implemented a Varnish ACL.

  • Start up Varnish with single command-line
  • Login to console via telnet
  • Load the config you wish to test
  • Use the config.

On OSX:

sudo /usr/local/sbin/varnishd -F  -a localhost:3000 -b localhost:6081 -T localhost:6082

From another console/shell/ open connection to Varnish management console:

telnet localhost 6082
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Load config and try to use (the config used in this example has a syntax problem. Therefore, you will see compilation errors:

vcl.load error /Users/hbeaver/code/varnish_demo/config/syntax_error.vcl
106 181
Message from VCC-compiler:
Expected one of
	'acl', 'sub', 'backend',  or 'director'
Found: '}' at
(input Line 12 Pos 1)
}
#
Running VCC-compiler failed, exit 1VCL compilation failed

Conversely, if the VCL has good syntax you should see no errors:

vcl.load good_config /Users/hbeaver/code/varnish_demo/config/default.vcl
200 13
VCL compiled.

Tagged with:
Jul 15

This example uses Ruby to telnet into Varnish and issue the “url.purge .*” command. The only gotcha is that the varnish telnet server does not issue a command prompt which causes Ruby telnet to timeout and get cranky. Well a little exception handling hacks past this. Enjoy.

require 'rubygems'

namespace "varnish" do

  desc "Purge ALL urls from Varnish"
  task :global_purge => :environment do

    #It WILL timeout, just accept it. Varnish does not have a command prompt.
    require 'net/telnet'
    @result = ""
    begin
      localhost = Net::Telnet::new("Host" => "localhost",
      "Port" => 6082,
      "Timeout" => 5)
      localhost.cmd("url.purge .*") { |c| @result = c}
    rescue Exception
      if @result.include? ("200 0")
        puts "varnish purged OK."
      else
        raise "Varnish not purged."
      end
    end
  end

end

Tagged with:
Jul 14

What does this mean? Well for starters, those nice little PCRE shorthands for character classes just don’t work! So putting this in your Varnish VCL will silently do nothing:

if (req.url ~ "/\d+(/$|/\?|\?|$)") ...

whereas this match:

if (req.url ~ "/[0-9]+(/$|/\?|\?|$)") ...

Enjoy.

Tagged with: