How to Configure Apache Microcache for Drupal?

Configure Apache Microcache

Apache HTTP Server, commonly known as Apache, is a widely used open-source web server. Caching is an essential aspect of web server optimization — it can significantly improve response time and reduce load on the server. “Apache Microcache” typically refers to a small, quickly-accessible cache used to improve performance, often for a short TTL on top of an origin that would otherwise be hit on every request.

Here are the general steps to configure an Apache Microcache in front of Drupal.

1. Enable mod_cache and the disk cache module

Make sure the caching modules are loaded in your Apache configuration:

sudo nano /etc/httpd/conf/httpd.conf

# Ensure mod_cache is loaded:
LoadModule cache_module modules/mod_cache.so

# Load the disk cache backend. The module name/file depends on your Apache version:
#   Apache 2.4+ (current):  mod_cache_disk  ->  modules/mod_cache_disk.so
#   Apache 2.2 (legacy):    mod_disk_cache  ->  modules/mod_disk_cache.so
LoadModule cache_disk_module modules/mod_cache_disk.so

Version note: mod_disk_cache was renamed to mod_cache_disk in Apache 2.4. Check httpd -v first, and match the LoadModule line, the .so filename, and the <IfModule> guard below to whichever version you’re actually running — mixing the 2.2 and 2.4 names is a common cause of “module not loaded” errors.

2. Configure mod_cache and the disk cache

Below is a baseline configuration tuned for Drupal. Adjust it for your own traffic patterns and site structure; other CMSs will need different CacheDisable paths and TTLs.

<IfModule mod_cache.c>
  # Turn off CacheQuickHandler so requests still pass through
  # other output filters (needed for compression below).
  CacheQuickHandler Off

  # Cache headers off by default; enable only for debugging.
  CacheHeader Off
  CacheDetailHeader Off

  # Cache responses even without a Last-Modified header.
  CacheIgnoreNoLastMod On

  # Cache expiry (seconds).
  CacheDefaultExpire 180
  CacheMinExpire 5
  CacheStoreExpired Off
  CacheLastModifiedFactor 0.5

  # Ignore upstream cache-control so short TTLs above take effect.
  CacheIgnoreCacheControl On
  CacheIgnoreHeaders Set-Cookie Cookie

  # Avoid stampedes / stale serving during revalidation.
  CacheLock On
  CacheLockMaxAge 5

  # Never cache the admin area.
  CacheDisable /admin

  # GZIP compression on cached output.
  SetOutputFilter CACHE
  AddOutputFilterByType DEFLATE text/html text/plain text/css \
                        application/javascript \
                        application/rss+xml \
                        text/xml image/svg+xml

  # Disk cache backend.
  <IfModule mod_cache_disk.c>
    # Adjust CacheRoot to a writable path on your server.
    CacheRoot /var/cache/httpd/proxy/
    CacheEnable disk /
    CacheDirLevels 2
    CacheDirLength 1
    CacheMaxFileSize 20000000
  </IfModule>
</IfModule>

Adjust CacheRoot to point to the directory where you want cached data stored, and make sure that directory is writable by the Apache user (chown -R apache:apache /var/cache/httpd/proxy/ or the equivalent for your distro).

3. Save and restart Apache

sudo systemctl restart apache2
# or, on RHEL/CentOS-based systems:
sudo systemctl restart httpd

Things to watch for on a real Drupal deployment

  • Authenticated sessions: CacheIgnoreHeaders Set-Cookie Cookie means Apache will happily cache a response even when a session cookie is present. Pair this with CacheDisable on any authenticated paths (/user, /admin, /node/*/edit, etc.) or you risk serving one user’s personalized page to another.
  • Cache purging: this config has no active purge/ban mechanism — it’s TTL-based only. If you need instant invalidation on content edits, this microcache approach isn’t a substitute for something like Varnish with BAN support; it’s meant as a lightweight buffer for anonymous traffic spikes.
  • Disk I/O: mod_cache_disk writes to local disk, so on multi-node/ECS-style deployments each container gets its own cache — there’s no shared cache state across tasks unless CacheRoot points at a shared volume (and even then, disk cache isn’t designed for concurrent multi-writer access).

That’s it — you’ve configured an Apache Microcache in front of Drupal.

Comments