HAProxy OSS 설치 및 L7 Load Balancer, 모니터링 구성 가이드
이 포스트에서는 Ubuntu 24.04 환경에서 HAProxy OSS를 설치하고 http/https 요청을 처리하는 L7 Load Balancer(로드 밸런서)로 구성하는 방법 및 모니터링 페이지를 설정하는 방법에 대해 설명합니다.
로드 밸런서 구성을 통해 여러 서버에 요청을 효과적으로 분산할 수 있고, 모니터링 기능을 통해 로드 밸런싱 되는 서버의 상태를 손쉽게 확인할 수 있습니다.
목차
1. HAProxy란?
2. HAProxy OSS 설치
3. L7 Load Balancer 구성
4. HAProxy 모니터링 구성
5. 결론
1. HAProxy란?
HAProxy (High Availability Proxy)는 높은 가용성을 제공하는 오픈 소스 로드 밸런서 및 리버스 프록시 서버입니다. HAProxy는 주로 HTTP/HTTPS, TCP 트래픽을 처리하며, 다양한 로드 밸런싱 알고리즘과 헬스 체크 기능을 통해 웹 서버의 부하를 효율적으로 분산시키는 데 사용됩니다.
자체적인 모니터링 페이지 구성을 통해 서버의 상태를 손쉽게 확인할 수 있고, Keepalived와 통합하여 고가용성(HA) 구성을 할 수도 있습니다.
2. HAProxy OSS 설치
이 포스트에서는 패키지 설치 방식을 통해 HAProxy를 설치했습니다. 최신 버전의 HAProxy 설치를 위해 PPA 저장소를 추가 후 설치했습니다.
1. apt 저장소를 업데이트합니다.
$ sudo apt update
2. HAProxy 최신 버전 설치를 위해 PPA 저장소(개인 패키지 저장소)를 추가합니다.
$ sudo add-apt-repository ppa:vbernat/haproxy-3.0 -y
$ sudo apt update
3. 명령어를 사용하여 HAProxy를 설치합니다.
$ sudo apt install haproxy -y
4. 명령어를 사용하여 설치된 HAProxy의 버전을 확인합니다. 3.0.2 버전의 설치를 확인할 수 있습니다.
$ haproxy -v
HAProxy version 3.0.2-1ppa1~noble 2024/06/14 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2029.
Known bugs: http://www.haproxy.org/bugs/bugs-3.0.2.html
Running on: Linux 6.8.0-38-generic #38-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 7 15:25:01 UTC 2024 x86_64
3. HAProxy L7 Load Balancer 구성
HAProxy 설정 파일은 /etc/haproxy/haproxy.cfg 파일입니다. 최초 설치 시 해당 파일의 내용은 다음과 같습니다.
global
# 로그 메시지를 전송할 경로, syslog facility, 로그 레벨 설정
log /dev/log local0 # /dev/log 는 rsyslog Unix 도메인 소켓 경로입니다
log /dev/log local1 notice # notice 레벨의 로그 전송 설정
chroot /var/lib/haproxy # HAProxy 프로세스가 사용할 파일 시스템의 경로를 지정
stats socket /run/haproxy/admin.sock mode 660 level admin # 하단 설명 참조
stats timeout 30s # 소켓 연결의 유효 기간 설정
user haproxy # 프로세스 실행 시 사용할 사용자 권한
group haproxy # 프로세스가 속할 그룹
daemon # HAProxy를 데몬 모드로 실행
# Default SSL material locations
# SSL 인증서 파일 경로 지정
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
# 하단 설명 참조
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global # global 섹션의 로그 설정 사용
mode http # http 모드/프로토콜 사용
option httplog # HTTP 요청, 연결 상태 및 타이머 로깅을 활성화
option dontlognull # health check/port probe와 같은 빈 요청/응답이 로그에 포함되지 않도록 설정
timeout connect 5000 # HAProxy가 서버와 연결 시도 시 제한 시간 설정 (ms 단위)
timeout client 50000 # HAProxy가 클라이언트로부터 데이터를 수신할 때의 시간 제한 설정
timeout server 50000 # HAProxy가 서버로부터 응답을 받을 때, 서버의 응답 대기 시간을 설정
# 사용할 에러 파일의 경로 지정
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
- stats socket : HAProxy의 소켓 파일의 경로, 파일 권한, 접근 권한을 설정합니다.
- ssl-default-bind-ciphers : TLS 1.2 이하 버전에서 사용할 암호화 알고리즘을 정의합니다.
- ssl-default-bind-ciphersuites : TLS 1.3에서 사용할 암호화 알고리즘을 정의합니다.
- ssl-default-bind-options : SSL/TLS 연결 시 사용할 추가 옵션을 정의합니다.
최소 TLS 버전을 1.2로 제한하는 설정과 TLS 세션 티켓을 비활성화하는 설정이 적용되어 있습니다.
전역 설정을 위한 global 섹션과 default 섹션이 구성되어 있습니다. default 섹션은 이후에 추가할 frontend 섹션/backend 섹션의 기본 동작을 정의합니다. 섹션별 옵션의 설명은 주석을 참고하세요.
이제 HAProxy L7 load balancer(로드 밸런서) 구성을 위해 설정 파일에 frontend, backend 섹션을 추가하겠습니다. frontend 섹션과 backend 섹션은 기본적으로 default 섹션의 설정을 상속받습니다. 섹션 내부에 동일한 지시문을 작성해 설정을 덮어쓰고, 섹션별로 별개의 설정을 사용할 수 있습니다.
1. frontend 섹션을 추가합니다.
섹션의 이름은 proxy로 지정했습니다.
frontend proxy
bind *:80
default_backend nginx
- bind : 요청을 수신할 포트를 설정합니다.
- default_backend : bind 설정으로 수신한 요청을 전달할 backend 섹션의 이름을 지정합니다.
2. frontend 섹션의 설정에 따라 요청을 전달할 backend 섹션을 추가합니다.
섹션의 이름은 nginx로 지정했습니다.
backend nginx
balance roundrobin
server NGINX1 192.168.200.176:8001 check
server NGINX2 192.168.200.176:8002 check
server NGINX3 192.168.200.176:8003 check
- balance : 로드 밸런싱 알고리즘을 설정합니다.
- server : 요청을 로드 밸런싱할 서버를 설정합니다.
임의로 지정한 서버 이름(NGINX), 대상 서버의 IP:port, 대상 서버의 health check를 위한 check 옵션을 설정했습니다.
전체 설정 파일은 다음과 같습니다.
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend proxy
bind *:80
default_backend nginx
backend nginx
balance roundrobin
server NGINX1 192.168.200.176:8001 check
server NGINX2 192.168.200.176:8002 check
server NGINX3 192.168.200.176:8003 check
예제를 위한 백엔드 NGINX 웹 서버 구성입니다.
server {
listen 8001;
location / {
add_header Content-Type text/plain;
return 200 "Server1\n";
}
}
server {
listen 8002;
location / {
add_header Content-Type text/plain;
return 200 "Server2\n";
}
}
server {
listen 8003;
location / {
add_header Content-Type text/plain;
return 200 "Server3\n";
}
}
3. 명령어를 통해 설정 파일의 이상 여부를 확인합니다.
$ haproxy -c -f /etc/haproxy/haproxy.cfg
이상이 없으면 메시지가 출력되지 않습니다.
[NOTICE] (1525) : haproxy version is 3.0.2-1ppa1~noble
[NOTICE] (1525) : path to executable is /usr/sbin/haproxy
[ALERT] (1525) : config : [/etc/haproxy/haproxy.cfg:52] : 'server nginx/NGINX3' : unknown keyword 'chekc'; did you mean 'check' maybe ?
[ALERT] (1525) : config : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg
[ALERT] (1525) : config : Fatal errors found in configuration.
파일에 이상이 있으면 위와 같이 메시지가 출력됩니다. 위 메시지의 경우 check 대신 chekc로 작성되어 출력된 메시지입니다.
4. 명령어를 통해 변경된 설정을 적용합니다.
$ sudo systemctl reload haproxy
5. 요청을 전송하여 정상적으로 L7 Load Balancer가 구성되었는지 확인합니다.
$ curl http://192.168.200.138 # HAProxy 서버 IP
Server1
$ curl http://192.168.200.138
Server2
$ curl http://192.168.200.138
Server3
$ curl http://192.168.200.138
Server1
round robin 알고리즘 방식으로 동작하여 HAProxy 를 통해 성공적으로 NGINX 서버들로 요청이 프록시 되는 것을 확인할 수 있습니다.
4. HAProxy 모니터링 구성
설정 파일을 통해 모니터링을 위한 Stats 페이지를 구성하여 사용할 수 있습니다.
1. listen 섹션을 추가하여 Stats 페이지를 구성합니다.
섹션의 이름은 stat으로 설정했습니다.
listen stat
bind *:8080
stats enable
stats uri /monitor
stats refresh 5s
- bind : Stats 페이지 접근을 위한 port를 설정합니다.
- stats enable : 모니터링을 위한 stats를 활성화합니다.
- stats uri : 페이지 접근을 위한 URI를 설정합니다. 임의로 /monitor로 설정을 적용했습니다.
- stats refresh : Stats 페이지 새로고침 주기를 설정합니다.
2. 명령어를 통해 변경된 설정을 적용합니다.
$ sudo systemctl reload haproxy
3. 설정한 port/uri에 맞춰 웹 브라우저에서 접속하여 확인합니다.


모니터링을 위한 Stats 페이지가 구성된 것을 확인할 수 있습니다. 앞서 구성한 섹션 이름(stat, proxy, nginx)별로 상태를 확인할 수 있습니다.
5. 결론
이번 포스트에서는 HAProxy OSS 3.0.2 버전을 설치하고, http/https 요청을 처리하는 L7 Load Balancer(로드 밸런서)로 구성하는 방법 및 모니터링 페이지를 설정하는 방법에 대해 알아봤습니다.
Ubuntu 24.04 환경에서 PPA 저장소를 추가하여 최신 버전의 HAProxy를 설치하고, 최초 설정 파일의 global 및 default 섹션의 구성 정보에 대해 알아봤습니다. 이어서 frontend, backend 섹션을 추가하여 L7 로드 밸런서로 구성하는 방법과, listen 섹션을 활용하여 모니터링을 위한 Stats 페이지를 설정하는 방법을 상세하게 알아봤습니다.
이러한 구성을 통해 여러 서버에 요청을 효과적으로 분산할 수 있고, 모니터링 기능을 통해 로드 밸런싱 되는 서버의 상태를 손쉽게 확인할 수 있습니다.
추가 질문, 궁금한 점이 있으시거나 HAProxy를 통한 소프트웨어 로드 밸런서를 구성하고 싶으시다면 언제든지 NGINX STORE를 통해 문의해 보세요.
댓글을 달려면 로그인해야 합니다.