Apache is a free and open source web server, it is the most popular web server in the world, and is commonly used in Linux servers. It is developed and maintained by Apache Software Foundation, over half of all servers around the world are running this fast and secure web server. In this tutorial, we will show you how to set up Apache virtual hosts on Ubuntu 16.04, to host as many websites as you want, the limit is your server’s resources like RAM, disk space, etc.
What is virtual host?
Virtual host is used to host a number of websites on the same web server. The web server could be Apache, nginx, Litespeed, etc. Apache supports two types of virtual host:
Name based virtual hosts
IP based virtual hosts
The name based virtual host is commonly used to host multiple websites on the same server, whereas in IP based virtual host we can only configure one website on one IP address. In this tutorial, we will show you how to create name based virtual hosts. We will host domainone.com and domaintwo.com on a server, please replace them with your actual domain names.
How to create virtual host
Let’s SSH in to the server and proceed to the next step.
ssh root@Your_IP_Address -p7022
Create directory for domains’ webroot
mkdir -p /var/www/html/{domainone.com,domaintwo.com}/{public_html,logs}
The command above will create four directories, two of them will be our domains’ document root, and the other tw will be used to store our apache log files:
/var/www/html/domainone.com/public_html
/var/www/html/domaintwo.com/public_html
/var/www/html/domainone.com/logs
/var/www/html/domaintwo.com/logs
Create test pages
Now, let’s create a test page for domainone.com
nano /var/www/html/domainone.com/public_html/index.html
<html>
<body>
<center><h1>This is domainone.com!</h1></center>
</body>
</html>
Save and exit nano with Ctrl + O then Ctrl + X
Let’s copy the index test page to domaintwo.com
cp /var/www/html/domainone.com/public_html/index.html /var/www/html/domaintwo.com/public_html/
Okay, the index test page has been copied, but we need to edit the index page for domaintwo.com
sed -i 's/domainone.com/domaintwo.com/g' /var/www/html/domaintwo.com/public_html/index.html
We have successfully created an index test page for both domain names. Let’s give permission to user www-data, the default user who runs the apache.
chown -R www-data: /var/www/html/
Create a virtual host
Now, let’s create a virtual host configuration file for domainone.com. The virtual host configuration file should be ended with .conf extension
nano /etc/apache2/sites-available/domainone.com.conf
ServerAdmin admin@domainone.com ServerName domainone.com ServerAlias www.domainone.com DocumentRoot /var/www/html/domainone.com/public_html ErrorLog /var/www/html/domainone.com/logs/error.log CustomLog /var/www/html/domainone.com/logs/access.log combined
The virtual host configuration file for domainone.com has been created, now we only need to copy and edit it for domaintwo.com
cp /etc/apache2/sites-available/domainone.com.conf /etc/apache2/sites-available/domaintwo.com.conf
sed -i 's/domainone.com/domaintwo.com/g' /etc/apache2/sites-available/domaintwo.com.conf
We will give you a short explanation about the content of virtual host configuration file.
<VirtualHost *:80>
The virtual host is listening on port 80
ServerAdmin admin@domainone.com
The ServerAdmin sets the contact address that the server includes in any error messages it returns to the client. You can specify your email address here, or even remove the line.
ServerName domainone.com ServerAlias www.domainone.com
This directive is needed, it tells Apache that Apache will process the domain request. Apache will search for virtual host files and process all request if domain/subdomain match with the one configured on ServerName or ServerAlias directive.
DocumentRoot /var/www/html/domainone.com/public_html
This directive is also important, we need to tell Apache where the document root of domaincone.com is. If we don’t specify it, apache will load the default document root, which is in /var/www/html
ErrorLog and CustomLog are the directives to save the log of a domain name hosted on the server.
Enable virtual host
In Ubuntu, we can simply issue the following commands to enable the virtual hosts
a2ensite domainone.com a2ensite domaintwo.com
Those commands will enable the virtual hosts, but we also need to reload/restart Apache after enabling/disabling the virtual host. The command actually creates a symbolic link in /etc/apache2/sites-enabled. You can also run the following commands instead of invoking the ‘a2ensite’ command:
ln -s /etc/apache2/sites-available/domainone.com.conf /etc/apache2/sites-enabled/ ln -s /etc/apache2/sites-available/domaintwo.com.conf /etc/apache2/sites-enabled/
Now, restart apache to activate the new configuration.
systemctl restart apache2
That is all, we successfully created two Apache virtual hosts for the two domains. You can now open your web browser and navigate to the domain name of the newly created virtual hosts.
http://domainone.com
http://domaintwo.com
PS. If you liked this post on How to set up Apache Virtual Hosts on Ubuntu 16.04, feel free to share it with your friends by using the social media share shortcuts below, or simply leave a comment. Thanks.