I have been working on a couple projects that are hosted on gitHub. As the scale and scope of the projects grow, I ended up needing to setup multiple virtual hosts on my development machine. It wasn’t hard, but the information online that I found was fairly dated, so I created this tutorial.
This entire tutorial is done after entering the ‘sudo -i’ command which allows us to act as the SUPER-USER for the entirety of our terminal session. You’ve been warned.
sudo -i
NOTICE!!! I am aware that we could use the ‘a2ensite’ and related commands. But for the sake of understanding the entire process, I will not be using it.
1) Install the required modules from the command line
apt-get install apache2 mysql-server mysql-client php5 php5-cli php5-mysql
2) Change the directory to /etc/apache2/sites-available
cd /etc/apache2/sites-available
3) If you run the ‘ls’ command while in the sites-available directory you should see the following
lsOutput
default default-ssl
4) Copy the ‘default’ config to a site specific config. For this tutorial I am using dev.acloudtree.com.
cp default dev.acloudtree.com.conf5) Make the application directory
mkdir /var/dev.acloudtree.com
6) Open the file with an editor of your choosing. I prefer VIM.
vi dev.acloudtree.com.confThe output below is the entire file but I will discuss certain parts that we will need to edit.
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> </VirtualHost>
7) Add the name of the server. This will be the name that you type in the URL field of your web browser (IE: Firefox)
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName dev.acloudtree.com ...
8 ) Point the Virtual host to the correct directory
...
DocumentRoot /var/dev.acloudtree.com
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
...9) Also make the change here.
...
<Directory /var/dev.acloudtree.com/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
...10) So this is what your dev.acloudtree.com.conf file should look like when you are done. Write/Quite the file and we will move on.
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName dev.acloudtree.com DocumentRoot /var/dev.acloudtree.com <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/dev.acloudtree.com/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> </VirtualHost>
10a) IMPORTANT! Make a symbolic link in the sites-enabled directory
ln -s /etc/apache2/sites-available/dev.acloudtree.com.conf /etc/apache2/sites-enabled/000-dev.acloudtree.com.conf
11) We need to edit our /etc/hosts file
vi /etc/hosts
Output
127.0.0.1 localhost 127.0.1.1 servername # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
12) Right beneath the ‘localhost’ definition, add the following
127.0.0.1 dev.acloudtree.com
13) The complete file looks like this.
127.0.0.1 localhost 127.0.0.1 dev.acloudtree.com 127.0.1.1 servername # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
14) Create an index.php file in /var/dev.acloudtree.com for testing purposes.
vi /var/dev.acloudtree.com/index.php
Contents of .php file.
<?php echo 'Jared Folkins\' tutorial on acloudtree.com really works!'; phpinfo(); ?>
15) Reboot the apache2 process.
/etc/init.d/apache2 restart
16) Now open up your web browser and enter dev.acloudtree.com into the URL bar and it should work!
UPDATE: I forgot to mention that in this environment, I like to configure log files for each virtual host. This is our current dev.acloudtree.com file.
<VirtualHost *:80> ServerAdmin webmaster@localhost ServerName dev.acloudtree.com DocumentRoot /var/dev.acloudtree.com <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/dev.acloudtree.com/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/access.log combined Alias /doc/ "/usr/share/doc/" <Directory "/usr/share/doc/"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/255.0.0.0 ::1/128 </Directory> </VirtualHost>
Just change the ErrorLog and CustomLog names to match the virtual host.
...
ErrorLog /var/log/apache2/dev.acloudtree.com_error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/dev.acloudtree.com_access.log combined
...
</VirtualHost>

Hi,
I have just setup a Ubuntu 9 server. I have done what you have said. Most of stuff I have already done with the other tutorials as well.
I stuck at one point. Everytime I try to access my newly created website I’m taken to the default website(remote computer). Only change I have done here is that in the hosts file I changed the ip to my server ip so that it can be accessed from remotely.
Also I have added these lined in my apache conf (httpd.conf) file.
ServerName localhost
NameVirtualHost
Will you be able to point me in the right direction please? What am I missing here?
-Prasannah
@Prasannah
The most likely cause of this, is that you need to either edit the local ‘hosts’ file on your local operating system, or have access to your DNS server in order to configure your network correctly.
The easiest route is using your local ‘hosts’ file.
For example, I followed my tutorial above and created several different Virtual hosts. And the IP address of my Ubuntu install is 192.168.1.149
So now, I want to access this machine’s web server and its virtual hosts on the network. I boot up my Macintosh OSX Macbook pro, and run the command ‘sudo vi /etc/hosts’. I then adjust the hosts file to point to the ubuntu server.
This is what I currently have.
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost
fe80::1%lo0 localhost
And I will add these lines.
127.0.0.1 localhost
255.255.255.255 broadcasthost
192.168.1.149 dev.acloudtree.com
192.168.1.149 prod.acloudtree.com
192.168.1.149 test.acloudtree.com
::1 localhost
fe80::1%lo0 localhost
Assuming that I have everything setup correctly, I should be able to access each of the unique virtual hosts from my favorite web browser.
This is the most comprehensive, straight-to-the-point and easy to follow article I have come across, on setting up Virtual Hosts in Apache 2. I’m running Ubuntu 10.04 and this setup worked first time. Thank you!
@Johan
Not a problem dude!
Very well explain, thx mate!
Am I wrong in saying this allows only use by the person using the computer?
The tutorial was followed but changed so instead of using a .com domain name, a made up name of the form “example.local” was used for the server name. Everything works so far on the setup machine. If “example.local” is input to the browser on the setup machine, the test page shows up correctly.
If “example.local” is keyed into a browser on another machine nothing happens. That makes sense because no changes were made to the other machine to tell it about the “example.local” server on the other computer.
If the IP address of the server is input into a browser on the other computer, the test page shows up correctly so the server is visible by an outside computer.
How do I make an outside computer connect to a server using a made up name like “example.local”, without using a domain name, or a service like DynDNS?
Thanks
You are potentially wrong.
(1) Server and (2) Developers on the same local network could do access the different virtual servers by editing their /etc/hosts file. Not pretty, but it would work.
You are correct here though.
When outside of the network, you would need to correctly setup your DNS.