Hosting Multiple Domains on a VirtualBox VM

Let's say you have a production server configured to serve two domains: thirld.com and example.com. For testing, you also have a local virtual machine serving these domains. How can you visit these domains as served by your local VM?

The first step is to make sure your host machine can talk to the VM. By default, VirtualBox VMs are set up with NAT networking, which means that the VM can access the Internet, but the host can't access the VM, since it has no way to address it. To fix this:

  1. Go to VirtualBox settings (the global ones, not the VM's settings), and create a host-only network vboxnet0. Make sure it has DHCP enabled.
  2. Go to your VM's settings and add vboxnet0 as a second, host-only network adapter.
  3. In your VM, add the following to /etc/network/interfaces:

    auto eth1
    iface eth1 inet dhcp
    

    Then start the interface with ifup eth1. The VM will get an IP address like 192.168.56.101, while the host has an IP address like 192.168.56.1. Use ifconfig to figure these out.

At this point, you should verify that the host can ping the VM, and the VM can still access the Internet. (This is why we kept the first network adapter as NAT; otherwise the VM couldn't access the Internet.)

The final step is to fool your host into believing that your domains actually live on the VM. On the host machine, add the following to /etc/hosts:

192.168.56.101 thirld.com example.com

Now load those domains in your browser. They will hit the VM instead of the production server. Congrats, you have a way to test your websites locally before pushing them to production. The main benefit of this approach is that your VM and your production server can have exactly the same configuration, so you don't need to keep separate configs for production and testing.

(Note that if you loaded 192.168.56.101 in your browser directly, you'd only be able to see one of the domains, and not the other. Also, if your website uses absolute URLs, various resources such as CSS files would be loaded from the production server rather than your VM. This is why the /etc/hosts trick is necessary.)