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