What is the recommended way of using HAProxy to serve multiple sites
(a.com, b.com), each with its own unique frontend/backend
requirements? As far as I can see HAProxy does not directly support
routing to different frontends by host.
A few options come to mind:
(1) I could screw around with acls, but the rules would end up being a
bit complex and unreadable. Each site has a bunch of acls and they
would have to be and-ed with site-specific hosts, and default_backend
cannot be used. For example, instead of:
acl static path_beg /javascripts/ acl static path_beg /images/ acl static path_beg /stylesheets/
I would have to do something like:
acl site1 hdr(host) -i site1.com
acl site1_static path_beg /javascripts/ acl site1_static path_beg /images/ acl site1_static path_beg /stylesheets/
acl site2 hdr(host) -i site2.com
acl site2_static path_beg /javascripts/ acl site2_static path_beg /images/ acl site2_static path_beg /stylesheets/ use_backend site1_nginx if site1 site1_static use_backend site1_rails if site1 !site1_staticuse_backend site2_nginx if site2 site2_static use_backend site2_rails if site2 !site2_static
Ouch.
(2) Use a unique IP for each site. That works fine when HAProxy is
installed on a single box, but that configuration cannot be applied to
multiple boxes as-is; each machine needs different bind statements. I
like to store the config in a version control system and apply it to
multiple boxes simultaneous, so to accomplish this I would end up
having to preprocess the configs with scripts to get anywhere.
(3) Use separate IPs as above, but bind HAProxy to different localhost
ports (eg., localhost:8000, localhost:8001) and use some kind of
iptables trick to route the machine's external IP to HAProxy's
internal. That, too, sounds complex. I don't like non-obvious setups
that cannot be immediately understood by a single glance at the
config.
(4) Use HAProxy itself to route: First, bind the actual site frontends
to localhost:N, then have a HTTP frontend declaration that uses a
couple of acl rules to route the request to the appropriate
site-specific front end. That adds overhead, and I'm not sure what the
implications are of re-entering HAProxy like this.
#1 is the most attractive proposition at the moment, but I would love to hear about better ways in case I missed something in the documentaton.
Alexander. Received on 2008/08/28 16:18
This archive was generated by hypermail 2.2.0 : 2008/08/28 16:30 CEST