Hellow there! How’s it going? Today I thought of concentrating my blog on Apache Virtual Host. There you have the URL to the documentation page. It’s for the Apache HTTP Server Version 2.2. Have you got time to read all that? I mean who’s got time to read all those docs? That’s why I’m here for. I’ll make this blog post short and sweet for you(happy-face).
What’s Apache Virtual Host?
Apache Virtual Hosts A.K.A Virtual Host(Vhost) are used to run more than one web site(domain) using a single IP address. In other words you can have multiple web sites(domains) but a single server. Different sites will be shown depending on the user’s requested URL. Best part is you can have any number of virtual hosts in a single server. It simply means you can have any number of web sites(domains) in a single server.
As you see in the above picture, requests from each domain will be mapped into respective document root. If you don’t know what document root means it is where all the files of the website are located(could be public_html). I know you know what document root means, I’m just messing around(tongue-out-face). Let’s get serious again. There are
- Name-Based Virtual Host
- IP-Based Virtual Host
In most scenarios Name-based virtual host is used. So today we are going to talk about Name-Based Virtual Host and it’s configurations. I don’t want to leave you in the dark. So I’ll go through basics of IP-Based Virtual Host as well.
1. IP-Based Virtual Host
In this scenario the physical server should have two ip addresses, in other words the physical server should have two ethernet cards, each one of them are configured to the particular ip-address of the corresponding website. Don’t get confused. There is only one physical server running Apache but two IPs.
- www.abc.com has the 192.168.100.1 IP address and a virtual host in Apache which points to www.abc.com’s document root.
- www.xyz.com has the 192.168.100.2 IP address and a virtual host in Apache which points to www.xyz.com’s document root.
2. Name-Based Virtual Host
Most of the time you will be using name-based virtual host configuration. Let me explain what happens then we’ll move on to how to get to this done. When a request is made to the Apache web server, it looks for the hostname in the HTTP header in the given request. Depending on the hostname, requested will be served. Compared to previous scenario here the server has got only one ip-address but multiple web sites(domains) will be pointing to the server. Here abc.com and xyz.com both sites points to the same Apache web server which has got the ip address of 192.168.100.1. In this scenario we need to have two virtual hosts, one for xyz.com and one for abc.com. Are you worried about how to setup your virtual hosst? That’s what we are going to talk about next.
How To Use Apache Virtual Host?
Here we are going to focus on the name-based virtual hosting. To set up a virtual host you should have the following. What we call “prerequisites”.
- Apache web server
- Directory which keeps the website’s files(/var/www/dasunhegoda.com/public_html)
- Correct permission, 755 for folders and 644 for files
If you have all the above mentioned prerequisites you are good to proceed. Let’s get techie(happy-face).
In the below code snippets dasunhegoda.com should be replaced with your site name.
1. New Virtual Host File
sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/dasunhegoda.com
Here we get a copy of the default file.
2. Open The New Virtual Host File & Edit
sudo vim /etc/apache2/sites-available/dasunhegoda.com
Above command will open up the newly created file. If you don’t have vim editor, you can use vi editor or nano editor for this. Paste the code below.
<VirtualHost *:80> ServerAdmin firstname.lastname@example.org DocumentRoot "/var/www/dasunhegoda.com/public_html" ServerName dasunhegoda.com ServerAlias www.dasunhegoda.com ErrorLog "/var/logs/dasunhegoda.com/error_log" CustomLog "/var/logs/dasunhegoda.com/access_log" </VirtualHost>
Let me explain. Virtual hosts, is defined by <VirtualHost> sections. Keep in mind that having logs in your vhost is not mandatory but makes the life easier to figure out what’s going on.
- VirtualHost *:80 – Virtual hosts will be listening on the default port 80(could 443 if you are using https)
- ServerAdmin – Server Admin’s email
- DocumentRoot – Path where web site files are located
- ServerName – Server name
- ServerAlias – Alternate names
- ErrorLog – File contains any errors that it encounters in processing requests
- CustomLog – All requests processed by the server. Access log file
Note that you don’t have to have the all the directive in your virtual host. Even having DocumentRoot and ServerName would do the job. See more example here.
3. Activate the host
sudo a2ensite dasunhegoda.com
Activate the virtual host using above command. a2ensite is a built in apache command.
4. Restart Apache
sudo service apache2 restart
Above command will restart the Apache server. Remember whenever you make configuration changes you should restart Apache server.
*. Disable the virtual host
sudo a2dissite dasunhegoda.com
At any point if you want to disable the virtual host you can use above command to disable. a2dissite is a built in apache command.
Tips & Tricks
Here I’m going to tell you a dirty way to get the job done. But below method is not recommend.
Rather than going through all above steps you can right way edit the apache2.conf file which contains all the Apache server configurations. Just copy and paste the VirtualHost code snippet and restart the server. Disadvantage is you can n’t use a2ensite or a2dissite to enable and disable the sites.
That’s all about Apache virtual hosts. If you have any questions let me know in the comments below. Your feedback is highly appreciated.