How to Set Up an Apache Virtual Host on Linux Mint

Running Apache on my local machine helps me speed up my web development work. It means that I can use root-relative urls, server-side programming languages (such as PHP) and interface with a database — all without having to upload anything via FTP.

The only problem comes when you are working on multiple projects at the same time. If you create different directories for different projects within your web root (which defaults to /var/www/html), then the root-relative urls will break, as will any server-side includes you are using.

This is where virtual hosts come in. They allow you to create a separate domain for each of your projects, such as http://project1/ and http://project2/.

Configuring Apache

I’m assuming you have Apache installed and configured. If you haven’t you can grab the LAMP server stack with the following command in the terminal.

sudo apt-get install lamp-server^

You gotta love Linux, eh?

So, first off, let’s make two directories for each of our projects:

mkdir /var/www/html/project1
mkdir /var/www/html/project2

And put a file in each:

echo "Project 1" > /var/www/html/project1/index.html
echo "Project 2" > /var/www/html/project2/index.html

Now, we’ll need to create a virtual host file for each domain. We’ll have to do this as root:

sudo touch /etc/apache2/sites-available/project1.conf
sudo touch /etc/apache2/sites-available/project2.conf

Open the first file in a text editor:

sudo gedit /etc/apache2/sites-available/project1.conf

and enter:

<VirtualHost *:80>
  ServerName project1
  DocumentRoot /var/www/html/project1
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Then open the second:

sudo gedit /etc/apache2/sites-available/project2.conf

and enter:

<VirtualHost *:80>
  ServerName project2
  DocumentRoot /var/www/html/project2
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Save these files and shut your editor.

Now we need to inform Apache that these sites exist. We can do this using the a2ensite command:

sudo a2ensite project1.conf
sudo a2ensite project2.conf

Then restart Apache:

sudo service apache2 restart

The final step is to add these two new sites to your hosts file — a file used by your operating system to map hostnames to IP addresses.

sudo gedit /etc/hosts

Add the two new sites at the top of the file underneath localhost:

127.0.0.1  localhost
127.0.0.1 project1
127.0.0.1 project2

Now visit http://project1/ and http://project2/ respectively. If all has gone well, you should see the files we created earlier.

Note: If you want to remove the sites, follow the steps in reverse and use a2dissite.