WordPress Multisite VPS Requirements: PHP-FPM, Nginx & Resource Sizing

A comprehensive sizing guide for running multi-domain and subdirectory WordPress networks on Linux KVM VPS instances with Nginx and PHP-FPM.

Running a production WordPress Multisite network requires sizing compute, memory, and PHP worker capacity well beyond standard single-site installations. Because a Multisite network consolidates dozens or hundreds of sub-sites under a shared codebase and database, traffic spikes on one sub-site or heavy background cron tasks directly compete for server resources. Deploying Multisite on a dedicated KVM VPS with Nginx, tuned PHP-FPM process pools, and persistent Redis caching provides the necessary resource isolation and predictable performance.

The Architectural Demands of WordPress Multisite

Unlike standalone WordPress instances where each site functions in isolation, a Multisite network introduces complex shared dependencies across the underlying operating system:

  • Unified Database Schema: All sub-sites share core global tables, including wp_users and wp_usermeta. When individual sub-sites create custom tables (such as wp_2_posts, wp_2_options, wp_3_posts), the total table count in MySQL escalates quickly. Complex network-wide queries, search operations, and unindexed meta lookups place high pressure on InnoDB memory structures.
  • Shared PHP Execution Pool: Incoming web requests across all sub-domains or sub-directories route to the exact same web server and PHP execution pool. An unoptimized plugin or an unindexed query on one sub-site can saturate available PHP-FPM worker processes, leaving every other site across the entire network completely unresponsive.
  • Network-Wide Plugin Execution: Plugins activated at the network level execute during every single request lifecycle across all sub-sites, increasing baseline memory consumption per request and requiring disciplined code profiling.

PHP Memory Limits and Sizing Guidelines

While default single-site WordPress configurations frequently operate on 64 MB or 128 MB of memory, a production Multisite network requires an absolute minimum baseline of 256 MB per PHP process. Networks running ecommerce plugins like WooCommerce, multi-lingual translators, or complex page builders require 512 MB to prevent memory exhaustion fatal errors.

Define explicit memory allocations in wp-config.php directly above the stop editing directive:

# Baseline memory ceiling for regular visitor requests
define('WP_MEMORY_LIMIT', '256M');

# Elevated memory ceiling for administrative actions, exports and cron jobs
define('WP_MAX_MEMORY_LIMIT', '512M');

In your main PHP configuration file (/etc/php/8.2/fpm/php.ini), ensure that memory_limit = 512M matches or exceeds the administrative ceiling, and configure max_execution_time = 60 to terminate runaway scripts before they consume excessive CPU cycles.

Tuning PHP-FPM Process Pools for High Concurrency

The PHP-FPM process manager dictates how many concurrent requests your server can process simultaneously without dropping client connections. In high-traffic Multisite environments, dynamic process management maintains warm workers while recycling processes to prevent memory fragmentation.

Configure the primary worker pool in /etc/php/8.2/fpm/pool.d/www.conf:

[www]
pm = dynamic
pm.max_children = 40
pm.start_servers = 10
pm.min_spare_servers = 8
pm.max_spare_servers = 16
pm.max_requests = 1000
request_terminate_timeout = 60s

Calculate your optimal pm.max_children setting using this practical sysadmin formula:

pm.max_children = (Total Available Server RAM - RAM Reserved for OS & Database) / Average PHP Process Memory (~60 MB)

For example, on a dedicated 8 GB RAM VPS where the Linux operating system, Nginx, and MySQL consume approximately 3 GB of memory, approximately 5 GB (5,120 MB) remains available for PHP-FPM. Dividing 5,120 MB by an average worker size of 60 MB yields approximately 85 maximum children. Setting pm.max_requests = 1000 forces worker processes to restart after serving 1,000 requests, preventing slow memory bloat caused by leaky third-party plugins.

Deploying Redis Object Caching for Multisite

In a standard WordPress installation, database queries are executed repeatedly for common site options. In a Multisite network, this overhead multiplies across every sub-site. Without an in-memory object cache, every page load triggers dozens of redundant SQL queries against the wp_options table for site settings, rewrite rules, and active plugin lists.

Deploying a local Redis server provides shared in-memory caching that drastically slashes database read load. Configure Redis in /etc/redis/redis.conf with a defined memory ceiling and LRU eviction policy:

maxmemory 512mb
maxmemory-policy allkeys-lru

Install the Redis Object Cache plugin in WordPress and define a unique cache key salt in wp-config.php using define('WP_CACHE_KEY_SALT', 'multisite_network_'); to prevent cache collisions between sub-sites.

Nginx Server Block Configuration for Multisite

Because Nginx does not parse Apache .htaccess files, all rewrite logic must be explicitly configured within the server block. For sub-directory networks, configure location directives in /etc/nginx/sites-available/multisite.conf:

server {
    listen 80;
    listen [::]:80;
    server_name example.com *.example.com;
    root /var/www/html;
    index index.php index.html;

    # Restrict direct execution of uploaded PHP scripts
    location ~ ^/files/(.*)$ {
        try_files /wp-content/blogs.dir/$blogid/files/$1 /wp-includes/ms-files.php?file=$1;
        access_log off; log_not_found off; expires max;
    }

    # WordPress Multisite subdirectory rewrite rules
    if (!-e $request_filename) {
        rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
        rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Test your Nginx configuration syntax with sudo nginx -t before reloading the web server using sudo systemctl reload nginx.

Hardware Sizing Matrix for WordPress Multisite

Review this planning matrix when sizing virtual server specifications for different network scales:

Network Scale Active Sub-Sites Recommended vCPU Recommended RAM Storage Architecture
Starter Network 2 to 10 brochure sites 2 vCPUs 4 GB RAM RAID NVMe
Agency Network 10 to 30 business sites 4 vCPUs 8 GB RAM RAID NVMe
Enterprise Network 30 to 100+ dynamic sites 8+ vCPUs (AMD 9950X) 16 GB to 32 GB RAM High-speed NVMe

StreamData High-Performance KVM VPS Sizing

WordPress Multisite networks require strong single-thread CPU execution and high-speed NVMe storage to process dynamic PHP requests and write-heavy database logs rapidly. StreamData provides KVM VPS hosting across 10 flexible plan tiers ranging from 1 GB to 128 GB RAM equipped with RAID NVMe storage starting from Rs 149 per month. For high-traffic networks, StreamData AMD Ryzen 9 9950X VPS instances deliver Zen 5 architecture (boost clock up to 5.7 GHz) with DDR5 memory, deployed across physical nodes in Mumbai, Noida, and Jaipur.

Explore virtual server plans on StreamData KVM VPS, review bare-metal servers on StreamData Dedicated Servers, or view company infrastructure details on StreamData Company.


Sources