서버 설정 · 5 min read · Nov 08, 2025

CentOS 8에서 KeepAlived로 고가용성 NGINX 설정하는 방법

Nginx는 무료이며 오픈 소스인 세계에서 가장 인기 있는 웹 서버 중 하나입니다. 또한 리버스 프록시, 로드 밸런서 및 HTTP 캐시로도 사용될 수 있습니다. 고가용성은 애플리케이션이 실패 시 다른 시스템으로 작업을 재배치할 수 있게 해줍니다. 고가용성 시스템을 설정하기 위해 사용할 수 있는 다양한 기술이 있습니다.

Keepalived는 서비스나 시스템을 지속적으로 모니터링하고 실패 시 고가용성을 달성하는 시스템 데몬입니다. 하나의 노드가 다운되면 두 번째 노드가 리소스를 제공합니다.

이 튜토리얼에서는 CentOS 8에서 KeepAlived로 고가용성 Nginx 웹 서버를 설정하는 방법을 보여드리겠습니다.

전제 조건

  • 마스터 노드용과 백업 노드용으로 CentOS 8을 실행하는 두 대의 서버.
  • 서버에 루트 비밀번호가 설정되어 있어야 합니다.

두 노드에 Nginx 설치하기

먼저, 두 노드에 Nginx 패키지를 설치해야 합니다. 다음 명령어를 사용하여 설치할 수 있습니다:

dnf install nginx -y

두 노드에 Nginx가 설치되면 Nginx 서비스를 시작하고 시스템 재부팅 시 자동으로 시작되도록 설정합니다:

systemctl start nginx  
systemctl enable nginx

작업이 완료되면 다음 단계로 진행할 수 있습니다.

두 노드에 index.html 파일 만들기

다음으로, 각 노드를 식별하기 위해 두 노드에 사용자 정의 index.html 파일을 만들어야 합니다.

첫 번째 노드에서 다음 명령어로 index.html 파일을 만듭니다:

echo "

이것은 나의 첫 번째 NGINX 웹 서버 노드입니다.

" | tee /usr/share/nginx/html/index.html

두 번째 노드에서 다음 명령어로 index.html 파일을 만듭니다:

echo "

이것은 나의 두 번째 NGINX 웹 서버 노드입니다.

" | tee /usr/share/nginx/html/index.html

작업이 완료되면 파일을 저장하고 닫습니다.

Keepalived 설치 및 구성

다음으로, 두 노드에 Keepalived를 설치해야 합니다. 기본적으로 Keepalived 패키지는 CentOS 8의 기본 리포지토리에 있습니다. 다음 명령어를 실행하여 설치할 수 있습니다:

dnf install keepalived -y

두 노드에 keepalived 패키지가 설치되면 두 노드에서 keepalived 기본 구성 파일을 편집해야 합니다.

첫 번째 노드에서 keepalived.conf 파일을 편집합니다:

nano /etc/keepalived/keepalived.conf

기본 내용을 제거하고 다음 내용을 추가합니다:

global_defs {
  # Keepalived 프로세스 식별자
  router_id nginx
}

# Nginx가 실행 중인지 확인하는 스크립트
vrrp_script check_nginx {
  script "/bin/check_nginx.sh"
  interval 2
  weight 50
}

# 가상 인터페이스 - 우선 순위는 장애 조치 시 인수된 인터페이스가 인계받는 순서를 지정합니다.
vrrp_instance VI_01 {
  state MASTER
  interface eth0
  virtual_router_id 151
  priority 110

  # 두 NGINX 웹 서버 간에 공유되는 가상 IP 주소
  virtual_ipaddress {
    192.168.1.10/24
  }
  track_script {
    check_nginx
  }
  authentication {
    auth_type AH
    auth_pass secret
  }
}

작업이 완료되면 파일을 저장하고 닫습니다.

두 번째 노드에서 keepalived.conf 파일을 편집합니다:

nano /etc/keepalived/keepalived.conf

기본 내용을 제거하고 다음 내용을 추가합니다:

global_defs {
  # Keepalived 프로세스 식별자
  router_id nginx
}

# Nginx가 실행 중인지 확인하는 스크립트
vrrp_script check_nginx {
  script "/bin/check_nginx.sh"
  interval 2
  weight 50
}

# 가상 인터페이스 - 우선 순위는 장애 조치 시 인수된 인터페이스가 인계받는 순서를 지정합니다.
vrrp_instance VI_01 {
  state BACKUP
  interface eth0
  virtual_router_id 151
  priority 100

  # 두 NGINX 웹 서버 간에 공유되는 가상 IP 주소
  virtual_ipaddress {
    192.168.1.10/24
  }
  track_script {
    check_nginx
  }
  authentication {
    auth_type AH
    auth_pass secret
  }
}

작업이 완료되면 파일을 저장하고 닫은 후 Nginx 서비스가 실행 중인지 확인하는 스크립트를 만들어야 합니다. 다음 명령어를 사용하여 만들 수 있습니다:

참고: 위 구성 파일에서 MASTER를 BACKUP으로, 110을 100으로 교체했습니다.

nano /bin/check_nginx.sh

다음 줄을 추가합니다:

#!/bin/sh
if [ -z "`pidof nginx`" ]; then
  exit 1
fi

작업이 완료되면 파일을 저장하고 닫은 후 다음 명령어로 적절한 권한을 설정합니다:

chmod 755 /bin/check_nginx.sh

마지막으로, keepalived 서비스를 시작하고 시스템 재부팅 시 자동으로 시작되도록 설정합니다:

systemctl start keepalived  
systemctl enable keepalived

다음 명령어를 사용하여 keepalived 서비스의 상태를 확인할 수도 있습니다:

systemctl status keepalived

다음과 같은 출력을 받아야 합니다:

? keepalived.service - LVS 및 VRRP 고가용성 모니터
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-04-08 04:24:22 EDT; 5s ago
  Process: 3141 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 3142 (keepalived)
    Tasks: 2 (limit: 12524)
   Memory: 2.1M
   CGroup: /system.slice/keepalived.service
           ??3142 /usr/sbin/keepalived -D
           ??3143 /usr/sbin/keepalived -D

Apr 08 04:24:22 node1 Keepalived_vrrp[3143]: (VI_01) 효과적인 우선 순위를 110에서 160으로 변경
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: (VI_01) 광고 수신 시간 초과
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: (VI_01) MASTER STATE로 진입
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: (VI_01) VIP 설정 중.
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: eth0에서 192.168.1.10에 대한 무료 ARP 전송
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: (VI_01) eth0에서 192.168.1.10에 대한 무료 ARP 전송/대기 중
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: eth0에서 192.168.1.10에 대한 무료 ARP 전송
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: eth0에서 192.168.1.10에 대한 무료 ARP 전송
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: eth0에서 192.168.1.10에 대한 무료 ARP 전송
Apr 08 04:24:25 node1 Keepalived_vrrp[3143]: eth0에서 192.168.1.10에 대한 무료 ARP 전송

마스터 노드에서 다음 명령어를 사용하여 가상 IP 주소 상태를 확인할 수도 있습니다:

ip add show

다음 출력에서 가상 IP 주소 192.168.1.10을 확인할 수 있어야 합니다:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:2d:3a:20:9b brd ff:ff:ff:ff:ff:ff
    inet 45.58.32.155/24 brd 45.58.32.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.10/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::200:2dff:fe3a:209b/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:0a:3a:20:9b brd ff:ff:ff:ff:ff:ff
    inet6 fe80::200:aff:fe3a:209b/64 scope link 
       valid_lft forever preferred_lft forever

작업이 완료되면 다음 단계로 진행할 수 있습니다.

두 노드에서 방화벽 구성하기

다음으로, 두 노드에서 포트 80을 허용하고 VRRP를 허용해야 합니다. 다음 명령어를 사용하여 수행할 수 있습니다:

firebase-cmd --permanent --add-service=http  
firebase-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent

다음으로, 변경 사항을 적용하기 위해 firewalld를 다시 로드합니다:

firebase-cmd –reload

Keepalived 확인하기

이 시점에서 Nginx와 Keepalived가 설치되고 구성되었습니다. Nginx의 고가용성이 작동하는지 테스트할 시간입니다.

웹 브라우저를 열고 URL http://your-virtual-ip에 접속합니다. 다음 페이지가 표시되어야 합니다:

노드 1의 Nginx 페이지

이제 마스터 노드에서 Nginx 서비스를 중지하고 가상 IP가 노드 1에서 노드 2로 전환되는지 테스트합니다.

마스터 노드에서 다음 명령어를 사용하여 Nginx 서비스를 중지합니다:

systemctl stop nginx

다음으로, 노드 2에 로그인하고 다음 명령어를 사용하여 가상 IP를 확인합니다:

ip add show

다음 출력에서 가상 IP를 확인할 수 있어야 합니다:

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:2d:3a:26:37 brd ff:ff:ff:ff:ff:ff
    inet 45.58.38.55/24 brd 45.58.38.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.1.10/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::200:2dff:fe3a:2637/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:00:0a:3a:26:37 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::200:aff:fe3a:2637/64 scope link 
       valid_lft forever preferred_lft forever

이제 URL http://your-virtual-ip를 사용하여 Nginx 웹 서버에 접속합니다. 노드 2 페이지가 표시되어야 합니다:

노드 2의 Nginx

결론

축하합니다! Keepalived로 고가용성 Nginx 서버를 성공적으로 설정했습니다. 이제 프로덕션 환경에서 고가용성 Nginx 서버를 설정할 수 있는 충분한 지식을 갖추었기를 바랍니다.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.