Caching dynamic contents using Nginx as reverse proxy cache server

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 80 port
- A web server, like Apache, listening on 8080 port

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:
- Nginx wiki
- how to use nginx to create static files from dynamic content
- Page-level caching with Nginx

Tags: , , , ,

  1. W-Mark Kubacki’s avatar

    Thanks for sharing! Indeed, caching pages with query parameters is especially good if you have an old PHP forum and the requests are solely GET requests.

    BTW, better set $store_extra to ${request_uri}index.html: In case of directories it will save you another rewrite as Nginx will look it up as index file.

    And, you have used the underscore twice in your version. The first time in $prefix and the second on line 26.

  2. Luca Corbo’s avatar

    I’ve updated the post.
    Thanks for your suggestions :-) .

  3. wesnur’s avatar

    Thanks for sharing such an informative read. I have found another read which not only talks about dynamic caching but it also throws light on different topologies available for dynamic caching.. I am sure this article can be very helpful for those who are interested in dynamic caching.