Caching Dynamic Content Using Nginx

Caching Dynamic Content Using Nginx

September 21, 2009

If you need a static version of your dynamic web application maybe you may interested to configure Nginx as reverse proxy cache so it can cache also dynamic contents (pages with ? in the URI).

Well, if this is your scenario, let’s go to configure Nginx.

Requirements

  • Nginx up, running and listening on port 80
  • A web server, like Apache, listening on port 8080
server {
  listen     80;
  server_name  www.example.com;
  
  access_log  /var/log/nginx/host.access.log  main;
  set $prefix  prefix_;
  
  # proxy module defaults
  proxy_store_access   user:rw  group:rw  all:r;
  proxy_set_header  X-Real-IP  $remote_addr;
  proxy_set_header  Host     $host;
  
  # Main location
  location / {
  
    root /tmp/nginx/;
    index index.html index.htm index.php index.php.html index.php.html;
    
    # Use this if you don't cache a context (dont_cache_path) , send all requests through the proxy
    location ~ ^/dont_cache_path {
      proxy_pass http://localhost:8080;
    }
    
    # if the request uri was a directory, store the index page name
    if ($request_uri ~ /$) {
      set $store_extra ${request_uri}index;
    }
    
    # set the location the proxy will store the data to. Add the index page
    # name if the uri was a directory (nginx can't normally store these)
    proxy_store /tmp/nginx/${prefix}${query_string}${store_extra}.html;
    
    # go through the proxy if there is no cache
    if (!-f /tmp/nginx/${prefix}${query_string}${store_extra}.html) {
      proxy_pass http://localhost:8080;
    }
    
    # workaround. headers module doesn't take into account proxy response
    # headers. It overwrites the proxy Cache-Control header, causing
    # private/no-cache/no-store to be wiped, so only set if not using proxy
    if (-f /tmp/nginx/${request_uri}${store_extra}.html) {
      expires 0;
    }
    
    # handle static files directly. Set their expiry time to max, so they'll
    # always use the browser cache after first request
    location ~* (css|js|png|jpe?g|gif|ico|swf)$ {
      root /var/www/html/;
      expires max;
    }
    error_page 404 = /${prefix}${query_string}${store_extra}.html;
  }
}

Restart Nginx and enjoy with your static web site

Reference Links: