Apache2: Activating User public_html Directories & Virtual Directories- Hosts- Domains under Ubuntu Linux for a Private LAN
Update 2010-02: Over three years of low-maintenance website development and going strong. For apache2.2, there was one slight change needed for the virtual hosts (fake, local domains) files. For Ubuntu 9.10, there was a change to the choices you have for administering the network settings. Namely, the GUI System- Admin- Network is gone and the System- Prefs- Network Connections doesn't allow for editing the /etc/hosts file.
Summary: Let the hacker beware (Disclaimer)
These pages describes how I activated the public_html user directories to be served up by the Apache web server and set up virtual directories, meaning fake domains for a private LAN. The audience is developers and home users who want to work on their websites at their desktop computers. I describe what has worked for me and some problems you might encounter using Ubuntu Linux desktop software. I have no idea if this is applicable to the GUI-less server software. These are experiences I had using computers in my home. They may or may not work for you. I also don't know the distinctions between virtual hosts, virtual directories, and virtual domains.
Step 1: Installing Apache2 and php5
In a terminal (Applications...Accessories...Terminal), type everything after "$"
me@myhost$ sudo apt-get install apache2 php5
You will be told you're getting some extra software packages. The software php5 is not necessary, but at some point it will probably be useful to you if you are developing your own website. You can also use System...Admin...Synaptic Package Manager to install the software.
Test Step 1: When you install apache2 in Ubuntu linux, it is set to start automatically on each boot. You should be able to open a web browser and type in "http://localhost" and see the default "It Works!" message. If you can't do this, don't proceed. One thing to check is that you have the IP 127.0.0.1 associated with "localhost" in the /etc/hosts file.
Error - Gotcha if Any Reinstalls Done
Subtitled "Don't do what I have done". If you have a problem and decide to reinstall apache... just using "mark for reinstallation" or "reinstall" on the command line did NOT get me a fresh /etc/apache2 setup. I'm not sure which package all this stuff is in, but if you select all the titles with "apache2" in them and "completely remove", or "force remove", or "--purge", then you will be able to start anew again. Research "apt-get" for the right commands. Make sure you check the timestamp on the files in the /etc/apache2 directory when you THINK you have a new installation!
Step 2: Activating the User's public_html Directory with userdir
Create a directory (folder) called "public_html" in your home directory, with your file browser or the command below. Do NOT use the sudo command.
me@myhost$ mkdir public_html
I have found that on a simple development machine, it is easier to have your work all within your own home directory and not have to worry about permissions and folders owned by the root user. What it gets you is the ability to access your websites in your home directory by a URL in the form http://localhost/~USER_NAME. We can improve upon this with fake domains, but first things first.
There are only two commands you need to enter to activate the User Directory feature, and then one command to reload the configuration files. The last command includes an absolute path, so it doesn't matter where you execute it from. The first two "ln" commands assume you are in the directory /etc/apache2/mods-enabled. What you need to do is create two symbolic links (soft links, symlinks) in the stated directory pointing to the corresponding module in /etc/apache2/mods-available. So, if "$" is your prompt,
me@myhost$ cd /etc/apache2/mods-enabled
me@myhost$ sudo ln -s ../mods-available/userdir.conf userdir.conf
me@myhost$ sudo ln -s ../mods-available/userdir.load userdir.load
me@myhost$ sudo /etc/init.d/apache2 restart
On your home system, restarting apache will give you a warning "apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName" simply because you are at home and don't have a fully qualified domain name. No problem.
Test Step 2: Open up a browser and type http://localhost/~USER_NAME, where "USER_NAME" is your actual username. For Debian and Ubuntu, your home directory is located within the "/home" directory. Apache should show the folders and files you have in your directory, or even display a web page if you have an "index.html" file in there. If you get sent to the internet or the default apache2 directory, something is wrong and you shouldn't go to the next step.
Step 3: Virtual Hosts + Domains for PRIVATE LAN DEVELOPMENT SERVER
Background: There is a HUGE benefit to using virtual hosts (fake local domains) for the do-it-yourself website developer. You can create all of your development sites exactly the same as for your live web server. For example, if you have a site on a shared hosting environment that you do not have full control over, then the path "/" is the "top of the world" to your instance of the Apache sever. You cannot duplicate these paths using the "~USER_NAME" address.
Part A - Networking: Okay, this is hardly networking so don't sweat it, as everything happens within your own machine. The end result is that we need to modify the two plain text files /etc/networking/interfaces and /etc/hosts. Keep in mind there is always more than one way to achieve things. I am describing a method that uses a fixed IP for my server. You CAN do this even if your Linksys or other router is set to DHCP. It makes it much easier when you want to have other machines in your house access your server.
To give a network card (NIC) a fixed (static) IP address, follow the expanded explanation on the Linux Fixed IP Address page.
To associate your fake local domains to your local computer, modify the /etc/hosts file to include ALL the aliases (fake domain) names you want to associate with each computer. The format of the file is extremely simple: One line of the file per entry. List the IP and then the aliases, separated by spaces. This is your local DNS. Here is an example.
127.0.0.1 tree localhost.localdomain localhost
127.0.1.1 tree
#
# KB Section
#
192.168.1.12 samsung
192.168.1.13 chair lapcom lapfarmdens lapnatlog
192.168.1.15 table
192.168.1.19 tree com farmdens natlog
192.168.1.21 shrub
# The following lines are desirable for IPv6 capable hosts
# [The rest of the default stuff for IPv6 is here]
[Optional Rant]Networking Soapbox: There seems to be a minor fiasco going on (2010-02) with the Gnome desktop and network configuration. Wireless networking access is becoming very easy with the NetworkManager Applet, but the configuration of other networking aspects is more difficult. The Administration module "gnome-network-admin" is not installed by default in Ubuntu and, when I installed it, it didn't register the changes that I made to plain text files. The lesson here is that it's best to learn what is really going on and know which text files you need to edit.
WARNING: Like I said at the top, these notes are for usage on a PRIVATE LAN, i.e., NOT the internet. Here you can read where someone sent me a apache virtual directories warning. If you try to use these notes on the internet, then you are an idiot and I cannot help you.
Warning Update. For what it's worth, the apache2.2 documentation now explicitly states that the absolute minimum you need in the VirtualHost directive is... exactly what I have below. The Name-Based Virtual Host page shows it in the first blue example box. The main thing to remember is that for your development machine and/or LAN, your /etc/hosts file(s) is(are) your DNS.[/Optional Rant]
Part B - Create Apache Virtual Directories: We will now be concerned with the directories in /etc/apache2 called "sites-available" and "sites-enabled" (you see a pattern here?). This is extremely easy to do if you know the trick that you really don't need most of the stuff in the "default" virtual directory file if you are just working in your home. The simplest thing is to just show you what I use. This will be a physical file in the "sites-available" section. Later we make links. Note my server is the host 192.168.1.19.
# For apache2.2. For apache2.0, I didn't need the ":80" part.
<VirtualHost *:80>
ServerName com
DocumentRoot /home/USER_NAME/public_html/com
</VirtualHost>
Dude! You cannot believe it is that easy if you ever looked at the "default" file in that directory. The pre-formatted code above is the content of a plain text file I can call anything I want, but will name it "com" so as to keep my sanity. "ServerName" is the name of the virtual directory, or fake domain, that will allow you to enter "http://com" in your browser to see the site. The "DocumentRoot" is the absolute path to another file called "com" (not the one we just made, but a directory file). You need to substitute "USER_NAME" with your actual user name. Within my home directory, I have created a file called "public_html" where all my websites are. Each website has a directory within public_html, like "com", to keep all of the files for that website. I happen to keep the names consistent throughout, but that is not necessary. So the next file we create would be /etc/apache2/sites-available/farmdens (you can use $sudo gedit to make it simple) and would look like this:
# For apache2.2. For apache2.0, I didn't need the ":80" part.
<VirtualHost *:80>
ServerName farmdens
DocumentRoot /home/USER_NAME/public_html/com/farmdens
</VirtualHost>
Follow this pattern for all of your virtual hosts (fake local domains).
Part C - Make Apache Virtual Directories Available: Luckily, there is really nothing new here. You follow an exactly analogous procedure to activate Virtual-Hosts that you did to activate User Directory modules. We create symbolic links within the directory /etc/apache2/sites-enabled to the sites in the "sites-available" directory.
me@myhost$ cd /etc/apache2/sites-enabled
me@myhost$ sudo ln -s ../sites-available/com com
me@myhost$ sudo ln -s ../sites-available/farmdens farmdens
me@myhost$ sudo /etc/init.d/apache2 restart
Test Step 3: Okay, by now I'm assuming you actually have some kind of a website you are working with and that the contents of it are within a directory, like "newcom", in your public_html folder. Open up a browser and try the address "http://farmdens". Apache should serve up the index.html file in that directory, or even the index.php file if you have PHP installed correctly. Note: If you don't see the file php5.conf in /etc/apache2/mods-enabled, then you don't have php installed correctly. The next step is for people using more than one computer on their LAN for development.


