HAProxy 2대(Master/Backup)와 keepalived로 VIP(192.168.1.200)를 공유하는 이중화 로드밸런서를 만들고, 뒤에 WordPress 웹 서버 2대를 붙였습니다. Master를 재시작해 VIP가 Backup으로 넘어가는 것까지 확인했습니다.
1. 구성
- keepalived: VIP 관리와 이중화(Master 장애 시 Backup이 VIP를 넘겨받음)
- HAProxy: 웹 서버로 트래픽을 나누는 로드밸런싱
| 호스트 | IP | 포트 | 역할 |
| VIP | 192.168.1.200 | - | HAProxy Master/Backup이 공유 |
| Haproxy_Master | 192.168.1.201 | 80 | keepalived + HAProxy |
| Haproxy_Backup | 192.168.1.202 | 80 | keepalived + HAProxy |
| Web_Master | 192.168.1.104 | 80 | WordPress |
| Web_Backup | 192.168.1.127 | 80 | WordPress |
2. sysctl 설정
Master와 Backup의 /etc/sysctl.conf에 아래 두 줄을 추가합니다. ip_nonlocal_bind는 VIP가 자기 서버에 없을 때도 HAProxy가 그 주소로 바인딩할 수 있게 해 줍니다.
root@Haproxy_Master:~ vi /etc/sysctl.conf
root@Haproxy_Backup:~ vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1
3. HAProxy 설정
3.1 설치
Master와 Backup 모두에 HAProxy를 설치합니다.
root@Haproxy_Master:~ apt-get install -y haproxy
root@Haproxy_Backup:~ apt-get install -y haproxy
3.2 haproxy.cfg 수정
Master와 Backup의 /etc/haproxy/haproxy.cfg를 각각 수정합니다.
root@Haproxy_Master:~ vi /etc/haproxy/haproxy.cfg
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
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 haproxy
bind *:80
mode http
default_backend SERVER_WEB
backend SERVER_WEB
balance roundrobin
server WEB 192.168.1.104:80 check
server WEB 192.168.1.127:80 check
option httpchk GET /
Haproxy_Master의 haproxy.cfg
root@Haproxy_Backup:~ vi /etc/haproxy/haproxy.cfg
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
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 haproxy
bind *:80
mode http
default_backend SERVER_WEB
backend SERVER_WEB
balance roundrobin
server WEB 192.168.1.104:80 check
server WEB 192.168.1.127:80 check
option httpchk GET /
Haproxy_Backup의 haproxy.cfg
3.3 HAProxy 시작
root@Haproxy_Master:~ /etc/init.d/haproxy restart -f /etc/haproxy/haproxy.cfg
root@Haproxy_Backup:~ /etc/init.d/haproxy restart -f /etc/haproxy/haproxy.cfg
4. keepalived 설정
4.1 설치
root@Haproxy_Master:~ apt-get install -y keepalived
root@Haproxy_Backup:~ apt-get install -y keepalived
4.2 Master 설정
root@Haproxy_Master:~ vi /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens160
virtual_router_id 50
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass Password@
}
virtual_ipaddress {
192.168.1.200
}
}
4.3 Backup 설정
Backup은 state를 BACKUP으로 두고, priority를 Master보다 낮게 설정해야 합니다(Master 100, Backup 50).
root@Haproxy_Backup:~ cat /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP
interface ens160
virtual_router_id 50
priority 50
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass Password@
}
virtual_ipaddress {
192.168.1.200
}
}
4.4 keepalived 시작
root@Haproxy_Master:~ service keepalived start
root@Haproxy_Backup:~ service keepalived start
5. 검증
설정을 마치고 Master의 IP를 보면 VIP 192.168.1.200이 추가되어 있습니다.

Haproxy_Master에 VIP 192.168.1.200 할당
Master를 재시작해 장애 상황을 만들어 보니 VIP가 Backup으로 넘어가 정상 동작했습니다.

Master 재시작 후 Haproxy_Backup으로 넘어간 VIP
6. 정리
- keepalived가 VIP를, HAProxy가 로드밸런싱을 맡는 구조입니다.
- Backup의 priority를 Master보다 낮게 설정해야 평소에는 Master가 VIP를 가집니다.
- net.ipv4.ip_nonlocal_bind=1을 켜 두면 VIP가 없는 서버에서도 HAProxy가 미리 떠 있을 수 있습니다.
728x90
'Server & OS > Linux' 카테고리의 다른 글
| [Linux] Ubuntu에서 ifmetric으로 네트워크 인터페이스 우선순위 바꾸기 (0) | 2022.10.09 |
|---|---|
| [Linux] fallocate로 원하는 크기의 대용량 파일 만들기 (0) | 2022.10.05 |
| [Linux] df와 du 명령어 차이와 사용법 (0) | 2022.05.09 |
| [Ubuntu] 웹 브라우저로 SSH 접속하는 Shell In A Box 설치 (0) | 2022.02.08 |
| [Linux] setup-ipsec-vpn 스크립트로 L2TP/IPsec VPN 서버 구축 (0) | 2021.08.13 |
서울
--:--:--
-전체 글
-카테고리
오늘 방문