Hosting Multiple Websites on a VPS with Nginx: A Complete Tutorial

Hosting Multiple Websites on a VPS with Nginx: A Complete Tutorial

Step-by-Step Guide to Hosting Multiple Sites on a VPS with Nginx

To host multiple websites or applications on a VPS using Nginx, you can create separate server blocks (virtual hosts) for each site. Here’s a step-by-step guide to setting this up:

1. Update and Install Nginx

First, ensure your VPS is up-to-date and that Nginx is installed.

sudo apt update
sudo apt upgrade
sudo apt install nginx

2. Configure DNS

Ensure each domain name points to your VPS's IP address by updating the DNS records at your domain registrar.

3. Create Directory Structure

Create directories for each site. For example:

sudo mkdir -p /var/www/site1.com/html
sudo mkdir -p /var/www/site2.com/html

sudo chown -R $USER:$USER /var/www/site1.com/html
sudo chown -R $USER:$USER /var/www/site2.com/html

sudo chmod -R 755 /var/www

4. Create Sample HTML Files

Create a simple HTML file for each site to test the setup.

echo "<html><body><h1>Welcome to Site1</h1></body></html>" > /var/www/site1.com/html/index.html
echo "<html><body><h1>Welcome to Site2</h1></body></html>" > /var/www/site2.com/html/index.html|

5. Create Nginx Server Blocks

Create server block configuration files for each site.

sudo nano /etc/nginx/sites-available/site1.com

Add the following content to the site1.com configuration file:

server {
    listen 80;
    server_name site1.com www.site1.com;

    root /var/www/site1.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Repeat the above steps for site2.com.

sudo nano /etc/nginx/sites-available/site2.com

Add the following content to the site2.com configuration file:

server {
    listen 80;
    server_name site2.com www.site2.com;

    root /var/www/site2.com/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

6. Enable the Server Blocks

Create symbolic links to enable the new server blocks.

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/

7. Test and Restart Nginx

Test the Nginx configuration for syntax errors and then restart Nginx.

sudo nginx -t
sudo systemctl restart nginx

8. Firewall Configuration (Optional)

If you have a firewall enabled, allow HTTP and HTTPS traffic.

sudo ufw allow 'Nginx Full'

For HTTPS, you can use Certbot to obtain and install free SSL certificates.

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d site1.com -d www.site1.com
sudo certbot --nginx -d site2.com -d www.site2.com

Certbot will automatically configure SSL for your Nginx server blocks.

Conclusion

You should now have multiple websites running on your VPS, each served by Nginx with its own server block configuration. Ensure your DNS settings are correct and propagate, and you should be able to visit each site by its domain name.