Fixed it.
I realised members.js was being sought from /public. A while ago I had created a public folder, and had set up redirects in my nginx.
I commented those out, restarted ghost, and the subscribe feature now works. Hooray!
Solution in nutshell: Make sure there’s no path for /public in the nginx/apache config, as Ghost uses that in some other way.
(Please let me know if I’ve been too glib in that summary)