Most of my life is spent coding Ruby on Rails, but occasionally i venture into the world of PHP. When i do, i sometimes need to configure Apache because, unlike Rails, it does not happen automagically! To save myself always looking things up on the Internet, here is a little summary of the things i have learnt.
Don’t do this!
When i very first started using Linux, i discovered that you could put files into /var/www
and access them through http://localhost. This is a very bad idea because you don’t have permissions to the /var
directory (for good reason!) so i used to end up chmodding
everything. Also, keeping anything outside your home directory is bad news because you’re liable to forget to back it up before you do an upgrade! WHOOPS!
A perfectly good solution
The next thing i learnt was symlinking, or creating shortcuts. So you can set up a shortcut from the /var/www
directory to an appropriate place in your home directory. For example:
sudo ln -s /home/aimee/websites /var/www/html
Now if i have a directory called mac2
under my websites
directory i can go to http://localhost/html/mac2/index.php. Nice!
More advanced: VirtualHosts
Later on i started experimenting with Apache’s RewriteRule
and RewriteBase
for nice ‘pretty’ URLs. You’ll soon find out that the symlink method is no longer suitable because you’re not using relative URLs anymore. It’s time to learn about VirtualHosts
, so that i can access my local files with a URL like http://mac2.aimee.
Apache2 keeps a list of available configurations under /etc/apache2/sites-available
. I have one called aimee.conf
because i am egotistical like that!
sudo vim /etc/apache2/sites-available/aimee.conf
It must start with this line:
NameVirtualHost 127.0.0.1
Then, for each site that i want, i add a VirtualHost
like this:
ServerName mac2.aimee
DocumentRoot /home/aimee/websites/mac2
CustomLog /var/log/apache2/mac2.log combined
DirectoryIndex index.php
It really just needs to know where to find the source files. The log and directory index are not especially important. It’s probably fairly obvious why i added them. There are plenty of other options you could use if you wanted to, but this is about all i use.
Next we need to enable the configuration. It’s as simple as symlinking the file from the sites-available
directory. You only need to do this once per .conf
file (and i only use one for simplicity).
cd /etc/apache2/sites-enabled
sudo ln -s /etc/apache2/sites-available/aimee.conf .
The next step is to configure the hosts
file such that when i type http://mac2.aimee into a browser it knows to look on my actual computer rather than on the Internet.
sudo vim /etc/hosts
I enter a line like this:
127.0.0.1 mac2.aimee
Finally, restart Apache and all should be very well!
sudo /etc/init.d/apache2 restart
The best of both worlds
If you want it both ways (and hey, why shouldn’t you?!) it is quite simple to set up another VirtualHost for localhost. Just add it in like this:
ServerName localhost
DocumentRoot /home/aimee/websites
Restart Apache again and now the same site is accessible at both http://mac2.aimee and http://localhost/mac2/index.php.
Happy day! :)
Disclaimers
This is how i made it work on Ubuntu Linux in a development environment. Other operating systems may behave differently. I have no idea about setting up production servers!
If Apache is in a different place on your computer, you can find it like this:
whereis apache2
To find your hosts
file:
locate hosts
I am not an Apache expert, so if you have any questions, chances are i can’t answer them! Scroogle is your friend! :)