Table of Contents
haproxy
balancer load balancer high availability reverse proxy
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