Nginx Caching for WordPress
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