Virtual Hosts

Host: Robert Moonen Date: 29th May, 2009

Setting up Virtual Hosts under Apache.

Make sure that the module you need is available.

So first of all we need to check the directory of available modules to see if we have a copy of module vhosts_alias

ls /etc/apache2/mods-available/

actions.conf
actions.load
alias.conf
alias.load
asis.load
auth_basic.load
auth_digest.load
authn_alias.load
authn_anon.load
authn_dbd.load
authn_dbm.load
authn_default.load
authn_file.load
authnz_ldap.load
authz_dbm.load
authz_default.load
authz_groupfile.load
authz_host.load
authz_owner.load
authz_user.load
autoindex.conf
autoindex.load
cache.load
cern_meta.load
cgi.load
cgid.conf
cgid.load
charset_lite.load
dav.load
dav_fs.conf
dav_fs.load
dav_lock.load
dbd.load
deflate.conf
deflate.load
dir.conf
dir.load
disk_cache.conf
disk_cache.load
dump_io.load
env.load
expires.load
ext_filter.load
file_cache.load
filter.load
headers.load
ident.load
imagemap.load
include.load
info.conf
info.load
ldap.load
log_forensic.load
mem_cache.conf
mem_cache.load
mime.conf
mime.load
mime_magic.conf
mime_magic.load
negotiation.conf
negotiation.load
perl.load
php5.conf
php5.load
proxy.conf
proxy.load
proxy_ajp.load
proxy_balancer.load
proxy_connect.load
proxy_ftp.load
proxy_http.load
python.load
rewrite.load
setenvif.conf
setenvif.load
speling.load
ssl.conf
ssl.load
status.conf
status.load
substitute.load
suexec.load
unique_id.load
userdir.conf
userdir.load
usertrack.load
version.load
vhost_alias.load    # this is mod_vhost_alias

Next we need to tell apache2 to load the vhosts_alias module

ls /etc/apache2/mods-enabled/

alias.conf
alias.load
auth_basic.load
authn_file.load
authz_default.load
authz_groupfile.load
authz_host.load
authz_user.load
autoindex.conf
autoindex.load
cgi.load
deflate.conf
deflate.load
dir.conf
dir.load
env.load
mime.conf
mime.load
negotiation.conf
negotiation.load
perl.load
php5.conf
php5.load
python.load
setenvif.conf
setenvif.load
status.conf
status.load
vhost_alias.load    # make sure it's enabled

Now we need to setup the enabled sites file to include all the virtual hosts we will be adding.

cat /etc/apache2/sites-enabled/000-default

<VirtualHost *:80>              # set the port number here
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www/
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride AuthConfig
        Order allow,deny
        allow from all
    </Directory>
    UseCanonicalName Off            #
    VirtualDocumentRoot /var/www/%0/    # this is the asked for URL

    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>

Including VirtualDocumentRoot /var/www/%0/ in the enabled sites file tells apache2 that is is to do directory expansion adding the asked for URL to the normal DocumentRoot directory.

ls -la /var/www
total 24 
drwxrwxr-x  5 root   robert 4096 May 29 20:33 . 
drwxr-xr-x 14 root   root   4096 Jan  3 13:29 .. 
lrwxrwxrwx  1 root   root     25 Jan 19 19:03 172.16.0.104 -> lampp/djelectro/postcode/                 # local Virtual host
lrwxrwxrwx  1 root   root     22 Jan 19 19:02 ares -> ares.going-places.org/                        # local Virtual host
lrwxrwxrwx  1 robert robert    8 May 26 14:09 ares-ext -> external                      # local Virtual host
drwxr-xr-x 25 robert robert 4096 May 31 14:45 ares.going-places.org                         # local Virtual host
drwxr-xr-x  5 robert robert 4096 May 31 14:47 external                              # directory for external access
lrwxrwxrwx  1 robert robert   18 Jan 24 23:29 going-places.dyndns.org -> /var/www/external/             # dyndns Virtual host
lrwxrwxrwx  1 robert robert   34 Jan 24 23:29 going-places.webhop.net -> /var/www/lampp/djelectro/postcode/ # dyndns Virtual host
-rw-r--r--  1 robert robert   45 Dec 10 00:17 index.html 
drwxr-xr-x  7 robert robert 4096 Jan  8 18:39 lampp 
lrwxrwxrwx  1 robert robert   17 May 25 21:02 mywebspace.dyndns.org -> /var/www/external            # dyndns Virtual host
lrwxrwxrwx  1 robert robert   17 May 26 13:54 pastebin.dyndns.org -> /var/www/external              # dyndns Virtual host
lrwxrwxrwx  1 robert robert   18 Feb  3 12:51 www.going-places.dyndns.org -> /var/www/external/             # dyndns Virtual host
lrwxrwxrwx  1 robert robert   34 Feb  3 12:48 www.going-places.webhop.net -> /var/www/lampp/djelectro/postcode/     # dyndns Virtual host
lrwxrwxrwx  1 root   root     16 Jan 19 19:04 www.intra.net -> lampp/djelectro/                     # local Virtual host
lrwxrwxrwx  1 robert robert   17 May 25 21:02 www.mywebspace.dyndns.org -> /var/www/external            # dyndns Virtual host
lrwxrwxrwx  1 robert robert   17 May 26 13:54 www.pastebin.dyndns.org -> /var/www/external          # dyndns Virtual host

As you can see, now all you have to do is put links to your directories in URL format and it all "just works". ;)