
The workflow that works for one website falls apart at ten and breaks completely at fifty, because every step you skipped when manually managing a single site — writing down the PHP version, remembering when backups last ran, keeping track of which SSH key belongs to which client — turns into a liability the moment you can't hold it all in your head anymore.
At one site, a single 1-2 vCPU, 2-4GB RAM VPS with a manually configured Nginx vhost and a cron job for backups is perfectly reasonable. There's no reason to over-engineer infrastructure for a workload you can fully audit by eye. The problem isn't that this setup is wrong — it's that nothing about it was built to repeat. Every additional site means another manual vhost, another PHP-FPM pool copied and half-remembered, another backup script that may or may not still be running. By the time you're at ten sites, you're not managing servers anymore — you're doing archaeology on your own past decisions.
Somewhere between 10 and 15 sites on a single small VPS, you hit a wall that has nothing to do with traffic and everything to do with concurrency. A 2-4GB box can comfortably serve a handful of low-traffic WordPress sites because most of the time, most of those sites are idle. Once you're running a dozen or more, the odds that several sites get hit at the same moment stop being negligible — and PHP-FPM, MySQL, and the OS itself all start competing for the same limited RAM at once.
The symptoms are predictable: pages that used to load instantly start queuing, `top` shows swap being used even though nothing looks obviously broken, and one client's traffic spike degrades every other site sharing the box. This is the point where the fix isn't a bigger VPS — it's splitting sites across multiple servers grouped by resource profile, so a traffic spike on one client's storefront doesn't take down four unrelated brochure sites that happen to share a box with it.
The default `pm.max_children` value in most PHP-FPM pool configs is set for a single application, not a dozen unrelated sites sharing a box. Left untouched per-site, it either starves sites of workers under load or lets too many children spawn and exhausts RAM. The number should be calculated, not copy-pasted: divide the RAM you're willing to give PHP-FPM by the average memory footprint of one PHP-FPM child process, which you can check directly.
At 10 sites on one box, this arithmetic is manageable by hand. At 50 sites spread across several servers, doing it manually per pool, per server, every time traffic patterns shift, isn't a workflow anymore — it's a part-time job. This is exactly where CloudStick's EasyPHP handles pool sizing per site automatically based on the server's available RAM, so the tuning step above happens without you opening a config file for every one of fifty sites.
MySQL or MariaDB becomes the bottleneck before CPU does, almost every time, because dozens of WordPress or WooCommerce sites hammering the same `mysqld` instance with unindexed queries and autoloaded options tables will exhaust `innodb_buffer_pool_size` long before the app server itself is under real pressure. The tell is `SHOW PROCESSLIST` filling up with queries stuck in "Waiting for table metadata lock" or a `mysqltuner.pl` report flagging a buffer pool hit ratio well below 99%.
Once you're past 20-30 active sites, separating the database onto its own server — sized for RAM and IOPS rather than PHP execution — stops being optional. The move itself is mechanical: `mysqldump` each database, restore it on the new DB server, open port 3306 to the app server's private IP only (never the public internet), then update each site's `DB_HOST` in `wp-config.php` from `localhost` to the new database server's internal address. Do this one site at a time and verify before moving to the next; a database migration that takes down a client's storefront for an afternoon costs you more trust than the performance gain is worth.
A single cron line running `mysqldump` nightly and dumping the file into the same server it's backing up isn't a backup strategy — it's a false sense of security that fails the first time that server's disk fails. At one or two sites, the risk of that failure lining up with the moment you actually need the backup is low enough to live with. At fifty sites, across enough servers and enough clients, it isn't a matter of if one of those single-copy backups is the only copy you had when a drive dies — it's a matter of when.
Use the 3-2-1 rule as your retention baseline once you're past a handful of sites: 3 copies of every backup, on 2 different storage types, with 1 stored off-server entirely — then layer a rotation on top, keeping the last 7 daily backups, 4 weekly, and 3 monthly, and pruning anything older. Write the pruning into the same cron job that creates the backup, not a separate step you'll forget.
CloudStick's scheduled backups push to off-server storage with a configurable retention window per site out of the box, so this policy is something you set once per site rather than something you rebuild in a shell script every time you onboard a new client.
None of the growing pains above are inevitable — they're what happens when infrastructure decisions made for one site are never revisited as the count climbs. The fix at every stage is the same: stop treating each new site as a one-off and start treating your fleet as a fleet, with consistent PHP-FPM pools, a database tier sized independently of the app tier, and a backup policy that runs the same way whether it's site three or site thirty.
It's also worth noting that growing from 1 site to 50 doesn't have to mean growing your tooling costs 50x. Going from one shared-hosting account to fifty sites under cPanel-style licensing means paying per domain or per account, so the bill scales in lockstep with every new client you onboard. CloudStick's pricing is per-server, not per-site — websites are unlimited on paid plans, so adding your fortieth site to a server you're already running doesn't add a line item to your invoice. The cost scales with how many servers you're operating, not how many sites are on them, which flips the usual per-domain math on its head as you grow.
Once you're managing enough servers to justify it, that same unlimited-connection model on the PRO and BUSINESS plans means one dashboard shows every server in the fleet instead of forty SSH sessions in forty terminal tabs — and if you've reached the scale where you're reselling hosting to your own clients, BUSINESS plan White-Label lets you put your own brand on that dashboard rather than CloudStick's. Start by fixing the PHP-FPM pools and the backup policy this week; the database split and multi-server layout can follow once you can actually see where the bottleneck is instead of guessing.

