Table of Contents

haproxy

balancer load balancer high availability reverse proxy

http://code.google.com/p/haproxy-docs/wiki/source

Instalacion

Paquete debian

sudo aptitude update; sudo aptitude install haproxy

Fuentes

Importante para obtener soporte SSL

1. (Opcional) Instalar dependencias:

sudo aptitude update; sudo aptitude install build-essential libpcre3-dev libssl-dev

2. Descargar:

cd /usr/local; sudo wget -c --tries=0 http://haproxy.1wt.eu/download/1.5/src/devel/haproxy-1.5-dev15.tar.gz

3. Descomprimir

sudo tar xvfz haproxy-1.5-dev15.tar.gz; sudo ln -s haproxy-1.5-dev15 haproxy

4. Compilar:

cd /usr/local/haproxy; make TARGET=linux2628 USE_STATIC_PCRE=1 USE_OPENSSL=1 
sudo make install

Config

http://haproxy.1wt.eu/download/1.4/doc/configuration.txt

En este ejemplo:

| 10.0.0.15 | Balanceador de carga (haproxy) | |
| 10.0.0.4 | Servidor web 1 | Escucha en TCP 666 |
| 10.0.0.5 | Servidor web 2 | Escucha en TCP 666 |
sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.old
sudo vim /etc/haproxy/haproxy.cfg
global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        #chroot /usr/share/haproxy
        user haproxy
        group haproxy
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  dontlognull
        retries 3
        option redispatch
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen webfarm 10.0.0.15:80
        mode http
        balance roundrobin
        cookie SERVERID insert indirect
        option httpchk HEAD /index.html HTTP/1.0
        option  httplog
        server webA 10.0.0.4:80 cookie A check
        server webA 10.0.0.5:80 cookie B check

listen mysql balancer.dev.jj.com:3306
        mode tcp
        balance roundrobin
	timeout connect 50000ms
	timeout client 500000ms
	timeout server 500000ms
	# Requires 'usuario' to be granted on mysql backend
	option mysql-check usuario
	log global
	server mysql-1.dev.jj.com mysql-2.dev.jj.com:3306
	server mysql-2.dev.jj.com mysql-3.dev.jj.com:3306

listen test 10.0.0.15:666
        mode tcp
        balance roundrobin
        server testA 10.0.0.4:666
        server testB 10.0.0.5:666

Ejemplo TCP (da un warning si mantenemos

Servicio

sudo /etc/init.d/haproxy restart

Probar:

wget -O - http://10.0.0.15

Logging

http://kevin.vanzonneveld.net/techblog/article/haproxy_logging/

1. Crear una entrada en rsyslog para haproxy

sudo vim /etc/rsyslog.d/haproxy.conf

Con el siguiente contenido:

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1
 
# ..and in any case, put these two in /etc/rsyslog.d/haproxy.conf:
local1.* -/var/log/haproxy_1.log

& ~ 
# & ~ means not to put what matched in the above line anywhere else for the rest of the rules
# http://serverfault.com/questions/214312/how-to-keep-haproxy-log-messages-out-of-var-log-syslog

2. Reiniciar rsyslogd:

sudo /etc/init.d/rsyslog restart

3. Editar:

sudo vim /etc/haproxy/haproxy.cfg

Y dejar la siguiente linea dentro de la seccion 'global':

global
        log             127.0.0.1       local1 debug

4. Reiniciar haproxy y ver el log:

sudo /etc/init.d/haproxy restart
sudo tail -F /var/log/haproxy_1.log

5. (Opcional) rotar logs:

/etc/logrotate.d/haproxy

/var/log/haproxy*.log
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        reload rsyslog >/dev/null 2>&1 || true
    endscript
}

HTTP + Apache logging IP cliente

1. En el balanceador de carga (haproxy) anyadir la directiva 'option forwardfor':

/etc/haproxy/haproxy.cfg

...
listen www balancer.dev.jj.com:8000
        mode http
        balance roundrobin
        server www-1.dev.jj.com www-1.dev.jj.com:80
        server www-2.dev.jj.com www-2.dev.jj.com:80
        option httplog
        option logasap
        option forwardfor
        log global
...

2. En el backend (www-1.dev.jj.com, en este caso Apache):

/etc/apache2/apache2.conf

...
LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
...

Estadisticas

1. Habilitar estadisticas. TODO: revisar config y hacer lo mismo a traves de peticiones HTTP en lugar de socket

sudo vim /etc/haproxy/haproxy.cfg

Y anyadir/editar la siguiente linea:

global
        stats socket /tmp/haproxy_stats level admin

2. Reiniciar haproxy

sudo /etc/init.d/haproxy restart

3. Instalar socat

sudo aptitude update; sudo aptitude install socat

4. Convertirse en root y probar comandos:

clear;echo "show stat" | socat unix-connect:/tmp/haproxy_stats stdio

Listado completo de comandos en la seccion '9.2. Unix Socket commands' de http://haproxy.1wt.eu/download/1.4/doc/configuration.txt

Deshabilitar/habilitar un nodo

Requiere tener las estadisticas habilitadas y ser root.

Deshabilitar:

clear;echo "disable server mysql/mysql-3.dev.jj.com" | socat unix-connect:/tmp/haproxy_stats stdio

Habilitar:

clear;echo "enable server mysql/mysql-3.dev.jj.com" | socat unix-connect:/tmp/haproxy_stats stdio