Boosting Drupal Performance: Caching Strategies and Troubleshooting Tips

Boosting Drupal Performance: Caching Strategies and Troubleshooting Tips

Sam Rollin
Sam Rollin
July 28, 2025
Last updated : February 15, 2026
July 28, 2025

Drupal sites slow down as they grow. You add more content, get more visitors, and suddenly your pages take forever to load. Users bounce, conversions drop, and your hosting costs climb. The good news? Proper caching can solve most performance problems without expensive server upgrades.

This guide walks you through setting up a complete caching system for Drupal sites in 2025. You'll learn how to configure built-in caches, add external caching layers, and troubleshoot common issues. By the end, you'll have a fast, reliable site that handles traffic spikes gracefully.

Prerequisites

Before starting, make sure you have:

  • Drupal 10.x or 11.x site with admin access
  • Basic understanding of Drupal modules and configuration
  • Access to your hosting environment or server
  • Familiarity with command line tools (helpful but not required)
  • Development or staging environment for testing changes

Understanding Drupal's Caching System

Drupal uses multiple caching layers that work together. Think of it like a restaurant kitchen with different stations preparing different parts of your meal:

Page Cache: Stores complete HTML pages for anonymous visitors. When someone visits your homepage, Drupal saves the entire rendered page and serves it instantly to the next visitor.

Dynamic Page Cache: Handles authenticated users who see personalized content. It caches the parts of pages that stay the same while generating user-specific elements.

Render Cache: Saves the output of rendered elements like blocks, views, and content pieces. Instead of rebuilding these every time, Drupal pulls them from cache.

Entity Cache: Stores loaded entities (nodes, users, taxonomy terms) in memory so database queries aren't repeated.

Working with teams has taught us that understanding these layers prevents configuration mistakes that can actually hurt performance.

Step 1: Enable Built-in Caching

Start with Drupal's core caching features. Navigate to /admin/config/development/performance and enable:

  • Page caching for anonymous users
  • Dynamic page caching for authenticated users
  • CSS and JavaScript aggregation
  • Block caching

Set cache lifetimes appropriately:

  • Page cache: 1 hour (3600 seconds) for most sites
  • CSS/JS cache: 1 day (86400 seconds)
  • Block cache: 30 minutes (1800 seconds)

Don't set everything to maximum cache times initially. Start conservative and increase as you verify everything works correctly.

Step 2: Configure External Cache Backend

Drupal's default database caching works but isn't fast enough for busy sites. Set up Redis or Memcached for memory-based caching.

Installing Redis

Most hosting providers offer Redis as a service. For self-hosted sites, install Redis server and the PHP Redis extension.

Add this configuration to your settings.php file:

// Redis configuration
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['redis.connection']['host'] = '127.0.0.1';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';

// Use Redis for all cache bins except form storage
$settings['cache']['bins']['form'] = 'cache.backend.database';

Install the Redis module: composer require drupal/redis

Enable it: drush en redis -y

Verify the connection works by checking /admin/reports/status. You should see "Redis" listed as your cache backend.

Step 3: Add Reverse Proxy Caching

Reverse proxies like Varnish sit between visitors and your web server, serving cached pages before requests reach Drupal. This dramatically reduces server load.

Setting Up Varnish

Install Varnish on your server or use a hosting provider that offers it. Configure your VCL (Varnish Configuration Language) file:

vcl 4.0;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    # Remove cookies for static assets
    if (req.url ~ "\.(css|js|png|gif|jp(e)?g|swf|ico|pdf|mov|fla|zip|rar)$") {
        unset req.http.cookie;
    }
    
    # Pass through admin and user pages
    if (req.url ~ "^/admin" || req.url ~ "^/user") {
        return (pass);
    }
}

Install the Purge module to automatically clear Varnish cache when content updates:

composer require drupal/purge
drush en purge purge_ui varnish_purger -y

Configure purging at /admin/config/development/performance/purge.

Step 4: Implement CDN Integration

Content Delivery Networks cache and serve your static assets from locations worldwide. This speeds up asset loading for global visitors.

Cloudflare Setup

  • Sign up for Cloudflare and add your domain
  • Update your DNS to point to Cloudflare nameservers
  • Enable caching rules for static assets
  • Set up page rules for different content types

Install the CDN module to automatically rewrite asset URLs:

composer require drupal/cdn
drush en cdn -y

Configure CDN settings at /admin/config/development/cdn.

We've found that combining Cloudflare with proper cache headers gives the best results for most client projects.

Step 5: Fine-tune Cache Metadata

Drupal uses cache tags, contexts, and max-age to control caching behavior. Set these correctly in your custom code:

// In a custom block or controller
public function build() {
  $build = [
    '#markup' => $this->getContent(),
    '#cache' => [
      // Clear this cache when node 123 updates
      'tags' => ['node:123', 'user_list'],
      // Cache varies by user role and language
      'contexts' => ['user.roles', 'languages:language_interface'],
      // Cache for 1 hour
      'max-age' => 3600,
    ],
  ];
  return $build;
}

Cache Tags: Use specific tags so only relevant caches clear when content changes. Instead of clearing all caches, just clear caches tagged with updated content.

Cache Contexts: Only add contexts you actually need. Each context creates cache variations, so user.roles with 5 roles creates 5 cached versions.

Max-age: Set reasonable lifetimes. Dynamic content might cache for minutes, while static content can cache for hours or days.

Step 6: Add Performance Modules

Several contributed modules can boost performance further:

Advanced CSS/JS Aggregation (AdvAgg)

composer require drupal/advagg
drush en advagg advagg_css_minify advagg_js_minify -y

Configure at /admin/config/development/performance/advagg to:

  • Minify CSS and JavaScript
  • Generate critical CSS
  • Defer non-critical assets

Image Lazy Loading with Blazy

composer require drupal/blazy
drush en blazy -y

Configure image fields to use Blazy formatter. Images load only when users scroll them into view, speeding up initial page loads.

Quicklink for Instant Navigation

composer require drupal/quicklink
drush en quicklink -y

This prefetches links when users hover over them, making navigation feel instant.

Common Mistakes to Avoid

Setting cache max-age to 0: This disables caching entirely. Only do this for truly dynamic content that must never be cached.

Too many cache contexts: Each context multiplies cache storage requirements. A page with 3 contexts and 4 possible values each creates 64 cache variants.

Forgetting cache tags: Without proper tags, you'll have stale content or need to clear all caches frequently.

Not testing authenticated users: Anonymous caching is easier, but don't forget logged-in users need good performance too.

Ignoring mobile performance: Test caching behavior on mobile devices and slow connections.

Our approach involves testing each caching layer separately before combining them. This makes troubleshooting much easier when things go wrong.

Testing and Verification

Performance Testing Tools

GTmetrix: Free tool showing page load times and performance insights. Test before and after implementing caching strategies.

WebPageTest: More detailed analysis including waterfall charts showing resource loading.

Lighthouse: Built into Chrome DevTools, focuses on Core Web Vitals that affect SEO.

New Relic or Blackfire: Professional profiling tools that show cache hit rates and bottlenecks.

Cache Verification Commands

# Clear all caches
drush cache:rebuild

# Check cache backends
drush status | grep -i cache

# View cache statistics (if using Redis)
redis-cli info stats

# Test cache headers
curl -I https://yoursite.com

Monitoring Cache Performance

Set up monitoring to track:

  • Cache hit/miss ratios
  • Page load times
  • Server response times
  • Cache storage usage

Good cache hit rates are typically 80% for anonymous traffic and 60% for authenticated users.

Troubleshooting Common Issues

Stale Content Problems

Symptom: Updated content doesn't appear on the site
Cause: Missing or incorrect cache tags
Solution: Add proper cache tags to custom code and clear caches manually as a temporary fix

// Add cache tags for content dependencies
'#cache' => [
  'tags' => ['node:' . $node->id(), 'node_list'],
],

Cache Not Clearing Automatically

Symptom: Need to manually clear caches after content updates
Cause: Purge module not configured correctly
Solution: Check purge configuration and test API connections

Slow Performance for Logged-in Users

Symptom: Good anonymous performance but slow authenticated pages
Cause: Dynamic page cache not working or too many uncached elements
Solution: Review cache contexts and ensure authenticated caching is enabled

Redis Connection Errors

Symptom: Site errors mentioning Redis connection failures
Cause: Redis service down or configuration problems
Solution: Check Redis service status and verify connection settings in settings.php

CDN Assets Not Loading

Symptom: Missing images or stylesheets
Cause: Incorrect CDN configuration or CORS issues
Solution: Verify CDN settings and check browser console for specific errors

Advanced Configuration

Environment-Specific Settings

Use different cache settings for development, staging, and production:

// settings.local.php for development
$settings['cache']['bins']['render'] = 'cache.backend.null';
$settings['cache']['bins']['page'] = 'cache.backend.null';
$config['system.performance']['cache']['page']['max_age'] = 0;

// settings.prod.php for production  
$settings['cache']['default'] = 'cache.backend.redis';
$config['system.performance']['cache']['page']['max_age'] = 3600;

Custom Cache Invalidation

For complex sites, you might need custom cache clearing logic:

// Clear specific cache tags
\Drupal::service('cache_tags.invalidator')->invalidateTags(['node:123']);

// Clear cache bins
\Drupal::cache('render')->deleteAll();

// Clear specific cache entries
\Drupal::cache()->delete('my_custom_cache_key');

Measuring Success

Track these metrics to verify your caching improvements:

Before/After Comparison:

  • Page load time (should improve 50-80%)
  • Time to First Byte (should improve 60-90%)
  • Server CPU usage (should decrease 30-70%)
  • Database queries per page (should decrease significantly)

Ongoing Monitoring:

  • Cache hit rates (aim for 80% anonymous, 60% authenticated)
  • Core Web Vitals scores
  • User experience metrics (bounce rate, session duration)

Most sites see dramatic improvements after implementing proper caching. A typical e-commerce site might go from 8-second load times to 2-second load times just from adding Redis and Varnish.

Conclusion

Effective Drupal caching requires multiple layers working together: built-in page and render caches, external cache backends like Redis, reverse proxies like Varnish, and CDNs for asset delivery. The key is implementing each layer systematically, testing thoroughly, and monitoring performance continuously.

Start with Drupal's built-in caching, add Redis for memory-based storage, then implement reverse proxy caching for maximum performance gains. Don't forget to set up proper cache invalidation so content updates appear immediately.

We've learned that the most successful caching implementations combine technical configuration with ongoing monitoring and adjustment. Performance tuning isn't a one-time task – it's an ongoing process of measurement and refinement.

Ready to speed up your Drupal site but not sure which caching approach fits your specific situation? We can analyze your current performance bottlenecks and design a caching plan that works with your hosting environment and traffic patterns. Contact us to discuss how proper caching configuration can improve your site's speed and user experience.

Share this article