Simple local web development with Apache and Dnsmasq
When you sit down and start work on a new project, what hoops do you have to jump through before you get your app running in your browser? There are more than likely always going to be two; creating a spoof domain that you create in /etc/hosts
so that you can access your app, and then a virtual host in Apache to make your files accessible. And it sucks having to do this each time. Don’t you wish you could just get on with the project as soon as you think of it? Read on.
This was all inspired by Pow, a zero-configuration rack server created by 37signals, that allows Rails developers to do exactly that. By following convention over configuration, this can all be easily achieved. If you’re happy with accessing your apps via a spoof domain ending in .dev
, then follow these steps.
Requirements
I’m assuming that you’ve got Homebrew installed, and that you’re using the built-in version of Apache on Mac OS X 10.6 Snow Leopard. However, these instructions should work fine on Linux too.
Dnsmasq
Dnsmasq is a simple to install and setup mini DNS server. We’ll use it to setup a wildcard record of anything .dev
to point to your local machine.
brew install dnsmasq
Follow the instructions after install about copying the configuration file to the expected place in /usr/local/etc/dnsmasq
, but don’t copy the launchd
settings yet. First of all edit /usr/local/etc/dnsmasq
and add the following at the very bottom:
address=/dev/127.0.0.1
listen-address=127.0.0.1
Save. Now copy the launchd
settings across. Dnsmasq should now be running. You now need to tell your system to use it as a DNS server.
Open up System Preferences and go to your Network settings and the DNS servers. Add 127.0.0.1
to the top of the list, and then add whatever your normal internet facing DNS servers are beneath. I use OpenDNS. My DNS server list then looks like:
- 127.0.0.1
- 208.67.222.222
- 208.67.220.220
Apply changes. Now open the Terminal and run a ping on anything ending with a .dev
:
ping test.dev
It should start pinging your machine, 127.0.0.1
- if it does, all is good.
Now we can move onto configuring Apache for the last time.
Apache
Edit the following file, substituting yourusername
with whatever your system username is:
sudo nano /etc/apache2/users/yourusername.conf
And then make it look like the following, again replacing yourusername
:
NameVirtualHost *:80
<Directory "/Users/yourusername/Sites/">
Options Indexes MultiViews FollowSymLinks Includes
AllowOverride All
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:80>
UseCanonicalName off
VirtualDocumentRoot /Users/yourusername/Sites/%0/public
</VirtualHost>
Save. And then run sudo apachectl graceful
. This will restart Apache. In the above configuration, we’re using Apache’s mod_vhost_alias module to dynamically configure virtual hosts and document roots on the fly.
Testing it all works
mkdir -p ~/Sites/test.dev/public
echo "test.dev" > ~/Sites/test.dev/public/index.html
Now visit http://test.dev/ in your web browser. Hopefully you should see test.dev
- if so congratulations; you’re going to save so much time in the future now.