ha-proxy install procedure * goals: 1. Install and perform a basic configuration of ha-proxy. 2. Configure two additional webserver instances on alternate ports in apache. 3. Demonstrate load-balanced-http connections between them. 4. Log X-Forwarded-For. 4. Bonus: use a cookie to pin a requesting host to one server or another. * Installation: # cd /usr/ports/net/haproxy # make accept defaults. accept defaults with pcre # make install * configuration: # vi /etc/rc.conf add the line: haproxy_enable="YES" at the end of the file. # cd /usr/local/etc/ vi haproxy.conf add the following text global maxconn 4096 pidfile /var/run/haproxy.pid daemon defaults mode http retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen LOADBALANCER myipaddress:8080 mode http balance roundrobin option httpclose option forwardfor stats enable stats auth myuser:mypass server WEB1 127.0.0.1:8081 server WEB2 127.0.0.1:8082 replace myipaddress with the ipaddress of your vm save and exit * start and verify operation Verify that you can start the ha-proxy process # /usr/local/etc/rc.d/haproxy start # /usr/local/etc/rc.d/haproxy status and that it's listening on the correct port # netstat -a |grep 8080 * modify apache # cd /usr/local/etc/apache22/Includes # vi lb-vhosts.conf Add the following text listen 8081 listen 8082 DocumentRoot /usr/local/www/apache22/data/1 ServerName web1.vmXX.sse.ws.afnog.org Order deny,allow Allow from all DocumentRoot /usr/local/www/apache22/data/2 ServerName web2.vmXX.sse.ws.afnog.org Order deny,allow Allow from all change the vmXX to the number of your vm. save and close We need to create the directories specified in the above configuration for document root and also we're going to put a zero length file in each directory in order to be able to tell each server appart # mkdir /usr/local/www/apache22/data/1 # mkdir /usr/local/www/apache22/data/2 # touch /usr/local/www/apache22/data/1/1 # touch /usr/local/www/apache22/data/2/2 Test apache configuration sanity # apachectl -t If that works without fatal errors restart apache with the new configuration. # apachectl restart now see how many listening servers are available # netstat -a |grep 808 test the two webservers # curl localhost:8081 # curl localhost:8082 * testing the load balancer If both of those work try the following several times # curl /theipofyourvm:8080 replace theipofyourvm with the ip of your vm what happens? If it alternates between showing the index for the directory on web1 and the directory on web2 then you have a load balancer. now try hitting the ip and port 8080 of your virtual machine with a web-browser. Does it work? * Statistics To get statistics from the haproxy in realtime: point your browser at: http://theipofyourvm:8080/haproxy?stats Replacing theipofyourvm with the ip address of your virtual machine. remember that when we created the haproxy configuration that we set the auth credentials to myuser:mypass so lets use those. * Apache not logging x-forwarded-for If we tail the apache log file: tail -f /var/log/httpd-access.log we'll realize that the source ip for all requests has become 127.0.0.1 We can alter the apache log format to log x-forwarded-for as well as the source address. # vi /usr/local/etc/apache22/httpd.conf look for the line: LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" com bined change it to: LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" com bined test your apache configuration apachectl -t if it works restart apache apachectl restart now your apache server logs the X-Forwarded-For header. * handing the client a cookie If you set a cookie you can use the cookie to pin subsequent connections to the same server, if the webserver is running an application that is stateful (like a webmail client for example) this is highly useful. # cd /usr/local/etc/ # vi haproxy.conf global maxconn 4096 pidfile /var/run/haproxy.pid daemon defaults mode http retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 listen LOADBALANCER 192.168.191.131:8080 mode http balance roundrobin option httpclose option forwardfor stats enable stats auth myuser:mypass cookie LOADBALANCER insert server WEB1 127.0.0.1:8081 cookie LOADBALANCER_01 check server WEB2 127.0.0.1:8082 cookie LOADBALANCER_02 check save and exit /usr/local/etc/rc.d/haproxy restart # curl /theipofyourvm:8080 nothing has changed right? do: # curl -v /theipofyourvm:8080 can you see the cookie? ok try it with your web-browser. Bibliography: Derived in part from: http://www.softwareprojects.com/resources/programming/t-how-to-install-and-configure-haproxy-as-an-http-loa-1752.html ha-proxy homepage: http://haproxy.1wt.eu/ ha-proxy configuration guide http://cbonte.github.com/haproxy-dconv/configuration-1.5.html#2.1