본문 바로가기
로드밸런싱

haproxy를 이용하여 keepalived 로 이중화, nginx 로 밸런스별로 처리

by seo0lee 2025. 11. 5.
SMALL

전체 구성 요약

구분 서버 역할 IP
MASTER seo0lee1 HAProxy + Keepalived (active) 192.168.0.18
BACKUP seo0lee2 HAProxy + Keepalived (standby) 192.168.3.65
WEB1 seo0lee3 Nginx 192.168.0.234
WEB2 seo0lee4 Nginx 192.168.1.231
VIP - Virtual IP 192.168.200.16

1단계. NGINX 웹 서버 설치 (seo0lee3, seo0lee4)

목적

  • 실제 서비스 페이지를 제공할 웹 서버
  • HAProxy는 이 두 대를 backend로 load balancing

1️⃣ Nginx 설치

sudo dnf install -y nginx

오류 시:

  • dnf: Failed to download metadata → 외부 통신 안됨 → ping 8.8.8.8으로 네트워크 확인
  • systemctl status network로 네트워크 활성화 확인

2️⃣ Nginx 서비스 시작 및 부팅 시 자동 실행

sudo systemctl enable --now nginx
sudo systemctl status nginx

정상 시 출력:

Active: active (running)

3️⃣ 테스트 페이지 수정

echo "<h1>WEB1 (192.168.0.234)</h1>" | sudo tee /usr/share/nginx/html/index.html

(두 번째 서버는 IP만 다르게)

echo "<h1>WEB2 (192.168.1.231)</h1>" | sudo tee /usr/share/nginx/html/index.html

4️⃣ 브라우저 테스트

안 뜰 경우:

  • sudo firewall-cmd --permanent --add-service=http
  • sudo systemctl restart firewalld
  • sudo firewall-cmd --reload

 


2단계. HAProxy 설치 (seo0lee1, seo0lee2)

1️⃣ 설치

sudo dnf install -y haproxy

2️⃣ 설정 파일 수정

경로: /etc/haproxy/haproxy.cfg

sudo nano /etc/haproxy/haproxy.cfg

아래 내용으로 변경 (기본 내용 삭제 후 교체):

global
    log /dev/log local0
    log /dev/log local1 notice
    daemon
    maxconn 4000
    user haproxy
    group haproxy

defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000

frontend http_front
    bind *:80
    default_backend http_back

backend http_back
    balance roundrobin
    server web1 192.168.0.234:80 check
    server web2 192.168.1.231:80 check

listen stats
    bind *:9000
    stats enable
    stats uri /stats
    stats refresh 5s

3️⃣ 구문 오류 확인

sudo haproxy -f /etc/haproxy/haproxy.cfg -c

정상 시:

Configuration file is valid

4️⃣ 실행 및 부팅 등록

sudo systemctl enable --now haproxy
sudo systemctl status haproxy

5️⃣ 테스트

브라우저에서 → http://192.168.0.18 (또는 seo0lee2 IP)

  • 새로고침 시 WEB1 / WEB2 번갈아 표시되면 정상

안될 때 확인:

  • sudo ss -tulnp | grep 80 → HAProxy가 80포트 LISTEN 중인지
  • sudo tail -f /var/log/haproxy.log → 백엔드 연결 실패 로그 확인
  • firewall-cmd --list-all 에서 http 서비스 추가 여부 확인

 


3단계. Keepalived 설치 및 VIP 설정

이제 두 대의 HAProxy 서버를 이중화합니다.

1️⃣ 설치

(두 서버 모두)

sudo dnf install -y keepalived

2️⃣ 설정 파일 경로

sudo nano /etc/keepalived/keepalived.conf

MASTER 서버 설정 (seo0lee1)

vrrp_instance VI_1 {
    state MASTER
    interface enX0  # 실제 네트워크 인터페이스명
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/22 dev enX0 label enX0:1
    }
}

BACKUP 서버 설정 (seo0lee2)

vrrp_instance VI_1 {
    state BACKUP
    interface enX0  # 실제 네트워크 인터페이스명
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16/22 dev enX0 label enX0:1
    }
}

3️⃣ 서비스 시작

sudo systemctl enable --now keepalived
sudo systemctl status keepalived

4️⃣ VIP 확인 (MASTER)

ip addr | grep 192.168.200

정상 시:

inet 192.168.200.16/22 scope global enX0:1

BACKUP에서는 아무것도 안나와야 정상.

5️⃣ 장애 전환 테스트

MASTER에서 Keepalived 중지:

sudo systemctl stop keepalived

이제 BACKUP에서 확인:

ip addr | grep 192.168.200

→ VIP가 BACKUP으로 옮겨오면 성공 🎉

MASTER를 다시 시작하면 VIP가 돌아감.


4단계. 최종 테스트

1️⃣ 클라이언트에서 VIP로 접속

curl -i <http://192.168.200.16>

  • nginx가 번갈아서 나오며 성공 🎉

2️⃣ 장애 전환 테스트

MASTER에서 Keepalived 중지:

sudo systemctl stop keepalived

 

이제 BACKUP에서 확인:

ip addr | grep 192.168.200

→ VIP가 BACKUP으로 옮겨오면 성공 🎉

MASTER를 다시 시작하면 VIP가 돌아감.