====== 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