Guía para instalar la versión de HAProxy 1.6.9, última estable hasta el momento, en Ubuntu 16.10
Instalando HAProxy del repositorio de paquetes de Ubuntu 16.10 conseguiremos tener instalada la versión 1.6.8.
Para tener la última estable compilaremos HAProxy del código fuente
Instalando dependencias
Primero tenemos que actualizar el repositorio de paquetes e instalar los paquetes necesarios para la instalación.
A las dependencias añadimos la librería libpcre que es recomendada en la instalación de HAProxy por tener mejor rendimiento que otras librerías.
apt-get update apt-get install -y wget build-essential libpcre3-dev
Instalando de código fuente
Accedemos al directorio /opt
y descargamos el código fuente:
cd /opt && wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.9.tar.gz
Descomprimimos el archivo descargado:
cd /opt && tar xvzf haproxy-1.6.9.tar.gz && rm haproxy-1.6.9.tar.gz
Dentro del directorio que hemos descomprimido, compilamos el código.
Escogemos para la variable TARGET en la compilación, que depende de la version del Núcleo de Linux el valor linux2628 ya que Ubuntu 16.10 se distribuye con un núcleo superior a 2.6.28.
cd /opt/haproxy-1.6.9 && \ make TARGET=linux2628 USE_PCRE=1 CPU=native USE_LINUX_SPLICE=1 && \ make install
Ya tenemos instalado HAProxy en nuestro servidor Ubuntu 16.10!
Comprobando la instalación
Para comprobar que HAProxy se ha instalado correctamente podemos ejecutar el siguiente comando que a su salida nos mostrará la versión instalada:
haproxy -v
Configurando HAProxy
Para ejecutar el proceso de HAProxy no vamos a usar el usuario root, para evitar problemas de seguridad. Creamos un usuario para ejecutar el proceso:
useradd haproxy
Creamos el archivo de configuración en /etc/init.d/haproxy
:
touch /etc/init.d/haproxy chmod +x /etc/init.d/haproxy
Ahora con vuestro editor favorito (vi, vim, nano, etc…) editamos el archivo de inicio:
#!/bin/sh ### BEGIN INIT INFO # Provides: haproxy # Required-Start: $local_fs $network $remote_fs $syslog $named # Required-Stop: $local_fs $remote_fs $syslog $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: fast and reliable load balancing reverse proxy # Description: This file should be used to start and stop haproxy. ### END INIT INFO # Author: Arnaud Cornet <acornet@debian.org> PATH=/sbin:/usr/sbin:/bin:/usr/bin BASENAME=haproxy PIDFILE=/var/run/${BASENAME}.pid CONFIG=/etc/${BASENAME}/${BASENAME}.cfg HAPROXY=/usr/local/sbin/haproxy RUNDIR=/run/${BASENAME} EXTRAOPTS= test -x $HAPROXY || exit 0 if [ -e /etc/default/${BASENAME} ]; then . /etc/default/${BASENAME} fi test -f "$CONFIG" || exit 0 [ -f /etc/default/rcS ] && . /etc/default/rcS . /lib/lsb/init-functions check_haproxy_config() { $HAPROXY -c -f "$CONFIG" $EXTRAOPTS >/dev/null if [ $? -eq 1 ]; then log_end_msg 1 exit 1 fi } haproxy_start() { [ -d "$RUNDIR" ] || mkdir "$RUNDIR" chown haproxy:haproxy "$RUNDIR" chmod 2775 "$RUNDIR" check_haproxy_config start-stop-daemon --quiet --oknodo --start --pidfile "$PIDFILE" \ --exec $HAPROXY -- -f "$CONFIG" -D -p "$PIDFILE" \ $EXTRAOPTS || return 2 return 0 } haproxy_stop() { if [ ! -f $PIDFILE ] ; then # This is a success according to LSB return 0 fi ret=0 tmppid="$(mktemp)" # HAProxy's pidfile may contain multiple PIDs, if nbproc > 1, so loop # over each PID. Note that start-stop-daemon has a --pid option, but it # was introduced in dpkg 1.17.6, post wheezy, so we use a temporary # pidfile instead to ease backports. for pid in $(cat $PIDFILE); do echo "$pid" > "$tmppid" start-stop-daemon --quiet --oknodo --stop \ --retry 5 --pidfile "$tmppid" --exec $HAPROXY || ret=$? done rm -f "$tmppid" [ $ret -eq 0 ] && rm -f $PIDFILE return $ret } haproxy_reload() { check_haproxy_config $HAPROXY -f "$CONFIG" -p $PIDFILE -D -sf $(cat $PIDFILE) $EXTRAOPTS \ || return 2 return 0 } haproxy_status() { if [ ! -f $PIDFILE ] ; then # program not running return 3 fi for pid in $(cat $PIDFILE) ; do if ! ps --no-headers p "$pid" | grep haproxy > /dev/null ; then # program running, bogus pidfile return 1 fi done return 0 } case "$1" in start) log_daemon_msg "Starting haproxy" "${BASENAME}" haproxy_start ret=$? case "$ret" in 0) log_end_msg 0 ;; 1) log_end_msg 1 echo "pid file '$PIDFILE' found, ${BASENAME} not started." ;; 2) log_end_msg 1 ;; esac exit $ret ;; stop) log_daemon_msg "Stopping haproxy" "${BASENAME}" haproxy_stop ret=$? case "$ret" in 0|1) log_end_msg 0 ;; 2) log_end_msg 1 ;; esac exit $ret ;; reload|force-reload) log_daemon_msg "Reloading haproxy" "${BASENAME}" haproxy_reload ret=$? case "$ret" in 0|1) log_end_msg 0 ;; 2) log_end_msg 1 ;; esac exit $ret ;; restart) log_daemon_msg "Restarting haproxy" "${BASENAME}" haproxy_stop haproxy_start ret=$? case "$ret" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; 2) log_end_msg 1 ;; esac exit $ret ;; status) haproxy_status ret=$? case "$ret" in 0) echo "${BASENAME} is running." ;; 1) echo "${BASENAME} dead, but $PIDFILE exists." ;; *) echo "${BASENAME} not running." ;; esac exit $ret ;; *) echo "Usage: /etc/init.d/${BASENAME} {start|stop|reload|restart|status}" exit 2 ;; esac :
Archivos de configuración
Creamos el directorio de configuración con el archivo de configuración básico:
mkdir /etc/haproxy
Y editamos el archivo principal de configuración:
global maxconn 4096 defaults mode http timeout connect 5000ms frontend http-in bind *:80 timeout client 30000ms timeout server 30000ms option httpclose # ACL acl is_app hdr(host) -i www.someapp.local # Backends use_backend back_app if is_app backend back_app balance roundrobin option forwardfor server node1 172.17.0.1:18886 check server node2 172.17.0.1:18887 check server node3 172.17.0.1:18888 check
Podemos comprobar la validez del archivo de configuración con el comando haproxy -c -- /etc/haproxy/haproxy.cfg
.
Y arrancamos el servicio de HAProxy
service haproxy start
Con el siguiente comando podemos ver el estado actual del servicio:
service haproxy status