HAProxy Quick Setup

August 29, 2009

HAProxy ist ein superschlanker, dennoch Featurereicher, high performance Proxy und Load Balancer. Wie schnell und leicht sich dieser aufsetzen lässt, beschreibe ich hier.

HAProxy Installation

Ich führe die Installation von HAProxy 1.3.20 auf einer Debian Maschine durch. Für HAProxy wird die libpcre Bibliothek für schnelles Parsen von regulären Ausdrücken empfohlen. Die Installiere ich vorher. GCC, make etc. muss ebenfalls installiert sein.

# apt-get install libpcre3-dev
# wget http://haproxy.1wt.eu/download/1.3/src/haproxy-1.3.20.tar.gz
# tar xzf haproxy-1.3.20.tar.gz
# cd haproxy-1.3.20/
# make USE_PCRE=1 TARGET=linux26 ARCH=i686 && make install

HAProxy soll aus Sicherheitsgründen unter einem eigenen Benutzer laufen.

# useradd -d /opt/haproxy -m haproxy

Jetzt noch ein init-Script, damit es beim booten startet. In /etc/init.d/haproxy speichern:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          haproxy
# Required-Start:    apache2 lighttpd tomcat tomcat6 tomcat5
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start and stop haproxy
# Description:       start and stop haproxy
### END INIT INFO

BINARYPATH=/usr/local/sbin
BINARY=haproxy
CONF=/etc/haproxy/haproxy.conf

case "$1" in
  start)
    $BINARYPATH/$BINARY -f $CONF
    ;;
  stop)
    # hier evtl auf pid umstellen
    killall $BINARY
    ;;
esac

exit 0

Aktivieren:

# chmod +x /etc/init.d/haproxy
# update-rc.d haproxy defaults

HAProxy ist nun einsatzbereit.

Konfiguration

In HAProxy definiert man Backends, die Server selbst, wie Lighttpd, Tomcat etc, und Frontends, die Verbindungen von Clients annehmen und diese an die Backends verteilen.

Ich habe meine Konfiguration unter /etc/haproxy/haproxy.conf abgelegt. Hier ein Beispiel mit einem Apache (lokal auf Port 8081) und einem Tomcat (lokal auf Port 8080) Server, die beide über den Port 80 bedient werden sollen. Auch lange Ajax Verbindungen wie Comet sind damit kein Problem (die Timeouts entsprechend anpassen)!

global
 daemon
 maxconn 4000
 user haproxy
 group haproxy
 log 127.0.0.1 local0 notice

backend apache
 mode http
 timeout connect 10s
 timeout server 30s
 balance roundrobin
 # bei mir nur ein server am laufen, hier können mehrere eingetragen werden
 server apache1 127.0.0.1:8081 weight 1 maxconn 512

backend tomcat
 mode http
 timeout connect 5s
 timeout server 5m # tomcat hält comet verbindungen, die länger leben
 balance roundrobin
 server tomcat1 127.0.0.1:8080 weight 1 maxconn 1000

frontend http_proxy
 bind XX.XX.XX.XX:80 # hier die öffentliche IP
 mode http
 timeout client 5m
 option forwardfor
 default_backend apache
 # alle verbindungen zur domain comet.dummy sollen an tomcat gehen
 acl is_cometapp hdr_dom(host) -i comet.dummy
 use_backend tomcat if is_cometapp

Das wars! HAProxy mit /etc/init.d/haproxy start starten. Beim nächsten Reboot müsste es von alleine hochkommen.

Weitere Links: