Published on
Week 8 -

Setting Up Virtual Hosts for Different Domains on the Same Ubuntu Server

Authors

Hosting multiple websites on a single Ubuntu server is a common need. Here's how to set up virtual hosts for different domains using Apache and Nginx.

Apache Virtual Host Setup

1. Create Directory Structure

sudo mkdir -p /var/www/example1.com/public_html
sudo mkdir -p /var/www/example2.com/public_html

sudo chown -R $USER:$USER /var/www/example1.com/public_html
sudo chown -R $USER:$USER /var/www/example2.com/public_html

2. Add Sample HTML Files

echo "<h1>Welcome to example1.com</h1>" > /var/www/example1.com/public_html/index.html
echo "<h1>Welcome to example2.com</h1>" > /var/www/example2.com/public_html/index.html

3. Create Virtual Host Files

Create the first virtual host file:

    sudo nano /etc/apache2/sites-available/example1.com.conf

Paste:

<VirtualHost *:80>
    ServerAdmin admin@example1.com
    ServerName example1.com
    ServerAlias www.example1.com
    DocumentRoot /var/www/example1.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/example1_error.log
    CustomLog ${APACHE_LOG_DIR}/example1_access.log combined
</VirtualHost>

Now create the second one:

sudo nano /etc/apache2/sites-available/example2.com.conf

Paste:

<VirtualHost *:80>
    ServerAdmin admin@example2.com
    ServerName example2.com
    ServerAlias www.example2.com
    DocumentRoot /var/www/example2.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/example2_error.log
    CustomLog ${APACHE_LOG_DIR}/example2_access.log combined
</VirtualHost>

4. Enable Sites and Restart Apache

sudo a2ensite example1.com.conf
sudo a2ensite example2.com.conf
sudo systemctl reload apache2

Enable rewrite module if needed:

sudo a2enmod rewrite
sudo systemctl restart apache2

Nginx Virtual Host Setup

1. Create Directory Structure

sudo mkdir -p /var/www/example1.com/html
sudo mkdir -p /var/www/example2.com/html
sudo chown -R $USER:$USER /var/www/example1.com/html
sudo chown -R $USER:$USER /var/www/example2.com/html

2. Add Sample HTML Files

echo "<h1>Welcome to example1.com</h1>" > /var/www/example1.com/html/index.html
echo "<h1>Welcome to example2.com</h1>" > /var/www/example2.com/html/index.html

3. Create Nginx Server Block Files

First:

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

Paste:

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

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

    access_log /var/log/nginx/example1_access.log;
    error_log /var/log/nginx/example1_error.log;
}

Then:

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

Paste:

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

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

    access_log /var/log/nginx/example2_access.log;
    error_log /var/log/nginx/example2_error.log;
}

4. Enable Sites and Restart Nginx

sudo ln -s /etc/nginx/sites-available/example1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example2.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Local Testing

To test locally, add entries to your hosts file:

sudo nano /etc/hosts

Add:

127.0.0.1 example1.com
127.0.0.1 example2.com

Save and access the domains via your browser.