Nginx Cache WordPress

There are tons of caching options for WordPress. Some of the popular plugins are Batcache, WP Super Cache, and W3 Total Cache. There are also services like Cloudflare and Fastly. On VIP Go, we use Varnish instances distributed across the world and route traffic to the nearest server over our Anycast network.

I’ve used almost everything on my blog over the years, but this time I wanted to keep it simple. Since I already use Nginx for SSL termination and proxying to a Docker container, I decided it would be easiest to cache the HTML there.

https://gist.github.com/joshbetz/63f08fc2f37e5e267d14f219d0f5b4ed

The configuration is pretty basic:

  • 404s are cached for 30 seconds
  • 301s (permanent redirects) are cached for 24 hours
  • Everything else is cached for 5 minutes

Pages are only cached if they’ve been accessed 3 times to avoid filling the cache unnecessarily. If you’re logged in or have a cookie that looks like it could be valid, you bypass the cache completely to avoid caching logged in data. One of my favorite parts is that I can serve stale content if there’s a server error. So if I break the Docker container, ideally people won’t notice 🙂

Ultimately this is easier to maintain than any of the other things I’ve tried and just as effective.

The full configuration is on Github.

Biased Algorithms

Biased algorithms and their effects are something I’ve been interested in exploring recently. It’s not a problem with Mathematics or Computer Science per se — humans with implicit bias come to false conclusions all the time. We’re the source of these problematic algorithms after all. The problem is that these bad assumptions can be deployed on a massive scale and aren’t questioned because we think of the math as infallible.

A recent episode of 99% Invisible, The Age of the Algorithm, discusses this topic and gives some examples of where it is having real, negative effects today.

Most recidivism algorithms look at a few types of data — including a person’s record of arrests and convictions and their responses to a questionnaire — then they generate a score. But the questions, about things like whether one grew up in a high-crime neighborhood or have a family member in prison, are in many cases “basically proxies for race and class,” explains O’Neil.

Essentially, any time you use historical data that was effected by a bias to influence the future, you risk perpetuating that bias.

If you’re interested, Cathy O’Neil also wrote a book called Weapons of Math Destruction: How Big Data Increases Inequality and Threatens Democracy.

 

Restless Dream

One of my New Years resolutions was to play more music. I decided it might also be fun to share some of it. I actually learned this song a couple years ago, but it’s one of my favorites. Naturally, a Jack’s Mannequin song — Restless Dream.

New Hyper Key

For quite a while now, I’ve had Caps Lock mapped to Escape. At first it was just out of convenience — as a vim user, I use Escape much more than Caps Lock. With the new MacBook Pro keyboards it’s somewhat of a necessity.

I had a great, but complex, setup that I copied from Brett Terpstra where Caps Lock was Escape if you pressed it by itself, but Control + Option + Command + Shift if you held it down with another key. This worked great for global hotkeys, especially when combined with an app like Snap, because that complex combination of keys is uncommon anywhere else. When Sierra was introduced, the super glue and duct tape fell apart, and the global hotkeys stopped working.

It looks like this was recently fixed with Karabiner Elements though; and it’s much easier now. There are some pre-made rules on the author’s website. I copied the caps lock recipe to GitHub for posterity. After installing Karabiner Elements from Github, you can automatically install the caps lock rules with a specially crafted link:

karabiner://karabiner/assets/complex_modifications/import?url=https://gist.githubusercontent.com/joshbetz/ef03e49e5d45ce34c8e23945260b122c/raw/54b65daa0377083b62a1c8219315457f087f18d8/caps_lock.json

https://gist.github.com/joshbetz/ef03e49e5d45ce34c8e23945260b122c

Go Configure

I’ve been dabbling in Golang on and off for a little while now. Recently I was looking for a package to read and parse configuration files with the following requirements in mind:

  1. Be fast.
  2. Use environment variables and JSON files (in that order).
  3. Support hot reloading.

I looked at some of the popular configuration packages, but didn’t see anything that I loved. Many of them don’t meet the requirements I had in mind or are more complex than I’d like.

So, I decided to write config — I know, it’s a great name. It’s pretty simple. We cache values in memory to minimize disk IO. On SIGHUP (or any time you call config.Reload()), we clear the cache, so you can update the configuration without restarting your app.

Usage looks something like this:

func main() {
	c := config.New("config.json")

	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		var value string
		c.Get("value", &value)
		fmt.Fprintf(w, "Value: %s", value)
	})

	http.ListenAndServe(":3000", nil)
}

There are more examples and details on the API in the README on Github.

If you have questions or ideas, issues and pull requests are welcome on Github. Let me know if you use it!