How do I host multiple physical Web servers behind a single IP address?
I am running multiple web servers in my house, each of which is plugged into my router.
Server A Server B Server C
I currently can only use one server since my IP (xx.xxx.xx.xx) port 80 is pointing towards server A. However some domains point to server A, some to B, etc.
With my one IP address, how do I point to each server? For example my A(host) records all point to just my IP address.
Sorry if I sound confusing. Let me know if I am not being clear.
Each server is running Ubuntu Server 12.04.02 and is using Apache (if that helps). My router is also a Netgear and my ISP is Time Warner Cable.
41 Answer
Web sites will be recognized through the Host: header sent from the browser. But since your router isn't capable of HTTP demangling used by virtual hosting, you will need to choose one server as "endpoint" (and tell your router that address as Virtual Server / DMZ).
Then, you either configure that one machine as webserver for its domains and proxy for the others (e.g. using Apache reverse proxy), or (maybe better) you install a proxy on that one machine, and use it to multiplex requests to the other servers. Some domains might even be hosted on the same machine. nginx is suited for this kind of work, but you can also use other software (e.g. pound).
I think the second solution is better because you do not need to fiddle with web servers' configurations at all: one proxy does the proxying and several web servers do the web serving. If you need to add servers or move virtual hosts around, this architecture is easier to maintain.
+-- virtual hosts 1..9 -- server B |
router ----- machine A (nginx?) ----+-- virtual hosts 10..23- server C | +-- virtual hosts 24..99- server DThe added latency due to the request being decoded twice (once by the proxy, once by its intended recipient) is negligible, and more than offset by the acceleration provided by the proxying itself.
2