[개발] HAProxy 설치 및 기본 설정

얼마 전에 새롭게 서버를 세팅하다보니 이전에 dev 버전이었던 HAProxy 1.6가 어느새 stable로 상태가 변경된 것을 목격했다. 1.5와 가장 다른 점은 SSL을 정식으로 지원한다는 것이다.(이전에는 SSL 설정을 하면 무조건 https로만 통신해야 했다.)

다만 Redhat 계열에서 설치를 진행하려하니 아직 yum repo에 등록이 안된건지.. 아니면 못찾은건지 모르겠지만 make install을 진행하게 되어, 나와 같이 수동 설치에 익숙하지 않은 사람들을 위해 설치 과정을 간략하게 정리했다.


HAProxy 다운로드

HAProxy의 최신 버전은 http://www.haproxy.org 에서 다운로드 받을 수 있다. 현재 1.7이 dev 버전이고 1.6.3이 stable 버전이다. 먼저 wget을 통해 이를 다운로드 받고 압축을 풀자.

> wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.3.tar.gz
> tar xzvf haproxy-1.6.3.tar.gz

HAProxy 컴파일

다음은 압축을 푼 디렉토리로 이동해 make를 진행할 것인데 여기서 주의해야할 점이 있다. make를 진행하기 전에 HAProxy의 README를 먼저 확인해보자. 중요한 부분은 make TARGET을 지정하는 부분이다. 우선 리눅스 계열만 살펴보면 다음과 같다.

- 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)

여기서 본인이 사용 중인 리눅스 커널 버전에 따라 TARGET을 지정해야 하는데 나는 2.6.32 버전을 사용하기 때문에 linux2628을 TARGET으로 지정할 것이다. 본인의 리눅스 커널 버전은 uname -a 명령으로 쉽게 확인할 수 있다.

> uname -a
Linux tamm.novalocal 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

이제 리눅스 커널 버전을 알아냈으니 컴파일을 진행해보자.

> make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1

만약 이때 오류가 난다면 HAProxy에서 사용하려고 하는 라이브러리들이 설치되어 있지 않은 것이니 없는 라이브러리들을 설치해줘야 한다. 나같은 경우에는 OpenSSL 및 PCRE 부분에서 오류가 나서 다음 명령으로 설치 / 업데이트를 진행했다.

> yum install openssl
> yum install pcre-devel

HAProxy 설치

오류가 나지 않고 모든 컴파일이 끝났다면 make install 명령을 사용해 HAProxy를 설치한다.

> make install
install -d "/usr/local/sbin"
install haproxy "/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 architecture close-options configuration cookie-options intro linux-syn-cookies lua management network-namespaces proxy-protocol; do \
install -m 644 doc/$x.txt "/usr/local/doc/haproxy" ; \
done

정상적으로 설치가 완료되었다면 HAProxy 설정 파일을 만들어줘야 한다. example 디렉토리 내의 cfg 파일을 참고하여 /etc/haproxy 디렉토리 내에 haproxy.cfg 파일을 생성해주자.

다음으로 service에 등록하기 위해 init.d 디렉토리 내에 examples/haproxy.init 파일을 복사해주고 퍼미션을 변경해줘야 한다.

> cp examples/haproxy.init /etc/init.d/haproxy
> cd /etc/init.d
> chmod 755 haproxy
> service haproxy
Usage: haproxy {start|stop|restart|reload|condrestart|status|check}

마지막으로 haproxy 파일을 /usr/sbin 디렉토리 내에 복사해줘야 한다. 이건 원래 수동 설치가 그런건지 잘 모르겠다.

> cp haproxy /usr/sbin

여기까지 잘 따라왔다면 다음 명령으로 HAProxy를 정상 기동할 수 있을 것이다.

> service haproxy start

HAProxy 설정

물론 각자의 설정이 다르겠지만 처음 설정하는 분들을 위해 내가 사용하고 있는 기본 설정을 공유한다.(필요 없을지도)

defaults 
# 기본 설정
mode http
option httplog
option dontlognull
option redispatch
option forwardfor
option http-server-close
retries 3
maxconn 20480
timeout connect 5s
timeout server 50s
timeout client 50s
timeout http-keep-alive 3000
 # HAProxy 상태 확인 URI 설정
stats enable
stats auth id:password
stats refresh 10s
stats uri /stats
frontend http_frontend
bind *:80
reqadd X-Forwarded-Proto:\ http

# 설정한 backend(web_server) 쪽으로 프록시
default_backend web_server
# SSL 설정, 필요없으면 스킵
frontend https_frontend
bind *:443 ssl crt /etc/haproxy/ssl/latest.pem
mode http
option httpclose
option forwardfor
reqadd X-Forwarded-Proto:\ https
default_backend web_server
backend web_server
mode http
 # 로드 밸런싱 알고리즘 선택
balance roundrobin
cookie SERVERID insert indirect nocache
server s1 127.0.0.1:8080 cookie s1 check inter 5000 fastinter 1000 rise 1 fall 1 weight 1
server s2 127.0.0.1:8081 cookie s2 check inter 5000 fastinter 1000 rise 1 fall 1 weight 1

다음에는 HAProxy를 이용해 Socket.io를 로드 밸런싱 하는 방법에 대해 써볼 예정이다. 언제가 될지는 모르겠지만..