One of the reasons a VPS is worth the extra work over shared hosting: you can run as many sites as the server’s resources support, at no additional hosting cost per site.
The pattern is the same every time.
Step 1 — Create the Web Root
sudo mkdir -p /var/www/secondsite.com
sudo chown nginx:nginx /var/www/secondsite.com
Step 2 — Create the Database
mysql -u root -p
CREATE DATABASE secondsite_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'secondsite_user'@'localhost' IDENTIFIED BY 'strong-password-here';
GRANT ALL PRIVILEGES ON secondsite_db.* TO 'secondsite_user'@'localhost';
FLUSH PRIVILEGES;
exit;
Step 3 — Create the Nginx Server Block
sudo nano /etc/nginx/conf.d/secondsite.com.conf
Copy the server block from your first site’s config and update three things:
server_name— new domainroot— new web root path- Log file paths — new filenames
server {
listen 80;
listen [::]:80;
server_name secondsite.com www.secondsite.com;
root /var/www/secondsite.com;
index index.php index.html;
access_log /var/log/nginx/secondsite.com.access.log;
error_log /var/log/nginx/secondsite.com.error.log;
set $skip_cache 0;
if ($request_method = POST) { set $skip_cache 1; }
if ($query_string != "") { set $skip_cache 1; }
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-login.php|wp-.*.php|/feed/|sitemap(_index)?.xml)") {
set $skip_cache 1;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_cache WORDPRESS;
fastcgi_cache_valid 200 301 302 1h;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header X-Cache-Status $upstream_cache_status always;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires max;
log_not_found off;
access_log off;
}
location ~ /\. { deny all; }
location ~* wp-config.php { deny all; }
}
Test and reload:
sudo nginx -t && sudo systemctl reload nginx
Step 4 — Install WordPress
cd /var/www/secondsite.com
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xzf latest.tar.gz
sudo mv wordpress/* .
sudo rm -rf wordpress/ latest.tar.gz
sudo cp wp-config-sample.php wp-config.php
sudo chown -R nginx:nginx /var/www/secondsite.com/
Edit wp-config.php with the new database credentials:
sudo nano wp-config.php
# Update DB_NAME, DB_USER, DB_PASSWORD
# Update Redis database number (use 1, 2, 3... not 0)
Redis database number in wp-config.php:
define( 'WP_REDIS_DATABASE', 1 ); // 0 is used by the first site
Step 5 — SSL Certificate
Point the new domain’s DNS A record to your VPS IP first. Once propagated:
sudo certbot --nginx -d secondsite.com -d www.secondsite.com
Step 6 — Complete WordPress Installation
Visit https://secondsite.com in browser and complete the WordPress installer.
How Many Sites Can One VPS Handle?
With FastCGI cache and Redis configured, cached page requests use almost no PHP or database resources. The limiting factor for multi-site VPS is:
- RAM — PHP-FPM workers, MariaDB, Redis all consume RAM
- Disk — each site’s uploads directory grows over time
- CPU — cache misses and wp-cron jobs compete for CPU
A 4GB Vultr VPS with the stack in this series comfortably handles 6+ low-to-medium traffic WordPress sites. For sites with consistent traffic above a few thousand daily visitors, monitor RAM carefully and consider a dedicated VPS per high-traffic site.
A developer-friendly cloud VPS provider with simple instances, predictable infrastructure building blocks, and global locations. This is the kind of hosting I use when I want to own the WordPress stack instead of renting a polished control panel.
Get Vultr →Affiliate link — I may earn a commission at no cost to you.