HAProxy 설치

카테고리 없음 2015. 4. 29. 16:02

HAProxy

haproxy는 오픈 소스 로드 벨런서로서 손쉽게 서비스 이중화가 가능하도록 합니다.

설치 환경

CentOS release 6.4 (Final)
haproxy-1.5.2

다운로드 및 압축 해제

먼저 haproxy의 컴파일에 필요한 모듈을 설치합니다.
$ yum install wget gcc gcc-c++ autoconf automake make openssl openssl-devel pcre-devel zlib

haproxy를 다운로드
$ wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.2.tar.gz

압축을 해제하고 소스 디렉도리로 이동.
$ tar zxvf haproxy-1.5.2.tar.gz
$ cd haproxy-1.5.2

컴파일및 설치.
README파일에 예제가 상세하게 기술 되어 있니 참고하여 옵션을 설정합니다.
$ make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1
$ make install

> uname -a   //현재 OS의 버전 확인.  
Linux lvm01 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
make install를 실행하면 아래와 같이 설치 위치가 출력됨.
install -d /usr/local/sbin
install haproxy /usr/local/sbin
install haproxy-systemd-wrapper /usr/local/sbin
install -d /usr/local/share/man/man1
install -m 644 doc/haproxy.1 /usr/local/share/man/man1
install -d /usr/local/doc/haproxy
for x in configuration architecture haproxy-en haproxy-fr; do \
      install -m 644 doc/$x.txt /usr/local/doc/haproxy ; \
done

haproxy 설정

examples 폴더에 기동 스크립트와 설정 파일과 관련한 예제 파일들이 있으니 예제 파일을 이용하여 설정합니다.

$ mkdir /etc/haproxy
$ cp ./examples.cfg /etc/haproxy/haproxy.cfg
$ vi /etc/haproxy/haproxy.cfg

lobal
    log 127.0.0.1    local0
    log 127.0.0.1    local1 notice
    #log loghost    local0 info
    maxconn 4096
    chroot /usr/share/haproxy
    uid 99
    gid 99
    daemon
    #debug
    #quiet

defaults
    log    global
    mode    http
    option    httplog
    option    dontlognull
    option    forwardfor
    retries    3
    maxconn    2000
    option redispatch
    timeout connect      5000
    timeout client      50000
    timeout server      50000

listen    appli1-rewrite
    bind   *:80
    cookie    SERVERID rewrite
    cookie  JSESSIONID prefix
    balance    roundrobin
    server    webserver1 172.16.120.172:80 cookie webserver1 check inter 2000 rise 2 fall 5
    server    webserver2 172.16.120.173:80 cookie webserver2 check inter 2000 rise 2 fall 5

listen stats :4997
    mode http
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth admin:pwd

예제 디렉토리에서 기동 스크립트 복사
$ cp examples/haproxy.init /etc/init.d/haproxy

/etc/init.d/haproxy start     : 시작
/etc/init.d/haproxy stop      : 정지
/etc/init.d/haproxy restart   : 재기동

위와 같이 설정하여도 로그 파일이 출력되지 않음.
로그 파일을 출력하기 위해서는 rsyslog를 설치하여 기동해야함.
※ rsyslog : 중앙 집중형 원격 시스템에 로깅
rsyslog설치
$ yum install rsyslog

rsyslog설정 파일 백업 후 설정
$ vi /etc/rsyslog.d/haproxy.conf

$ModLoad imudp
$UDPServerRun 514
$template Haproxy, "%msg%\n"
local0.=info -/var/log/haproxy.log;Haproxy
local1.notice -/var/log/haproxy-status.log;Haproxy
local0.* ~

rsyslog의 설정후 rsyslog와 haproxy를 재기동 하면 로그가 rsyslog에 설정한 위치에 기록되는 것을 확인 할 수 있다.
$ /etc/init.d/rsyslog restart
$ /etc/init.d/haproxy restart

테스트용 webserver설치

테스트 용으로 haproxy에서 로드 밸런싱 설정한 두개의 서버에 apache를 설치한다.
$ yum install httpd httpd-devel openssl openssl-devel gcc gcc-c++ pcre-devel zlib

테스트용 파일 생성 후 httpd 시작.
$ echo hostname > /var/www/html/server.html
$ /etc/init.d/httpd start

haproxy 확인

브라우저로 haproxy 서버의 아이피의 server.html파일을 요청하면 설정대로 두개의 서버로 밸런싱 되어 페이지가 표시되는 것을 확인 할 수 있다.
http://haproxy서버/server.html

그러나,
테스트용 웹서버에서 httpd의 액세스 로그를 확인하면 클라이언트의 야이피가 아닌 haproxy서버의 아이가 출력됨.
httpd 액세스 로그에 haproxy가 아닌 클라이언트의 ip가 출력되도록 설정 방법.
위의 haproxy 설정에서 이미 클라이언트 정보를 전달하도록 되어 있습니다.

    option    forwardfor

방법 1.

header의 X-Forwarded-For 를 출력하도록 로그 포멧을 변경하면 된다.
웹서버의 LogFormat에서 %h -> %{X-Forwarded-For}i로 수정.
$ vi /etc/httpd/conf/httpd.conf

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

방법 2.

웹서버에 mod_rpaf 모듈을 설치해서 애플리케이션 서버가 HTTP 헤더에서 클라이언트 IP 주소를 조회하면 실제 클라이언트 IP 주소가 반환되도록 함.

$ wget http://www.stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
$ tar zxvf mod_rpaf-0.6.tar.gz
$ cd mod_rpaf-0.6
$ apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
$ vi /etc/httpd/conf/httpd.conf

LoadModule rpaf_module modules/mod_rpaf-2.0.so

RPAFenable On
RPAFsethostname On
RPAFproxy_ips  {haproxy서버 아이피}
## 여러 아이피를 지정할 경우 스페이스 후에 연속하여 기술
## RPAFproxy_ips 127.0.0.1 xxx.xxx.xxx.xxx

참고

소프트웨어 로드 밸런서 실제 사용할 때 1 vCPU + 1G 메모리로 약 10k~100k HTTP request/sec 처리.
ulimit, conntrack, … 등의 설정이 필요.
HAProxy 의 stats socket 정보 확인하여 적절히 수정
Posted by dewnine
,