# # This configuration can be used as an example of how URL-switching may be # implemented with current haproxy versions. # # Right now (version 1.2), haproxy can only select a server based on the cookie # provided by the client. While this may sound limitated, it is yet possible to # combine this feature to rewrites to provide full URL-switching capabilities. # # For this, we have to chain 3 levels : # - front-end : will match the expected URIs and assign a cookie accordingly ; # it uses regexps and could match on anything else (Host:, # cookies, ...) # - switch : will select a back-end depending on the cookie above # - back-ends : will perform the load balancing between multiple servers for # the same group. Note that this level can be omitted if there # is only one server for each backend. # # Logging is performed at the lower level (back-ends) so that local server # problems can be identified quickly with the timers. The client's IP is # propagated in the X-Forwarded-For: header. # global daemon maxconn 6000 # warning: this has to be 3 times the expected value! log 192.168.0.1 local0 defaults mode http balance roundrobin option dontlognull option httpclose retries 1 redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 # # This is the instance the client connects to. # listen frontend 10.20.30.40:80 option forwardfor # add 'X-Forwarded-For: IP' # remove an eventual 'backend' cookie the client might have sent reqidel ^Cookie:\ backend= # add cookie 'backend=2' for any HTTP method followed by # '/img' only or '/img/' followed by anything. reqirep ^[^:\ ]*\ /img[/\ ].* \0\nCookie:\ backend=2 # add cookie 'backend=3' for any HTTP method followed by # '/home' only or '/home/' followed by anything. reqirep ^[^:\ ]*\ /home[/\ ].* \0\nCookie:\ backend=3 # send everything to next stage server switch 127.0.0.2:8000 # # This instance is only seen by the 'frontend' instance above. It receives all # of its traffic. # listen switch 127.0.0.2:8000 # cookie name 'backend' inserted by the 'frontend' instance above cookie backend # default server 'backend1' gets the default traffic. server backend1 127.0.0.3:8001 # those servers get traffic only if their cookie is present because # they are tagged 'backup'. server backend2 127.0.0.3:8002 cookie 2 backup server backend3 127.0.0.3:8003 cookie 3 backup # # Backend 1 for dynamic contents. # It is made of 4 apache servers which we can test thanks to a CGI script. # listen backend1 127.0.0.3:8001 log global option httplog capture request header X-Forwarded-For len 15 option httpchk /cgi-bin/testhost.pl server apache1 192.168.1.1:80 maxconn 100 check inter 2000 fall 3 server apache2 192.168.1.2:80 maxconn 100 check inter 2000 fall 3 server apache3 192.168.1.3:80 maxconn 100 check inter 2000 fall 3 server apache4 192.168.1.4:80 maxconn 100 check inter 2000 fall 3 # # backend 2 for images (/img). # It is made of 3 Tux servers which we test by requesting the /img/logo.png # file which should be present when file-systems are mounted. # listen backend2 127.0.0.3:8002 log global option httplog capture request header X-Forwarded-For len 15 option httpchk /img/logo.png server tux5 192.168.1.5:80 check inter 2000 fall 3 server tux6 192.168.1.6:80 check inter 2000 fall 3 server tux7 192.168.1.7:80 check inter 2000 fall 3 # # backend 3 for home directories (/home). These are the same machines as for # dynamic content, except that a different server is bound to another port. # We test the service by checking that the file "/home/webmaster/started" # exists. # listen backend3 127.0.0.3:8003 log global option httplog capture request header X-Forwarded-For len 15 option httpchk /home/webmaster/started server light1 192.168.1.1:8080 check inter 2000 fall 3 server light2 192.168.1.2:8080 check inter 2000 fall 3 server light3 192.168.1.3:8080 check inter 2000 fall 3 server light4 192.168.1.4:8080 check inter 2000 fall 3