Caching Dynamic Content Using Nginx

September 2009 ยท 2 minute read

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

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:

comments powered by Disqus