All domains have the same uri /test/* and, accordingly, need to be proxyed to different servers,
it’s clear that through path_beg, but how to make it on 3 different domains?
if i do
backend backend-front-dev
http-request replace-path /front(/)?(.) /\2
server dev-swarm-01 dev-swarm-01:3031 check maxconn 30
and
backend backend-front-stage
http-request replace-path /front(/)?(.) /\2
server stage-swarm-01 stage-swarm-01:3031 check maxconn 30
server srv-swarm-01 srv-swarm-01:3031
server srv-swarm-02 srv-swarm-02:3031
server srv-swarm-03 srv-swarm-03:3031
server srv-swarm-04 srv-swarm-04:3031
server srv-swarm-05 srv-swarm-05:3031
server srv-swarm-06 srv-swarm-06:3031
But it didn’t work for me either, I can’t find what the problem is…
This only works for one domain auth.domain.com
for dev & stage doesn’t work at the same time
acl dev_auth hdr(host) -i auth-dev.domain.com
acl stage_auth hdr(host) -i auth-stage.domain.com
acl prod_auth hdr(host) -i auth.domain.com
acl test_path path_beg -i /test
use backend backend-front-dev if dev_auth test_path
use backend backend-front-stage if stage_auth test_path
use backend backend-front-prod if prod_auth test_path
default_backend <some-default-backend>
Edit: You probably don’t want to set the request path in the backend. Modifying the request changes it between HAProxy and the server, but the client in front of HAProxy may never see it.
I got this config and it works correctly. Names in this order and without lines default_backend
acl is_auth hdr_end(host) -i auth.domain.com
acl is_auth_dev hdr_end(host) -i auth-dev.domain.com
acl is_auth_stage hdr_end(host) -i auth-stage.domain.com
acl test_path path_beg -i /test
use_backend backend-front-dev if is_auth_dev test_path
use_backend backend-front-stage if is_auth_stage test_path
use_backend backend-front-auth if is_auth test_path
use_backend auth if is_auth
use_backend auth_dev if is_auth_dev
use_backend auth_stage if is_auth_stage
backend backend-front-stage
mode http
balance roundrobin
server stage-swarm-01 stage-swarm-01:5031 check
server stage-swarm-02 stage-swarm-02:5031 check
server srv-dockerhost-stage srv-dockerhost-stage:5031 check
acl rules must go in the correct order, and the first suitable one is executed (I mean, as in any firewall, the rule above is more important), although I did not find explicit information on this, correct me if I’m wrong
Yes and no. ACLs can be declared in any order as long as they are declared before any use_backend. Once a backend is chosen, no other backend or ACL below it matters, so the use_backend order is the important one.