How to Run Multiple Websites on One VPS in Bangladesh
One VPS can host 10, 20, or 50 websites if configured correctly. Here's how to run multiple sites on a single BDIX VPS with Nginx and free SSL for each.
On this page
One of the biggest advantages of a VPS over shared hosting is that you control how many websites run on it. Instead of paying separate shared hosting fees for each site, you can host dozens of websites on a single VPS β with independent SSL certificates, separate databases, and proper isolation.
This guide shows you how to set up multiple websites on a BDIX VPS using Nginx server blocks (virtual hosts). The same approach works on a Singapore VPS or USA VPS.
Understanding Virtual Hosts (Server Blocks)#
When someone types site1.com in their browser, the request reaches your VPS's IP address. Nginx reads the Host header in the request to determine which website to serve β even though multiple sites share the same IP.
Each website gets its own server block β a configuration file that tells Nginx: "when someone requests this domain, serve files from this directory."
Prerequisites#
- A VPS with Ubuntu 22.04 (this guide uses SNBD HOST BDIX VPS)
- Nginx installed
- Root or sudo access
- Domain names pointing to your VPS IP (via A records in your DNS provider)
If you haven't set up your VPS yet, follow our VPS beginner setup guide first.
Directory Structure#
Create a clean directory structure for your sites:
sudo mkdir -p /var/www/site1.com/html
sudo mkdir -p /var/www/site2.com/html
sudo mkdir -p /var/www/site3.com/htmlSet ownership so your user can manage files without sudo:
sudo chown -R $USER:$USER /var/www/site1.com
sudo chown -R $USER:$USER /var/www/site2.com
sudo chown -R $USER:$USER /var/www/site3.comCreate a test page for site1:
nano /var/www/site1.com/html/index.html<h1>Site 1 is working</h1>Repeat for each site with different content so you can verify which site is loading.
Creating Nginx Server Blocks#
Server Block for site1.com#
sudo nano /etc/nginx/sites-available/site1.comserver {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.ht {
deny all;
}
access_log /var/log/nginx/site1.com.access.log;
error_log /var/log/nginx/site1.com.error.log;
}Server Block for site2.com#
sudo nano /etc/nginx/sites-available/site2.comserver {
listen 80;
listen [::]:80;
server_name site2.com www.site2.com;
root /var/www/site2.com/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
access_log /var/log/nginx/site2.com.access.log;
error_log /var/log/nginx/site2.com.error.log;
}Enable the Sites#
Create symlinks in sites-enabled:
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/Test the configuration and reload:
sudo nginx -t
sudo systemctl reload nginxAdding SSL for Each Site#
Each domain gets its own free SSL certificate from Let's Encrypt:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d site1.com -d www.site1.com
sudo certbot --nginx -d site2.com -d www.site2.com
sudo certbot --nginx -d site3.com -d www.site3.comCertbot automatically modifies your Nginx config to redirect HTTP to HTTPS and adds SSL directives. It also sets up automatic renewal via a cron job.
Setting Up Separate Databases#
For WordPress or PHP sites that need databases, create a separate database and user per site:
sudo mysql -u root -pCREATE DATABASE site1_db;
CREATE USER 'site1_user'@'localhost' IDENTIFIED BY 'strongpassword1';
GRANT ALL PRIVILEGES ON site1_db.* TO 'site1_user'@'localhost';
CREATE DATABASE site2_db;
CREATE USER 'site2_user'@'localhost' IDENTIFIED BY 'strongpassword2';
GRANT ALL PRIVILEGES ON site2_db.* TO 'site2_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;Each site has its own database user with access only to its own database. A vulnerability in site1 can't read site2's database.
Installing WordPress per Site#
For each WordPress site:
cd /var/www/site1.com/html
wget https://wordpress.org/latest.tar.gz
tar -xzf latest.tar.gz --strip-components=1
rm latest.tar.gz
cp wp-config-sample.php wp-config.phpEdit wp-config.php with your database credentials:
nano wp-config.phpdefine('DB_NAME', 'site1_db');
define('DB_USER', 'site1_user');
define('DB_PASSWORD', 'strongpassword1');
define('DB_HOST', 'localhost');Set correct file ownership:
sudo chown -R www-data:www-data /var/www/site1.com/html
sudo find /var/www/site1.com/html -type d -exec chmod 755 {} ;
sudo find /var/www/site1.com/html -type f -exec chmod 644 {} ;Visit https://site1.com and complete the WordPress installation wizard.
How Many Sites Can One VPS Handle?#
The answer depends on traffic, not the number of sites. Here's a realistic breakdown for SNBD HOST VPS tiers:
- 1 vCPU / 1 GB RAM (ΰ§³499/mo): 5β10 low-traffic WordPress sites (under 500 visitors/day each)
- 2 vCPU / 2 GB RAM: 15β25 sites, or 5β8 medium-traffic sites
- 4 vCPU / 4 GB RAM: 40+ sites comfortably, or several high-traffic sites
NVMe SSD storage (standard on SNBD HOST VPS) means disk I/O isn't a bottleneck β RAM and CPU are what you run out of first with WordPress sites.
Using PHP-FPM Pools for Better Isolation#
By default, all PHP sites share one PHP-FPM pool running as www-data. For stronger isolation between client sites, create separate pools:
sudo cp /etc/php/8.1/fpm/pool.d/www.conf /etc/php/8.1/fpm/pool.d/site1.conf
sudo nano /etc/php/8.1/fpm/pool.d/site1.confChange these values:
[site1]
user = site1
group = site1
listen = /run/php/php8.1-fpm-site1.sock
listen.owner = www-data
listen.group = www-dataCreate the system user:
sudo useradd -M -s /bin/false site1Update site1's Nginx config to use the dedicated socket:
fastcgi_pass unix:/run/php/php8.1-fpm-site1.sock;This means each site's PHP runs under a different system user β a PHP vulnerability on one site can't access another site's files.
Managing Multiple Sites Efficiently#
Centralized Log Monitoring#
With per-site log files, you can monitor all sites easily:
# Watch all error logs in real-time
tail -f /var/log/nginx/*.error.logPer-Site Backup Script#
#!/bin/bash
DATE=$(date +%Y%m%d)
for site in site1.com site2.com site3.com; do
tar -czf /backups/${site}_${DATE}.tar.gz /var/www/${site}
done
mysqldump site1_db > /backups/site1_db_${DATE}.sql
mysqldump site2_db > /backups/site2_db_${DATE}.sqlChecking Nginx Config After Changes#
Always test before reloading:
sudo nginx -t && sudo systemctl reload nginxCost Comparison: VPS vs Multiple Shared Hosting Plans#
If you're managing websites for clients or running multiple projects in Bangladesh:
- 5 separate shared hosting plans at ΰ§³250/mo each = ΰ§³1,250/mo
- One VPS hosting all 5 sites = ΰ§³499β999/mo
The VPS option is significantly cheaper and gives you far more control. As the number of sites grows, the cost advantage of a single BDIX VPS over separate shared plans compounds quickly.
The setup takes a few hours upfront. After that, adding a new site takes about 10 minutes: create the directory, create the server block, run Certbot, create the database. That's a one-time learning investment that saves money every month indefinitely.

Written by
Technical Support Dept.
Technical Support Dept is the tech backbone of SNBDHost, sharing clear, practical guides on hosting, performance, and security to help users keep their websites fast, stable, and secure.


