Claude Skills Guide

Claude Code for Varnish Cache Workflow Tutorial

Varnish Cache is a powerful HTTP reverse proxy and caching server used by thousands of websites to accelerate content delivery. Managing Varnish configurations, testing cache behavior, and deploying updates can be complex tasks. This tutorial shows how Claude Code CLI can streamline your Varnish workflows with intelligent automation and practical examples.

Setting Up Claude Code for Varnish Projects

Before diving into workflows, ensure Claude Code is installed and configured for your Varnish project. Create a project directory with your Varnish configuration files:

mkdir varnish-project && cd varnish-project
git init

Initialize your Varnish configuration structure:

mkdir -p {backend,acl,vcl_scripts,templates,tests}

The typical Varnish project structure includes:

Creating Varnish Configuration Skills

Claude Code works best when you create custom skills for your Varnish workflows. Create a skill file (varnish-workflow.md) in your project’s .claude/skills directory:

# Varnish Cache Workflow Skill

## Tools
- read_file: Read Varnish configuration files
- write_file: Create or modify VCL files
- bash: Execute Varnish commands and tests

## Pattern

When working with Varnish Cache configurations:

1. Parse the existing VCL structure to understand backend definitions, ACLs, and caching policies
2. Identify the specific caching requirements (TTL settings, grace mode, surrogate controls)
3. Validate VCL syntax using `varnishd -C` before applying changes
4. Test cache behavior with appropriate HTTP requests

## Example VCL Patterns

### Basic Backend Definition

vcl_recv {
    # Normalize host headers
    if (req.http.Host ~ "^(www\.)?example\.com$") {
        set req.http.host = "example.com";
    }
}

sub vcl_backend_response {
    # Cache static assets for 1 hour
    if (bereq.url ~ "\.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2)$") {
        set beresp.ttl = 1h;
        set beresp.uncacheable = false;
    }
}

Automated VCL Validation Workflow

One of the most practical workflows is automated VCL validation. Create a validation script that Claude Code can use:

#!/bin/bash
# validate-vcl.sh

VCL_FILE="${1:-default.vcl}"
varnishd -C -f "$VCL_FILE" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "VCL syntax valid: $VCL_FILE"
    exit 0
else
    echo "VCL syntax error in: $VCL_FILE"
    varnishd -C -f "$VCL_FILE" 2>&1
    exit 1
fi

Make it executable:

chmod +x validate-vcl.sh

Claude Code can then validate any VCL file by running this script, catching syntax errors before deployment.

Testing Cache Behavior

Testing Varnish cache behavior requires making HTTP requests and inspecting headers. Create a test helper script:

#!/bin/bash
# cache-test.sh

URL="${1:-http://localhost:6081/}"
HEADERS=$(curl -sI "$URL")

echo "Cache Testing Results for: $URL"
echo "---"
echo "$HEADERS"
echo "---"

# Check for cache hits
if echo "$HEADERS" | grep -q "X-Cache: HIT"; then
    echo "✓ Cache HIT detected"
elif echo "$HEADERS" | grep -q "X-Cache: MISS"; then
    echo "✓ Cache MISS - first request"
else
    echo "? Cache status unknown"
fi

This script helps verify that Varnish is properly caching responses.

Practical Workflow: Adding Cache Rules

Here’s a typical workflow for adding new cache rules using Claude Code:

Step 1: Analyze Existing Configuration

Ask Claude to review your current VCL:

“Review the current Varnish configuration and identify where cache TTLs are defined for API responses.”

Claude will read your VCL files and provide insights about current caching policies.

Step 2: Propose Changes

Based on the analysis, ask Claude to generate new rules:

“Generate VCL rules to cache /api/users/* endpoints for 5 minutes with grace mode enabled.”

Claude will create appropriate VCL snippets:

sub vcl_backend_response {
    # Cache API user endpoints
    if (bereq.url ~ "^/api/users/") {
        set beresp.ttl = 5m;
        set beresp.grace = 1h;
        set beresp.uncacheable = false;
    }
}

Step 3: Validate and Test

Run validation:

./validate-vcl.sh new-rules.vcl

Step 4: Deploy

Apply the configuration (on your Varnish server):

varnishadm -T localhost:6082 vcl.load new_config /path/to/new-rules.vcl
varnishadm -T localhost:6082 vcl.use new_config

Managing Multiple Environments

For projects with development, staging, and production environments, create environment-specific configurations:

# Directory structure
configs/
├── dev.vcl
├── staging.vcl
└── prod.vcl

Use environment variables or config files to manage differences:

# backend definition with conditional logic
backend default {
    .host = "{{BACKEND_HOST}}";
    .port = "{{BACKEND_PORT}}";
    .connect_timeout = {{CONNECT_TIMEOUT}};
    .first_byte_timeout = {{FIRST_BYTE_TIMEOUT}};
}

Replace placeholders during deployment:

envsubst < templates/backend.vcl > configs/prod.vcl

Cache Purging Workflows

Implementing cache purging is essential for content updates. Here’s a complete purge ACL and procedure:

# Define purge ACL
acl purge {
    "localhost";
    "192.168.1.0"/24;
    "10.0.0.0"/8;
}

sub vcl_recv {
    # Handle PURGE requests
    if (req.method == "PURGE") {
        if (!client.ip ~ purge) {
            return (synth(405, "Not allowed."));
        }
        return (purge);
    }
}

Create a purge script for easy invalidation:

#!/bin/bash
# purge-url.sh

URL="$1"
[ -z "$URL" ] && echo "Usage: $0 <url>" && exit 1

curl -XPURGE "$URL" -H "Host: example.com"
echo "Purge requested for: $URL"

Monitoring and Debugging

Varnish provides valuable debugging headers. Enable them in your VCL:

sub vcl_deliver {
    # Add debugging headers
    set resp.http.X-Cache = if(obj.hits > 0, "HIT", "MISS");
    set resp.http.X-Cache-Hits = obj.hits;
    set resp.http.Age = obj.age;
}

Create a monitoring script:

#!/bin/bash
# monitor-cache.sh

ENDPOINTS=(
    "http://localhost:6081/"
    "http://localhost:6081/api/users"
    "http://localhost:6081/static/style.css"
)

for endpoint in "${ENDPOINTS[@]}"; do
    echo "Testing: $endpoint"
    curl -sI "$endpoint" | grep -E "^(X-Cache|Age|X-Cache-Hits):"
    echo "---"
done

Actionable Tips for Varnish Workflows

  1. Modularize Your VCL: Break configurations into reusable snippets (backends.vcl, cache.vcl, purging.vcl) and include them using VCL’s include directive.

  2. Version Control All Configs: Store VCL files in git with meaningful commit messages describing what changed and why.

  3. Test Before Production: Always validate and test new VCL in development before deploying to production.

  4. Use Health Checks: Configure backend health probes to automatically remove failing backends from the pool.

  5. Monitor Cache Hit Ratio: A healthy Varnish setup typically achieves 80%+ cache hit ratio. Monitor this metric and investigate when it drops.

  6. Document Your Policies: Add comments in VCL explaining why certain TTLs or caching decisions were made.

Conclusion

Claude Code transforms Varnish Cache management from manual, error-prone processes into automated, reliable workflows. By creating custom skills, validation scripts, and test helpers, you can use Claude’s capabilities to handle configuration generation, syntax validation, testing, and deployment tasks efficiently.

The key is establishing good patterns: modular configurations, automated validation, comprehensive testing, and clear documentation. With these practices in place, Claude Code becomes an invaluable assistant for managing complex Varnish deployments.

Start by creating your project structure, building basic validation scripts, and defining a skill for Varnish workflows. As you become more comfortable, expand into advanced patterns like automated health check configuration, dynamic backend routing, and integrated monitoring dashboards.


This tutorial covers practical Varnish Cache workflows using Claude Code CLI. For more advanced topics like Varnish Enterprise features, ESI (Edge Side Includes), or VMOD development, explore our additional guides.

Built by theluckystrike — More at zovo.one