PEN: HTTP Load Balancer

This is performed on a CentOS 6.x 64 bit machine

Install pen which is lightweight simple Load Balancing software.

It is TCP protocol based, so it’s possible to balance not only HTTP but SMTP, FTP, LDAP and so on. This example is based on the environment like follows.

Pen-LB-Capture

Configure Pen to load balance to Backend#1, Backend#2, Backend#3 web servers.

# install from EPEL
[root@dlp ~]# yum --enablerepo=epel -y install pen

Configure PEN:

[root@dlp ~]# vi /etc/pen.conf
# create new
# log file
LOGFILE=/var/log/pen.log
# statics report file
WEBFILE=/var/www/pen/webstats.html
# control port
CONTROL=127.0.0.1:10080
# max connections
MAX_CONNECTIONS=256
# sebd X-Forwarded-For header
XFORWARDEDFOR=true
# Round-Robin mode
ROUNDROBIN=true
# listenning port
PORT=80
# number of backends
BACKEND=3
# define backend servers
SERVER1=10.0.0.51:80
SERVER2=10.0.0.52:80
SERVER2=10.0.0.53:80

Create an init script

[root@dlp ~]# vi /etc/rc.d/init.d/pend
#!/bin/bash
# pend: Start/Stop Pend
# chkconfig: - 90 10
# description: Pen is a light weight simple load balancer.
# pidfile: /var/run/pen.pid
. /etc/rc.d/init.d/functions
. /etc/pen.conf
LOCKFILE="/var/lock/subsys/pen"
PID=/var/run/pen.pid
PROG=/usr/bin/pen
PROGNAME=Pend
RETVAL=0
start() {
 SERVER=`grep "^SERVER" /etc/pen.conf | cut -d= -f2`
 [ $XFORWARDEDFOR = "true" ] && SERVER="-H $SERVER"
 [ $ROUNDROBIN = "true" ] && SERVER="-r $SERVER"
 [ $SSLCERTS ] && SERVER="-E $SSLCERTS $SERVER"
echo -n $"Starting $PROGNAME: "
 daemon $PROG -w $WEBFILE -x $MAX_CONNECTIONS -p $PID -l $LOGFILE -C $CONTROL -S $BACKEND $PORT $SERVER
 RETVAL=$?
 echo
 [ $RETVAL -eq 0 ] && touch $LOCKFILE
 return $RETVAL
}
stop() {
 echo -n $"Stopping $PROGNAME: "
 killproc $PROG
 RETVAL=$?
 echo
 [ $RETVAL -eq 0 ] && rm -f $PID $LOCKFILE
 return $RETVAL
}
case "$1" in
 start)
 start
 ;;
 stop)
 stop
 ;;
 status)
 status -p "$PID" -l $PROG $PROGNAME
 ;;
 restart)
 stop
 start
 ;;
 *)
 echo $"Usage: $0 {start|stop|status|restart}"
 exit 1
esac
exit $?
[root@dlp ~]# chmod 755 /etc/rc.d/init.d/pend
[root@dlp ~]# /etc/rc.d/init.d/pend start
Starting Pend: [ OK ]
[root@dlp ~]# chkconfig --add pend
[root@dlp ~]# chkconfig pend on

Configure httpd on backend servers to record logs of X-Forwarded-For.

[root@www ~]# vi /etc/httpd/conf/httpd.conf
# line 497: change
LogFormat "\"%{X-Forwarded-For}i\"
%l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[root@www ~]# /etc/rc.d/init.d/httpd restart
Share

Leave a Reply