Run a test using webpagetest:
http://www.webpagetest.org/
Found this link on different options to pngcrush:
http://www.webupd8.org/2009/11/compress-png-files-with-pngcrush.html
The best option turns out to be one of the comments. I got about 50% reduction in file sizes, which took 2/3 of the page load time off:
First, make a backup of the wp-content/uploads directory. Then in uploads do this:
for file in `find . -name "*.png"`;do \ echo $file; \ pngcrush -rem allb -brute "$file" tmp_img_file.png; \ mv -f tmp_img_file.png $file; \ done;
To add caching to Apache:
sudo a2endmod disk_cache mkdir cache chmod u+w cache chown apache-user:apacheuser cache
Add the settings from here to apache2.conf:
http://www.philchen.com/2009/02/09/some-tuning-tips-for-apache-mod_cache-mod_disk_cache
<pre>
CacheRoot /somewhere/cache
CacheDefaultExpire 3600
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1
CacheMaxFileSize 1000000
CacheMinFileSize 1
CacheLastModifiedFactor 0.1
CacheMaxExpire 86400
CacheStoreNoStore On
CacheStorePrivate On
</pre>
Note he has some settings duplicated. I also feel that the default cache timeouts may be low for a blog – an hour versus a day or week. I removed some of his settings, as they ignored URL parameters which identified specific posts, leaving all posts to render the same way.
Overall this has a similar effect to installing Varnish as a cache – this is simple on VPS though, and took no effort to set up. My past efforts to set up nginx/WP-Super-Cache etc have all ended in frustration. The last step of Apache caching has remove about another 30-40% off the page load time.
To make WordPress work, “RewriteRule . index.php [L]” into “RewriteRule ^(.*)$ index.php/$1 [L]“. This ensures URL parameters are passed through, without which a lot of things cache as the same thing, when they shouldn’t.
You should also add this to the Apache configuration – this prevents sending gzipped content to clients that don’t support it.
Header append Vary: Accept-Encoding
Here’s the final result: