31Oct

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

Enlaces de interés

http://www.haproxy.org/

Leave a comment