HAProxy는 "High Availability Proxy"의 줄임말로, TCP 및 HTTP 기반의 로드 밸런싱과 프록시 서비스를 제공하는 오픈 소스 소프트웨어입니다. 주로 웹 서버, 애플리케이션 서버 등의 트래픽 분산을 위해 사용되며, 고가용성과 성능을 보장하는 데 특화되어 있습니다. HAProxy는 여러 서버에 들어오는 트래픽을 분산하여 서버의 부하를 줄이고, 서비스의 안정성과 응답 속도를 높이는 역할을 합니다.
HAProxy의 주요 기능
- 로드 밸런싱: 트래픽을 여러 서버에 고르게 분배하여 서버의 과부하를 방지합니다. 이를 통해 웹 애플리케이션이 많은 요청을 처리할 수 있도록 해줍니다.
- 고가용성: 서버 장애 시 자동으로 다른 서버로 트래픽을 전환하여 서비스의 중단을 최소화합니다. 이로 인해 고가용성이 보장되며, 사용자는 장애를 거의 느끼지 못하게 됩니다.
- 프록시 역할: 클라이언트와 서버 사이에서 중개 역할을 수행하여 보안을 강화하고, 클라이언트의 요청을 서버에 전달하거나 서버의 응답을 클라이언트에게 전달하는 등의 작업을 수행합니다.
- SSL 종료 및 다중 프로토콜 지원: SSL 인증을 HAProxy에서 처리하여 백엔드 서버의 부담을 줄일 수 있으며, 다양한 프로토콜을 지원하여 다양한 네트워크 환경에 적합합니다.
1. HAProxy 설치
CentOS 또는 Rocky Linux 환경에서 다음 명령어로 HAProxy를 설치합니다.
# yum install haproxy -y
2. 기본 설정 파일 수정: Round Robin 방식의 로드 밸런싱
설정 파일 /etc/haproxy/haproxy.cfg를 열어 라운드 로빈 방식의 로드 밸런싱을 위한 설정을 추가합니다.
# vi /etc/haproxy/haproxy.cfg
아래와 같은 백엔드 설정을 추가/변경합니다.
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 1
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
balance roundrobin
server app1 your_ipip:80 check
server app2 your_ipip:80 check
backend app: backend는 트래픽을 처리할 서버 그룹을 정의합니다. 여기서 app이라는 이름의 백엔드 서버 그룹을 지정했습니다.
옵션 설명
- mode http: HAProxy의 작동 모드를 설정합니다. http 모드는 HTTP 트래픽을 처리하는 모드로, HTTP 기반 로드 밸런싱에 적합합니다.
- log global: 로깅 옵션을 global 설정에 따르도록 지정합니다. 이를 통해 전체 HAProxy 설정에서 정의한 글로벌 로깅 정책을 따릅니다.
- option httplog: HTTP 로그 형식을 사용합니다. 이 설정을 통해 보다 자세한 요청 로그를 수집할 수 있습니다.
- option dontlognull: 빈 요청(헤더가 없는 연결 등)을 로깅하지 않도록 설정합니다. 트래픽이 많은 경우 로그가 불필요하게 많아지는 것을 방지할 수 있습니다.
- option http-server-close: 서버와 클라이언트 간의 연결이 완료된 후 서버 쪽에서 연결을 닫습니다. 이를 통해 연결 재사용이 가능해지고, 더 효율적인 자원 활용이 가능합니다.
- option forwardfor except 127.0.0.0/8: 클라이언트의 원래 IP 주소를 백엔드 서버로 전달하기 위해 X-Forwarded-For 헤더를 추가합니다. 단, 로컬 IP(127.0.0.1)는 제외됩니다.
- option redispatch: 특정 서버가 다운되었거나 응답이 없을 경우, 요청을 다른 서버로 재전송합니다. 이를 통해 서비스 가용성을 높일 수 있습니다.
- retries 1: 요청이 실패했을 때 재시도 횟수를 지정합니다. 여기서는 1회 재시도하도록 설정되어 있습니다.
- timeout http-request 10s: HTTP 요청 타임아웃을 10초로 설정합니다. 클라이언트가 요청을 보낼 때 10초 이내에 완료되지 않으면 타임아웃이 발생합니다.
- timeout queue 1m: 요청이 큐에 대기할 수 있는 최대 시간을 1분으로 설정합니다. 큐에 오래 남아 있는 요청은 타임아웃 처리됩니다.
- timeout connect 10s: 백엔드 서버에 연결을 시도할 때, 연결 대기 시간을 10초로 설정합니다.
- timeout client 1m: 클라이언트와의 연결이 1분 이상 유지되지 않으면 타임아웃됩니다.
- timeout server 1m: 서버와의 연결이 1분 이상 유지되지 않으면 타임아웃됩니다.
- timeout http-keep-alive 10s: HTTP keep-alive 연결을 유지할 시간을 10초로 설정합니다. 이 시간 내에 추가 요청이 없으면 연결이 닫힙니다.
- timeout check 10s: 서버 상태 확인(헬스 체크) 시간 초과를 10초로 설정합니다. 서버가 응답하지 않으면 해당 서버를 비활성화합니다.
- maxconn 3000: 이 백엔드가 처리할 수 있는 최대 연결 수를 3000으로 제한합니다.
- balance roundrobin: 로드 밸런싱 알고리즘을 roundrobin으로 설정하여, 요청을 순서대로 서버에 분배합니다.
- server app1 172.168.0.74:80 check: app1 서버를 백엔드 서버로 지정합니다. IP 주소 172.168.0.74의 80번 포트로 연결됩니다. check 옵션을 통해 서버 상태를 주기적으로 확인합니다.
- server app2 172.168.0.145:80 check: app2 서버를 백엔드 서버로 지정합니다. IP 주소 172.168.0.145의 80번 포트로 연결됩니다. check 옵션을 통해 서버 상태를 주기적으로 확인합니다.
3. 방화벽 설정
HAProxy가 사용하는 포트를 열어줍니다. 예를 들어, 기본적으로 80번 포트를 사용한다면 다음과 같이 방화벽 설정을 추가할 수 있습니다. (필요하다면..)
# firewall-cmd --add-port=80/tcp --permanent
# firewall-cmd --reload
4. HAProxy 서비스 시작 및 상태 확인
HAProxy 서비스를 시작하고, 실행 상태를 확인합니다.
# systemctl start haproxy.service
# systemctl status haproxy.service
이제 서버 보면 라운드로빈으로 왔다갔다
5. 스티키 세션 설정: 쿠키 기반 세션 유지
라운드 로빈 방식으로 트래픽이 분배되면, 사용자가 요청을 할 때마다 서버가 변경될 수 있습니다. 하지만 세션을 유지해야 하는 경우에는 스티키 세션 설정이 필요합니다. HAProxy에서는 쿠키 기반 스티키 세션을 통해 특정 사용자의 요청을 동일한 서버로 고정할 수 있습니다.
스티키 세션 설정 추가 ( /etc/haproxy/haproxy.cfg )
#---------------------------------------------------------------------
# round robin balancing between the various backends with sticky session
#---------------------------------------------------------------------
backend app
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 1
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
balance roundrobin
cookie SERVERID insert indirect nocache # 쿠키 기반 스티키 세션 설정
server app1 your_ipip:80 check cookie s1
server app2 your_ipip:80 check cookie s2
cookie SERVERID insert indirect nocache
- cookie SERVERID: 쿠키 기반 스티키 세션을 설정하는 옵션입니다. 여기서 SERVERID는 사용자가 처음 연결된 서버의 ID를 저장하는 쿠키 이름으로 사용됩니다. (나는 바꿈 changki123)
- insert: HAProxy가 SERVERID라는 쿠키를 사용자에게 삽입합니다. 이를 통해 사용자가 처음 연결된 서버 정보를 쿠키로 유지합니다.
- indirect: 클라이언트가 이 쿠키를 직접 볼 수 없도록 하여 보안을 강화합니다. 대신 HAProxy가 내부적으로 쿠키를 참조하여 스티키 세션을 관리합니다.
- nocache: 이 쿠키가 클라이언트의 캐시나 중간 캐시 서버에 저장되지 않도록 합니다.
이 설정에서는 SERVERID라는 쿠키를 통해 사용자 세션을 고정합니다. app1 서버는 s1 쿠키를, app2 서버는 s2 쿠키를 사용하게 됩니다. 이렇게 하면 사용자가 한 번 연결된 서버에 계속 연결되므로 새로고침을 해도 서버가 변경되지 않고, 세션이 유지됩니다.
세션이 나를 안놔줘 ㅠㅠ