I was searching for a way to enable caching for WordPress and I stumbled across this great article.
http://blogs.law.harvard.edu/djcp/2010/01/nginx-as-a-front-end-proxy-cache-for-wordpress/
In the example that was given, there was an Apache server working the backend while an nginx server was working as a front-end cache. Those are too many services for me, so I wanted to use just one system. Nginx. Here is how I did it (much of this information was taken verbatim from the link above).
First, install the WordPress Nginx proxy cache integrator into WordPress. You can download it from here:
http://wordpress.org/plugins/nginx-proxy-cache-integrator/
Activate it after it is downloaded.
Then create this file:
/etc/nginx/conf.d/proxy-common.conf
proxy_cache_path /var/lib/nginx/cache0 levels=1:2 keys_zone=staticfilecache:180m max_size=250m; proxy_temp_path /var/lib/nginx/proxy; proxy_connect_timeout 30; proxy_read_timeout 120; proxy_send_timeout 120; upstream wordpressapache { #The upstream apache server. You can have many of these and weight them accordingly, #allowing nginx to function as a caching load balancer (oh my. Awesomeness abounds.) server 127.0.0.1:81 weight=1 max_fails=3 fail_timeout=30s; }
First, copy /etc/nginx/sites-enabled/default to /etc/nginx/sites-enabled/default.proxy
cp /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.proxy
Then, I changed this line in /etc/nginx/sites-enabled/default from
server { listen *:80; ## listen for ipv4
to this
server { listen *:81; ## listen for ipv4
This basically tells nginx to listen on port 81 instead of 80, which we will find out why soon enough.
Now, edit /etc/nginx/sites-enabled/default.proxy and add the following under the server section.
# Set the hostname proxy_set_header Host $host; #Set the forwarded-for header. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; location / { index index.php index.htm tracker.php; # If logged in, don't cache. if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) { set $do_not_cache 1; } proxy_cache_key "$scheme://$host$request_uri $do_not_cache"; proxy_cache staticfilecache; proxy_pass http://wordpressapache; } location ~* wp\-.*\.php|wp\-admin { # Don't static file cache admin-looking things. proxy_pass http://wordpressapache; } location ~* \.(jpg|png|gif|jpeg|css|js|mp3|wav|swf|mov|doc|pdf|xls|ppt|docx|pptx|xlsx)$ { # Cache static-looking files for 120 minutes, setting a 10 day expiry time in the HTTP header, # whether logged in or not (may be too heavy-handed). proxy_cache_valid 200 120m; expires 864000; proxy_pass http://wordpressapache; proxy_cache staticfilecache; } location ~* \/[^\/]+\/(feed|\.xml)\/? { # Cache RSS looking feeds for 45 minutes unless logged in. if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) { set $do_not_cache 1; } proxy_cache_key "$scheme://$host$request_uri $do_not_cache"; proxy_cache_valid 200 45m; proxy_cache staticfilecache; proxy_pass http://wordpressapache; } location = /50x.html { root /var/www/nginx-default; } location ~ /\.ht { deny all; }
Now run the following to get your site back online.
service nginx reload