Souce Install HAProxy 1.8 on CentOS 7
HAProxy 1.8 소스 인스톨(컴파일) 설치 가이드
HAProxy 는 현재 가장 유명한 소프트웨어 로드발란서 중 하나입니다. L4 뿐 아니라 L7 기능까지 포함하고 있어 많은 곳에서 활용되고 있습니다. HAProxy 의 기능에 대해 설명된 블로그나 사이트는 많기 때문에 여기서는 설치 방법에 대해서만 다루도록 하겠습니다.
이 가이드는 HAProxy 1.8 버전을 사용하였으며 공식 사이트인 HAProxy – The Reliable, High Performance TCP/HTTP Load Balancer 및 HAProxy version 1.8.27 – Starter Guide (cbonte.github.io) 을 참조하였습니다.
의존성 패키지 설치
[root@172-19-10-106 /]# yum install -y make gcc gcc-c++ pcre-devel openssl-devel
[root@172-19-10-106 /]# cd /data/apps/dn [root@172-19-10-106 dn]# wget http://www.haproxy.org/download/1.8/src/haproxy-1.8.17.tar.gz
압축해제
[root@172-19-10-106 dn]# tar xvzf haproxy-1.8.17.tar.gz
리눅스 커널 확인
[root@172-19-10-106 dn]# uname -a Linux 172-19-10-106 3.10.0-862.3.2.el7.x86_64 #1 SMP Mon May 21 23:36:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
make시 TARGET 옵션을 주기 위해 필요한 작업이며, 커널 확인 후 README파일에 명시된 대로 지정해 주어야 한다. 아래는 haproxy에 명시된 README파일의 TARGET variable 리스트 - linux22 for Linux 2.2 - linux24 for Linux 2.4 and above (default) - linux24e for Linux 2.4 with support for a working epoll (> 0.21) - linux26 for Linux 2.6 and above - linux2628 for Linux 2.6.28, 3.x, and above (enables splice and tproxy) - solaris for Solaris 8 or 10 (others untested) - freebsd for FreeBSD 5 to 10 (others untested) - netbsd for NetBSD - osx for Mac OS/X - openbsd for OpenBSD 5.7 and above - aix51 for AIX 5.1 - aix52 for AIX 5.2 - cygwin for Cygwin - haiku for Haiku - generic for any other OS or version. - custom to manually adjust every setting
컴파일
[root@172-19-10-106 dn]# cd haproxy-1.8.17 [root@172-19-10-106 haproxy-1.8.17]# make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 [root@172-19-10-106 haproxy-1.8.17]# make PREFIX=/data/apps/src/haproxy-1.8.17 DESTDIR= install
링크생성
[root@172-19-10-106 haproxy-1.8.17]# ln -s /data/apps/src/haproxy-1.8.17 /data/apps/ln/haproxy
유저생성
[root@172-19-10-106 haproxy-1.8.17]# useradd -M -r -s /sbin/nologin haproxy
시작파일 생성
: vi /etc/init.d/haproxy
#!/bin/sh
#
# chkconfig: - 85 15
# description: HA-Proxy is a TCP/HTTP reverse proxy which is particularly suited \
# for high availability environments.
# processname: haproxy
# config: /etc/haproxy/haproxy.cfg
# pidfile: /var/run/haproxy.pid
# Script Author: Simon Matter <simon.matter@invoca.ch>
# Version: 2004060600
# Source function library.
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions
else
exit 0
fi
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# This is our service name
BASENAME=`basename $0`
if [ -L $0 ]; then
BASENAME=`find $0 -name $BASENAME -printf %l`
BASENAME=`basename $BASENAME`
fi
BIN=/data/apps/ln/haproxy/sbin/$BASENAME
CFG=/etc/$BASENAME/$BASENAME.cfg
[ -f $CFG ] || exit 1
PIDFILE=/var/run/$BASENAME.pid
LOCKFILE=/var/lock/subsys/$BASENAME
RETVAL=0
start() {
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
echo -n "Starting $BASENAME: "
daemon $BIN -D -f $CFG -p $PIDFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $LOCKFILE
return $RETVAL
}
stop() {
echo -n "Shutting down $BASENAME: "
killproc $BASENAME -USR1
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f $LOCKFILE
[ $RETVAL -eq 0 ] && rm -f $PIDFILE
return $RETVAL
}
restart() {
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
stop
start
}
reload() {
if ! [ -s $PIDFILE ]; then
return 0
fi
quiet_check
if [ $? -ne 0 ]; then
echo "Errors found in configuration file, check it with '$BASENAME check'."
return 1
fi
$BIN -D -f $CFG -p $PIDFILE -sf $(cat $PIDFILE)
}
check() {
$BIN -c -q -V -f $CFG
}
quiet_check() {
$BIN -c -q -f $CFG
}
rhstatus() {
status $BASENAME
}
condrestart() {
[ -e $LOCKFILE ] && restart || :
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
condrestart)
condrestart
;;
status)
rhstatus
;;
check)
check
;;
*)
echo $"Usage: $BASENAME {start|stop|restart|reload|condrestart|status|check}"
exit 1
esac
exit $?
시작파일 권한 변경
[root@172-19-10-106 haproxy-1.8.17]# chmod 755 /etc/init.d/haproxy
haproxy config 설정
: vi /etc/haproxy/haproxy.cfg
// 예제 샘플이므로 자세한건 위의 공식문서 링크를 참조
global
daemon
user haproxy
group haproxy
master-worker
maxconn 10240
log 10.19.10.249 local2 # syslog 서버
stats socket /var/run/haproxy.sock mode 660 level admin
stats timeout 60s
tune.ssl.default-dh-param 2048
ssl-default-bind-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:DHE-DSS-AES256-SHA:ADH-AES256-SHA:!DSS
ssl-default-bind-options no-sslv3 no-tls-tickets
ssl-default-server-ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:DHE-DSS-AES256-SHA:ADH-AES256-SHA:!DSS
ssl-default-server-options no-sslv3 no-tls-tickets
defaults
mode http
option httplog
log global
option dontlognull
option forwardfor
option http-server-close
retries 3
maxconn 10240
timeout connect 180s
timeout server 180s
timeout client 180s
timeout http-keep-alive 60s
# HAProxy 상태 확인 URI 설정
listen stats
bind :14098
stats enable
stats realm HAProxy\ Statistics
stats auth statsloginid:statsloginpassword
stats refresh 60s
stats uri /haproxy_status
frontend http-in
bind :80
mode http
option httplog
log global
option dontlognull
option forwardfor
option http-server-close
maxconn 10240
redirect prefix https://umount.net code 301 if { hdr(host) -i www.umount.net }
redirect scheme https code 301 if { hdr(host) -i umount.net } !{ ssl_fc }
frontend https-in
bind :443 ssl crt /etc/haproxy/secure/haproxy.umount.net.pem alpn h2,http/1.1
mode http
option httplog
log global
option dontlognull
option forwardfor
option http-server-close
maxconn 10240
reqadd X-Forwarded-Proto:\ https
redirect prefix https://umount.net code 301 if { hdr(host) -i www.umount.net }
acl umount.net hdr(host) -i umount.net
use_backend umount.net if umount.net
# set default backend
default_backend umount.net
backend umount.net
mode http
option forwardfor
option httpchk GET /lib/healthcheck.php # option : 헬스체크를 위함으로, 해당 경로에 파일이 있어야 함
http-check expect status 200 # option : 위 파일의 status가 200일경우 헬스체크 ok
fullconn 8192
balance roundrobin
cookie SERVERID insert indirect nocache
server web01 10.19.10.5:80 cookie web01 check inter 10s fastinter 2s rise 3 fall 3 maxconn 4096
server web02 10.19.10.6:80 cookie web02 check inter 10s fastinter 2s rise 3 fall 3 maxconn 4096
시작 등록 및 실행
[root@172-19-10-106 haproxy-1.8.17]# chkconfig haproxy on [root@172-19-10-106 haproxy-1.8.17]# service haproxy start
