There's a ceiling to what WordPress plugins can do for performance. WP Rocket, caching plugins, image optimization — they all help. But if the server underneath is slow, you're optimizing the top floors of a building with a weak foundation.
This guide focuses on the hosting layer: the server-side configuration that determines how fast your WordPress site can actually run before any plugin touches it.
Why plugin optimization isn't enough
Imagine your server has a TTFB (Time to First Byte) of 1.2 seconds. That's the time before the browser even starts rendering anything. No caching plugin fixes a 1.2s TTFB if the cause is PHP workers queuing, a slow database, or an undersized plan.
The hosting layer sets the floor. Every optimization above it is constrained by it.
Check your current TTFB:
bashcurl -o /dev/null -s -w "TTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://yourdomain.com
If TTFB is consistently above 600ms for a page that should be cached, the problem is server-side.
1) Get PHP-FPM pool sizing right
PHP-FPM manages the PHP worker processes that handle requests. Too few workers and requests queue — visitors wait. Too many and you run out of RAM, which causes swapping, which makes everything slower.
Check your current config:
bashsudo nano /etc/php/8.2/fpm/pool.d/www.conf
Key settings:
inipm = dynamic pm.max_children = 20 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 10 pm.max_requests = 500
Sizing rule of thumb: Each PHP-FPM worker uses roughly 50–80MB RAM for a typical WordPress site. On a 4GB VPS with 2GB reserved for OS + MySQL, you have ~2GB for PHP workers — roughly 25–40 workers max.
Don't set pm.max_children higher than your RAM supports. Monitor with:
bashsudo systemctl status php8.2-fpm ps aux | grep php-fpm | wc -l
2) Enable and verify OPcache
OPcache stores compiled PHP code in memory so WordPress doesn't recompile the same files on every request. It's one of the highest-impact single changes for WordPress performance — and it's free.
Check if it's enabled:
bashphp -i | grep opcache.enable
If not enabled, add to /etc/php/8.2/fpm/php.ini:
iniopcache.enable=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=16 opcache.max_accelerated_files=10000 opcache.revalidate_freq=60 opcache.save_comments=1
Restart PHP-FPM:
bashsudo systemctl restart php8.2-fpm
For a WordPress site with hundreds of files, OPcache typically reduces PHP execution time by 30–50%.
3) Add Redis for object caching
WordPress by default runs a new database query every time it needs cached data — even for things like site options and menu items that rarely change. Redis stores these in memory and serves them without hitting the database.
Install Redis:
bashsudo apt install redis-server php8.2-redis -y sudo systemctl enable --now redis-server
Install the Redis Object Cache plugin in WordPress, or add to wp-config.php:
phpdefine('WP_CACHE_KEY_SALT', 'your-unique-salt'); define('WP_REDIS_HOST', '127.0.0.1'); define('WP_REDIS_PORT', 6379);
Activate the Redis Object Cache plugin and verify connection. A working Redis cache typically reduces database queries per page by 40–70% on active WordPress sites.
4) Full-page cache architecture
For anonymous (logged-out) visitors — which is most of your traffic — full-page caching serves static HTML without touching PHP or MySQL at all. This is the biggest performance win available at the application layer.
Best options:
- Nginx FastCGI cache — server-level, fastest option, serves cached pages before PHP runs
- WP Rocket — plugin-level, easier to configure, good for most setups
- LiteSpeed Cache — best if your host runs LiteSpeed server
Nginx FastCGI cache example (in your Nginx server block):
nginxfastcgi_cache_path /tmp/nginx-cache levels=1:2 keys_zone=WORDPRESS:100m inactive=60m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; server { # ... your other config ... location ~ \.php$ { fastcgi_cache WORDPRESS; fastcgi_cache_valid 200 60m; fastcgi_cache_bypass $skip_cache; fastcgi_no_cache $skip_cache; # ... rest of PHP config ... } }
Add cache bypass logic for logged-in users and WooCommerce cart/checkout pages:
nginxset $skip_cache 0; if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap") { set $skip_cache 1; } if ($cookie_woocommerce_items_in_cart) { set $skip_cache 1; }
5) MySQL/MariaDB tuning
Default MySQL configuration is conservative — it assumes minimal RAM. On a VPS with dedicated resources, tuning the buffer sizes significantly improves query performance.
Check current buffer pool size:
bashmysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
Edit /etc/mysql/mysql.conf.d/mysqld.cnf:
iniinnodb_buffer_pool_size = 512M # ~50-70% of RAM dedicated to MySQL innodb_log_file_size = 128M query_cache_type = 0 # Disable query cache (deprecated, causes contention) max_connections = 100
Restart MySQL:
bashsudo systemctl restart mysql
For a 4GB VPS running only WordPress, innodb_buffer_pool_size = 1G is reasonable if MySQL is the primary service.
6) Database hygiene — monthly routine
WordPress databases accumulate junk. Post revisions, spam comments, expired transients, orphaned postmeta rows. On an active site, these degrade query performance over time.
bash# Connect to MySQL mysql -u root -p # Check database size SELECT table_name, round(((data_length + index_length) / 1024 / 1024), 2) AS size_MB FROM information_schema.tables WHERE table_schema = 'your_database_name' ORDER BY size_MB DESC;
Monthly cleanup via WP-CLI:
bashwp transient delete --expired wp post delete $(wp post list --post_type=revision --format=ids) wp db optimize
Or use WP-Optimize plugin with scheduled automated cleanup.
Also limit future revisions in wp-config.php:
phpdefine('WP_POST_REVISIONS', 5); define('EMPTY_TRASH_DAYS', 7);
7) Nginx static file serving and compression
Make sure Nginx — not PHP — serves your static files, and that gzip compression is active:
nginx# Gzip compression gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml; gzip_min_length 1000; gzip_comp_level 6; # Static file caching headers location ~* \.(jpg|jpeg|png|gif|webp|svg|css|js|woff2|woff|ttf|ico)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; }
This tells browsers to cache static files for a year and avoids PHP processing any request for an image or stylesheet.
8) Validate with curl before and after each change
Don't guess whether your changes helped. Measure:
bash# Before change: curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s | Total: %{time_total}s\n" https://yourdomain.com # Make your change # After change: curl -o /dev/null -s -w "TTFB: %{time_starttransfer}s | Total: %{time_total}s\n" https://yourdomain.com
Run this 3–5 times and average. Single measurements vary. Trends are what matter.
Also check PageSpeed Insights before and after hosting-layer changes — you'll see TTFB in the "Server response time" metric.
9) Proactive scaling before traffic peaks
The worst time to discover your server is undersized is during a campaign launch. Reactive scaling — upgrading after the site is already slow and users are bouncing — costs you both sales and SEO signals.
Watch these weekly:
bashfree -h # RAM usage trend top -bn1 | head -n 20 # CPU usage df -h # Disk usage sudo tail -100 /var/log/nginx/error.log # Error patterns
If RAM is consistently above 80% or you're seeing PHP-FPM "max children reached" in error logs, it's time to upgrade before traffic forces the decision.
The performance stack that works
A well-tuned WordPress hosting stack in priority order:
- NVMe SSD + PHP 8.2+ — baseline requirements
- OPcache — compiled PHP in memory
- Full-page cache — Nginx FastCGI or WP Rocket
- Redis object cache — database query reduction
- MySQL buffer tuning — query performance
- Gzip + browser cache headers — delivery optimization
- CDN — geographic distribution
Get the first four right and you'll see your TTFB drop dramatically. The rest are incremental improvements on a solid foundation.
HostAccent VPS plans run PHP 8.3, NVMe storage, and Redis ready to enable — the infrastructure side of WordPress performance, done properly from the start.










Discussion
Have a question or tip about this topic? Share it below — your comment will appear after review.