Helloo~ another rare post from me!
Recently shifted my websites from my old dedicated server to this VPS server – a move which I’ve been too lazy to do for like 2 years.
The dedicated server was rather overkill for the website I’m running (originally had other plans, but didn’t follow them through) so have been paying too much for hosting for quite a while.
This new VPS is a Xen 1GB RAM, 30GB HDD, 1.5TB/mo from ChicagoVPS, using the awesome deal here. Asked support to increase space to 50GB which they did for only $1.75/mo extra (awesomesauce). They also agreed to supply a further yearly prepayment discount if I switch to an annual billing cycle, which I plan to do soon. Been happy with speeds and I/O performance; CPU is a Xeon X3450 (Xeon equivalent of i7 920) so pretty cool too.
Now the fun part: setting the thing up. Previously using CentOS 5 64-bit, but after using Debian, I somewhat like the setup better, so decided on Debian 6 32-bit for this server. Server stack software:
Running an nginx frontend proxying to an Apache backend, with PHP module. Historically had issues with CGI/FastCGI, which is why I decided to go with the more familiar Apache PHP module, although the last time I tried FastCGI was years ago. But nginx was great and allows me to run a minimalist Apache which works well for me. Also I get the advantage of accelerated proxy responses in XThreads, although I’ve removed all the big downloads I used to have to fit in the 50GB disk space.
Unfortunately, different from my other installs of Apache with PHP module, it seems that Apache was leaking memory on this setup. Went tweaking a few PHP configuration variables and seems to have magically gone away, me not knowing why. Nevertheless, I decided on using a higher *SpareChildren configuration and a very low MaxRequestsPerChild to get around any possible memory leaks. Apache itself only has 3 modules active (some configuration needed to be modified to accomodate this minimalist setup): mod_dir, mod_rewrite and mod_php5
Also have gotten nginx to send HTTP Expires headers, so pages will also load faster (since Firefox won’t be sending check requests waiting for HTTP 304 responses for static files). But otherwise, configuring two servers is a bit more of an issue, especially with rewrite rules, but manageable.
Have decided to go with MariaDB instead of MySQL here. As with MySQL, the MariaDB defaults are a bit overkill for a 1GB server, so my.cnf needs tweaking. Unfortunately though, there are many MySQL tweaking articles out there, but I didn’t find any for MariaDB – although MySQL largely translates over, there are parts which don’t. So configuration took a bit more time and effort to get right.
Whilst disabling InnoDB and tweaking buffers is probably enough for a standard MySQL setup which only runs MyISAM tables, MariaDB includes, and activates by default, a number of other plugins which probably need to be disabled (such as PBXT). Aria being the new internally used storage engine cannot be disabled, and you need to remember to tweak down the default buffer size in addition to the MyISAM buffers.
Speaking of Aria, I decided to switch all my tables to Aria format as it’s essentially an improved version of MyISAM anyway. Everything seems smooth sailing so far.
As for database backups, I’ve decided to move away from the mysqldump command I’ve been using for so long. Although I’d disabled table locking when dumping, so that the website didn’t lock up for 15 minutes during the dump, I’m not sure how appropriate that really is, not to mention that it seems like a lot of unnecessary load. Considering alternatives, there seems to be only two: mysqlhotcopy or a replicated slave which I can run mysqldump on. Latter requires more configuration so am considering the former. However, mysqlhotcopy seems to lock all tables being dumped, which means the site locks up for about a 30 seconds whilst the database gets copied. I’m not really worried about the downtime, but the fact that requests queue up on the server and quickly chews through RAM is something I do have to take into consideration. As the mybb_posts table will obviously be the one taking the longest, and locking the table will only really affect new posts, it seems better to lock individual tables and copy, which will probably mean I’ll have to write my own script (or call mysqlhotcopy a few times). There’s a slight possibility for data desynchronisation between tables, without referential integrity, but I’d presume this is somewhat rare. Besides, if this really is an issue, it’s possible to group commonly used tables together.
Well the webserver/PHP and database server are the most exciting to configure since they’re the heart of website-server (trying not to say “webserver” again). Went with postfix instead of sendmail, and the email configuration wasn’t as scary as I thought it would be. Nothing else particularly worth mentioning otherwise…
Moving the server
Had originally planned to stagger the move. Firstly moved zingaburga.com over, so I could identify any issues (such as the Apache memory leak). After that, moving everything else over went pretty quickly, even the EP database (well, I did move all the attachments over before closing down the forums; included with setting the domain’s TTL to 60 seconds, there wasn’t that much downtime).
Unfortunately, the EP tables were defaulting to latin1 encoding. This seems to have caused an issue as UTF-8 data was stored in them, and the default encoding for this new server is UTF-8. Which meant hours of downtime, me staying up into the wee hours of the night repairing the encoding. And then after I did that, I forgot to switch the users table back to textual formats (from binary fields) so no-one could actually log in. Other bugs which I didn’t have before needed some nginx proxy tweaking but otherwise, everything seems to be well.
Overall, server seems to never be going over 500MB RAM usage for normal situations, so glad I got 1GB for plenty of headroom. Am also surprised at this relatively low memory usage, despite me being rather generous to buffer sizes, but I guess tweaking pays off.