There are so many amazingly bad guides to Apache and virtual hosting, so i decided to create a good one. This guide uses Apache2 running om Debian 6. I will not cover installation and stuff. Also, I cut right to the chase.
First, the NameVirtualHost property should just be declared once, and ports.conf is a good place to have it.
/etc/apache2/ports.conf
NameVirtualHost *:80 Listen 80
Second, do not place all virtual hosts in a single file, that’s not very dynamic. Look at this:
# ls /etc/apache2/sites-* /etc/apache2/sites-available: total 8 dr-xr-x--- 2 root www-data 3896 Jun 26 15:33 . dr-x------ 5 www-data www-data 3896 Jun 8 13:15 .. -rwxr-x--- 1 root www-data 569 Apr 11 21:51 default -rwxr-x--- 1 root www-data 569 Apr 19 11:40 sub1.example.org -rwxr-x--- 1 root www-data 569 Apr 19 11:41 sub2.example.org -rwxr-x--- 1 root www-data 569 Jun 26 15:25 goodworkaround.com /etc/apache2/sites-enabled: total 0 dr-xr-x--- 2 www-data www-data 3896 Jun 26 15:33 . dr-x------ 5 www-data www-data 3896 Jun 8 13:15 .. lrwxrwxrwx 1 root root 26 Apr 11 21:52 000-default -> ../sites-available/default lrwxrwxrwx 1 root root 41 Apr 19 11:49 sub1.example.org -> ../sites-available/sub1.example.org lrwxrwxrwx 1 root root 41 Apr 19 11:50 sub2.example.org -> ../sites-available/sub2.example.org lrwxrwxrwx 1 root root 37 Jun 26 15:29 goodworkaround.com -> ../sites-available/goodworkaround.com
So what am I doing that no one else is doing? I am symlinking, and I am splitting each domain or subdomain into separate files. Just use place all the domains in the sites-available folder, and symlink it from sites-enabled. This makes it easy to disable sites temporary, by just removing the symlink and reloading apache. Lets take a look one of those files.
/etc/apache2/sites-available/goodworkaround.com
<VirtualHost *:80> ServerAdmin webmaster@goodworkaround.com ServerName goodworkaround.com # ServerAlias www.goodworkaround.com DocumentRoot /home/mariussm/websites/goodworkaround.com <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /home/mariussm/websites/goodworkaround.com> Options FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/goodworkaround.com.error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/goodworkaround.com.access.log combined </VirtualHost>
As you can see, it listens on all interfaces (*:80) on port 80, cares only for the hostname goodworkaround.com and has a root folder. So hey, that’s the easy way.