HAProxy
haproxy는 오픈 소스 로드 벨런서로서 손쉽게 서비스 이중화가 가능하도록 합니다.
설치 환경
CentOS release 6.4 (Final)
haproxy-1.5.2
Link
- HAProxy home page
http://www.haproxy.org/ - Configuration Manual
http://cbonte.github.io/haproxy-dconv/configuration-1.5.html
다운로드 및 압축 해제
먼저 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/Linuxmake 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 주소가 반환되도록 함.
- mod_rpaf : http://www.stderr.net/apache/rpaf
$ 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 정보 확인하여 적절히 수정