Search code examples
apacheload-balancinghaproxy

Configuring HAProxy to route traffic based on url_param


I am very new to HAProxy. I spent a few hours trying to figure out how to do it but could not get any leads. My requirement is this:

If end point of request is /special then I need to check URL_PARAM.

For example: localhost/special?id=10

Based on ID, I need to route it to one of the 3 servers. If id <=3 server1, if id > 3 and id <=6 server2 else server3.

If end point is not /special round robin between all 3 servers.

How do I achieve this 2 level balancing?


Solution

  • You can use urlp and urlp_val to extract the id. Then, use acl to match the integer:

    acl is_special     path_beg /special
    acl small_id         urlp_val(id) le 3
    acl medium_id        urlp_val(id) 4:6
    acl high_id          urlp_val(id) gt 6
    
    use_backend bck1     if is_special small_id
    use_backend bck2     if is_special medium_id
    use_backend bck3     if is_special high_id
    default_backend      bck_all
    

    Then, create 3 backends: one for each case.

    Edit:

    If you want to use regex on the query param, use urlp_reg:

    acl small_id       urlp_reg(id) ^[0-3]
    acl medium_id      urlp_reg(id) ^[4-6]
    acl high_id        urlp_reg(id) ^[7-9]
    

    Also check stick, depending on what you're trying to do.