Nginx – Enable Microcaching

Update @ 2013-05-09: I am not very sure if this could really enable the Nginx Microcaching as i couldn’t find the HIT value in the HTTP response. Please feel free to comment and let us know if you got the solution. Thanks. =D

Previous posts:


Enable Microcaching in Nginx could help making your website run much faster. Base on the setting we did in Nginx + PHP-FPM on Ubuntu Precise. Let’s edit the VirtualHost configuration file to enable Microcaching.

1. Edit /etc/nginx/sites-available/default as follow. (Replace <your domain name> before save)

server {
  listen   80; ## listen for ipv4; this line is default and implied
  #listen   [::]:80 default ipv6only=on; ## listen for ipv6

  #root /usr/share/nginx/www;
  root /srv/www;
  index index.php index.html index.htm;

  # Make site accessible from http://localhost/
  #server_name localhost;
  server_name <your domain name>;

  location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to index.html
    try_files $uri $uri/ /index.html;
    # Uncomment to enable naxsi on this location
    # include /etc/nginx/naxsi.rules

  location /doc/ {
    alias /usr/share/doc/;
    autoindex on;
    deny all;

  # Only for nginx-naxsi : process denied requests
  #location /RequestDenied {
    # For example, return an error code
    #return 418;

  #error_page 404 /404.html;

  # redirect server error pages to the static page /50x.html
  #error_page 500 502 503 504 /50x.html;
  #location = /50x.html {
  #  root /usr/share/nginx/www;

  # pass the PHP scripts to FastCGI server listening on
  location ~ \.php$ {
    # Setup var defaults
    set $no_cache "";
    # If non GET/HEAD, don't cache and mark user as uncacheable for 1 second via cookie
    if ($request_method !~ ^(GET|HEAD)$) {
      set $no_cache "1";
    # Drop no cache cookie if need be
    # (for some reason, add_header fails if included in prior if-block)
    if ($no_cache = "1") {
      add_header Set-Cookie "_mcnc=1; Max-Age=2; Path=/";
      add_header X-Microcachable "0";
    # Bypass cache if no-cache cookie is set
    if ($http_cookie ~* "_mcnc") {
      set $no_cache "1";
    # Bypass cache if flag is set
    fastcgi_no_cache $no_cache;
    fastcgi_cache_bypass $no_cache;
    # Settings
    fastcgi_cache microcache;
    fastcgi_cache_key $server_name|$request_uri;
    fastcgi_cache_valid 404 30m;
    fastcgi_cache_valid 200 10s;
    fastcgi_max_temp_file_size 1M;
    fastcgi_cache_use_stale updating;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_pass_header Set-Cookie;
    fastcgi_pass_header Cookie;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param  PATH_INFO          $fastcgi_path_info;
    #fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
    #fastcgi_intercept_errors on;
    include fastcgi_params;

  # deny access to .htaccess files, if Apache's document root
  # concurs with nginx's one
  #location ~ /\.ht {
  #  deny all;


2. Go to /etc/nginx/conf.d and then create the following 2 files.

fastcgi_cache_path /var/cache/nginx2 levels=1:2 keys_zone=microcache:5m max_size=1000m;
map $http_cookie $cache_uid {
  default nil; # hommage to Lisp 🙂
  ~SESS[[:alnum:]]+=(?<session_id>[[:alnum:]]+) $session_id;
map $request_method $no_cache {
  default 1;
  HEAD 0;
  GET 0;


log_format custom '$remote_addr - $remote_user [$time_local]  '
                  '"$request" $status $body_bytes_sent '
                  '"$http_referer" "$http_user_agent" nocache:$no_cache';


3. Restart Nginx.

/etc/init.d/nginx restart


Done =)



6 thoughts on “Nginx – Enable Microcaching”

  1. Useful when you serve static content like a blog just for reading purpose, but if you have an forum or blog with users activity will fail.


    1. Yes, it may cause problem.

      and i wonder how to verify if microcache is running on nginx as i couldn’t found the microcache: hit in the response header…

      Thanks for your comment anyway. =)


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.