Install HAProxy in Ubuntu 14.04 or 12.04
#!/usr/bin/env bash
#
# Install HAProxy
# Script works on Ubuntu 12.04 and 14.04 only
set -e
set -u
set -o pipefail
# These settings are for Ubuntu 12.04 only, where we compile from source
export HAPROXY_VERSION=1.5.3
export HAPROXY_CPU=generic
# Figure out which version of Ubuntu we have
export UBUNTU_VERSION=`cat /etc/issue | awk '{print $2}' | awk -F '.' '{print $1$2}'`
# on Ubuntu 14.04 LTS installs from backports
function install1404 {
export DEBIAN_FRONTEND=noninteractive
aptitude update
aptitude -y -q -t trusty-backports install haproxy
exit 0
}
# on Ubuntu 12.04 LTS installs from source
function install1204 {
# Download the compilers and prerequisite -dev packages
export DEBIAN_FRONTEND=noninteractive
aptitude update
aptitude -q -y install build-essential libssl-dev libpcre3-dev zlib1g-dev virt-what
# If we are running on bare metal and not in a virtual environment, the compile with
# CPU-native features.
export IS_VIRTUALIZED=`virt-what`
if [ "${IS_VIRTUALIZED}" = "" ]; then
export HAPROXY_CPU=native
fi
# Download the source code
cd /usr/src
curl http://www.haproxy.org/download/1.5/src/haproxy-${HAPROXY_VERSION}.tar.gz | tar zx
cd haproxy-${HAPROXY_VERSION}
# Compile and install
make TARGET=linux2628 CPU=${HAPROXY_CPU} USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1
make install PREFIX=/usr
# Test for haproxy user and create it if needed. Chroot it and prevent it from
# getting shell access
id -u haproxy &>/dev/null || useradd -d /var/lib/haproxy -s /bin/false haproxy
# Set up the default haproxy config files
mkdir -p /etc/haproxy/errors
cp examples/errorfiles/* /etc/haproxy/errors
cat > /etc/haproxy/haproxy.cfg <<EOF
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL).
ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
EOF
# Add the /etc/default script
cat > /etc/default/haproxy <<EOF
# Defaults file for HAProxy
#
# This is sourced by both, the initscript and the systemd unit file, so do not
# treat it as a shell script fragment.
ENABLED=1
# Change the config file location if needed
#CONFIG="/etc/haproxy/haproxy.cfg"
# Add extra flags here, see haproxy(1) for a few options
#EXTRAOPTS="-de -m 16"
EOF
# Add the default init.d script
cat > /etc/init.d/haproxy <<EOF
#!/bin/sh
### BEGIN INIT INFO
# Provides: haproxy
# Required-Start: \$local_fs \$network \$remote_fs \$syslog
# Required-Stop: \$local_fs \$remote_fs \$syslog
# 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
PIDFILE=/var/run/haproxy.pid
CONFIG=/etc/haproxy/haproxy.cfg
HAPROXY=/usr/sbin/haproxy
RUNDIR=/run/haproxy
EXTRAOPTS=
test -x \$HAPROXY || exit 0
if [ -e /etc/default/haproxy ]; then
. /etc/default/haproxy
fi
test -f "\$CONFIG" || exit 0
[ -f /etc/default/rcS ] && . /etc/default/rcS
. /lib/lsb/init-functions
check_haproxy_config()
{
\$HAPROXY -c -f "\$CONFIG" >/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
for pid in \$(cat \$PIDFILE) ; do
/bin/kill \$pid || return 4
done
rm -f \$PIDFILE
return 0
}
haproxy_reload()
{
check_haproxy_config
\$HAPROXY -f "\$CONFIG" -p \$PIDFILE -D \$EXTRAOPTS -sf \$(cat \$PIDFILE) \\
|| 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" "haproxy"
haproxy_start
ret=\$?
case "\$ret" in
0)
log_end_msg 0
;;
1)
log_end_msg 1
echo "pid file '\$PIDFILE' found, haproxy not started."
;;
2)
log_end_msg 1
;;
esac
exit \$ret
;;
stop)
log_daemon_msg "Stopping haproxy" "haproxy"
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" "haproxy"
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" "haproxy"
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 "haproxy is running."
;;
1)
echo "haproxy dead, but \$PIDFILE exists."
;;
*)
echo "haproxy not running."
;;
esac
exit \$ret
;;
*)
echo "Usage: /etc/init.d/haproxy {start|stop|reload|restart|status}"
exit 2
;;
esac
:
EOF
chmod +x /etc/init.d/haproxy
# Make a chroot for haproxy, add syslog config to make log socket in said chroot
mkdir -p /var/lib/haproxy/dev
cat > /etc/rsyslog.d/haproxy.conf <<EOF
# Create an additional socket in haproxy's chroot in order to allow logging via
# /dev/log to chroot'ed HAProxy processes
\$AddUnixListenSocket /var/lib/haproxy/dev/log
# Send HAProxy messages to a dedicated logfile
if \$programname startswith 'haproxy' then /var/log/haproxy.log
&~
EOF
# And rotate the logs so it doesn't overfill
cat > /etc/logrotate.d/haproxy <<EOF
/var/log/haproxy.log {
daily
rotate 52
missingok
notifempty
compress
delaycompress
postrotate
invoke-rc.d rsyslog rotate >/dev/null 2>&1 || true
endscript
}
EOF
# Start on reboot
update-rc.d haproxy defaults
service haproxy start
# Clean up source
cd ~
rm -rf /usr/src/haproxy-${HAPROXY_VERSION}
exit 0
}
# Actually execute the installations
if [ "${UBUNTU_VERSION}" = "1404" ]; then
install1404
fi
if [ "${UBUNTU_VERSION}" = "1204" ]; then
install1204
fi
echo This script supports Ubuntu 12.04 or 14.04 only.
exit 1