NGINX web server ๊ณ ๊ฐ€์šฉ์„ฑ

Keepalived๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ ๊ฐ€์šฉ์„ฑ ๋ฐ ์ถ”๊ฐ€ Passive ๋…ธ๋“œ ๊ตฌ์„ฑํ•˜๊ธฐ

On-Premises ๋ฐฐํฌ์—์„œ Active-Active ์Œ ๋ฐ ์—ฌ๋Ÿฌ Passive ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NGINX Plus ์ธ์Šคํ„ด์Šค์˜ ๊ณ ๊ฐ€์šฉ์„ฑ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

1. ์†Œ๊ฐœ
2. Passive ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ 
3. Active-Active HA๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ 
4. ์ถ”๊ฐ€ Passive ๋…ธ๋“œ์— ๋Œ€ํ•œ Keepalived ๊ตฌ์„ฑํ•˜๊ธฐ
5. Active-Active HA๋ฅผ ์œ„ํ•œ keepalived ๊ตฌ์„ฑํ•˜๊ธฐ
6. Active-Active HA๋ฅผ ์œ„ํ•œ NGINX Plus ๊ตฌ์„ฑ
6-1. ๊ฐ ๋…ธ๋“œ์—์„œ ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋งž๊ฒŒ NGINX Plus ๊ตฌ์„ฑํ•˜๊ธฐ
6-2. ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ NGINX Plus ๊ตฌ์„ฑํ•˜๊ธฐ
7. ๋ฉ”์„œ๋“œ ๊ฒฐํ•ฉ ๋ฐ ํ™•์žฅ
7-1. 3๊ฐœ ์ด์ƒ์˜ ๋…ธ๋“œ์—์„œ All-Active HA ๊ตฌ์„ฑํ•˜๊ธฐ
7-2. Active-Active-Passive HA ๊ตฌ์„ฑํ•˜๊ธฐ

1. ์†Œ๊ฐœ

NGINX Plus๋Š” keepalived๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ‘œ์ค€ Active-Passive ๋ฐฉ์‹์œผ๋กœ ๊ณ ๊ฐ€์šฉ์„ฑ(HA)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ NGINX Plus ๋…ธ๋“œ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์žฅ์•  ์กฐ์น˜ ์ด์ค‘ํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋…ธ๋“œ ๋ฐ keepalived ๊ตฌ์„ฑ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ์ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜์—ฌ ์ถ”๊ฐ€์ ์ธ ์ค‘๋ณต์„ฑ ๋ฐ ํ™•์žฅ์„ฑ ์˜ต์…˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ด๋ฏธ NGINX HA ์†”๋ฃจ์…˜๊ณผ ํ•จ๊ป˜ Active-Passive ๊ตฌํ˜„์œผ๋กœ NGINX Plus๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

Note: ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ ๋ฐฐํฌ์—์„œ๋Š” ํด๋ผ์šฐ๋“œ ์ œ๊ณต์—…์ฒด์—์„œ ์ œ๊ณตํ•˜๋Š” Layer 4 ๋˜๋Š” TCP Load Balancing ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Active-Active ๊ธฐ๋Šฅ์„ ์œ„ํ•ด NGINX Plus์— ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

2. ๊ณ ๊ฐ€์šฉ์„ฑ Passive ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ 

๋งŽ์€ ์กฐ์ง์€ ์ค‘๋ณต์„ฑ Level์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, 2๋…ธ๋“œ Active-Passive ์‹œ์Šคํ…œ์€ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋‘ ๋…ธ๋“œ๊ฐ€ ๋ชจ๋‘ ๋‹ค์šด๋  ๊ฒฝ์šฐ ์ด๋ฅผ ๋Œ€์‹ ํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ์„ธ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ตฌ์„ฑ์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ ์ถ”๊ฐ€์ ์ธ ์ค‘๋ณต์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ค‘๋ณต์„ฑ์„ ์žƒ์ง€ ์•Š๊ณ  ๋…ธ๋“œ์—์„œ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. Active-Active ๊ณ ๊ฐ€์šฉ์„ฑ ๊ตฌ์„ฑ์„ ํ•˜๋Š” ์ด์œ 

๋‘ ๊ฐœ ์ด์ƒ์˜ ๋…ธ๋“œ๊ฐ€ ๋™์‹œ์— ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ” Active-Active” ๋ฐฉ์‹์œผ๋กœ NGINX Plus๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ™œ์„ฑ IP ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๊ฐ IP ์ฃผ์†Œ๋Š” ๋‹จ์ผ NGINX ์ธ์Šคํ„ด์Šค์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋ฉฐ, Keepalived ๊ตฌ์„ฑ์€ ์ด๋Ÿฌํ•œ IP ์ฃผ์†Œ๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ™œ์„ฑ ๋…ธ๋“œ์— ๋ถ„์‚ฐ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ์„œ๋น„์Šค์˜ DNS ์ด๋ฆ„์€ IP ์ฃผ์†Œ ์ค‘ ํ•˜๋‚˜๋กœ ํ™•์ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ฐ„์— IP ์ฃผ์†Œ๋ฅผ ๊ณต์œ ํ•˜์„ธ์š”.
  • Round-Robin DNS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ DNS ์ด๋ฆ„์„ ์—ฌ๋Ÿฌ IP ์ฃผ์†Œ์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ์„ผํ„ฐ Edge Load Balancer์™€ ๊ฐ™์€ L3 Load Balancing ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ IP ์ฃผ์†Œ ๊ฐ„์— L3 ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

Active-Active๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Load Balancing ํด๋Ÿฌ์Šคํ„ฐ์˜ ์šฉ๋Ÿ‰์„ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ Active-Active ์Œ์˜ ๋‹จ์ผ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์šฉ๋Ÿ‰์ด ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ๋‘ ๋…ธ๋“œ๊ฐ€ ๋ชจ๋‘ Active ์ƒํƒœ์ผ ๋•Œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ์„ ํก์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ์ „ ์ˆ˜๋‹จ์œผ๋กœ Active-Active๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋” ํฐ ๊ทœ๋ชจ์˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Active-Active๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๋งŽ์€ ์ด์ค‘ํ™”๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Note: Load Balancing ํด๋Ÿฌ์Šคํ„ฐ์˜ NGINX ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ตฌ์„ฑ์ด๋‚˜ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. Active-Active ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์–ป์œผ๋ ค๋ฉด ๋™์ผํ•œ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์ด ๋™์ผํ•œ Active IP ์ฃผ์†Œ๋กœ ๋ผ์šฐํŒ…๋˜๋„๋ก ํ•˜๊ณ , ์„œ๋ฒ„ ์ธก ์ƒํƒœ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” sticky cookie์™€ ๊ฐ™์€ ์„ธ์…˜ ์ง€์†์„ฑ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

4. ๊ณ ๊ฐ€์šฉ์„ฑ ์ถ”๊ฐ€ Passive ๋…ธ๋“œ์— ๋Œ€ํ•œ Keepalived ๊ตฌ์„ฑํ•˜๊ธฐ

๊ธฐ์กด NGINX Plus Active-Passive HA ์Œ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ Passive ๋…ธ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

1. ์ƒˆ ๋…ธ๋“œ์— nginx-plus ๋ฐ nginx-ha-keepalived ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ณด์กฐ ๋…ธ๋“œ์˜ /etc/keepalived/keepalived.conf๋ฅผ ์ƒˆ ๋…ธ๋“œ์˜ ๋™์ผํ•œ ์œ„์น˜๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

3. ์ƒˆ ๋…ธ๋“œ์—์„œ keepalived.conf๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค๋ฅธ ๋…ธ๋“œ๋ณด๋‹ค ๋‚ฎ์€ priority๋ฅผ ๊ฐ–๋„๋ก vrrp_instance ๋ธ”๋ก์˜ priority๋ฅผ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.
  • ์ƒˆ ๋…ธ๋“œ์˜ ํ˜ธ์ŠคํŠธ IP ์ฃผ์†Œ์™€ ์ผ์น˜ํ•˜๋„๋ก unicast_src_ip๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋‚˜์—ด๋˜๋„๋ก ๋ณด์กฐ ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋ฅผ unicast_peer ์„น์…˜์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” IP ์ฃผ์†Œ๊ฐ€ 192.168.10.12์ธ ์ถ”๊ฐ€ Passive ๋…ธ๋“œ์— ์žˆ๋Š” keepalived.conf ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋‘ ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋Š” 192.168.10.10๊ณผ 192.168.10.11์ž…๋‹ˆ๋‹ค. ๊ฐ€์ƒ IP ์ฃผ์†Œ(VIP)๋Š” 192.168.10.100์ž…๋‹ˆ๋‹ค.

vrrp_script chk_nginx_service {
    script  "/usr/lib/keepalived/nginx-ha-check"
    interval 3
    weight   50
}

vrrp_instance VI_1 {
    interface         eth0
    state             BACKUP
    priority          99
    virtual_router_id 51
    advert_int        1
    accept
    unicast_src_ip    192.168.10.12

    unicast_peer {
        192.168.10.10
        192.168.10.11
    }

    virtual_ipaddress {
        192.168.10.100
    }

    track_script {
        chk_nginx_service
    }

    notify "/usr/lib/keepalived/nginx-ha-notify"
}

4. ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ keepalived.conf๋ฅผ ํŽธ์ง‘ํ•˜์—ฌ ์ƒˆ Passive ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋ฅผ unicast_peer ์„น์…˜์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋‚˜์—ด๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

unicast_peer {
    192.168.10.11
    192.168.10.12
}

5. ๋ชจ๋“  ๋…ธ๋“œ์—์„œ keepalived๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

6. ์ฒ˜์Œ ๋‘ ๋…ธ๋“œ์—์„œ NGINX Plus๋ฅผ ์ค‘์ง€ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  NGINX Plus ๋…ธ๋“œ์—๋Š” ๋™์ผํ•œ ๊ตฌ์„ฑ ๋ฐ SSL ์ธ์ฆ์„œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5. Active-Active HA๋ฅผ ์œ„ํ•œ keepalived ๊ตฌ์„ฑํ•˜๊ธฐ

๋‘ ๋…ธ๋“œ์— ๋™์‹œ์— ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ VIP๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ƒˆ VIP๋Š” ์ด์ „ Passive ๋…ธ๋“œ์—์„œ ํ™œ์„ฑํ™”๋˜๋ฏ€๋กœ ๊ฐ ๋…ธ๋“œ๋Š” ์ž์ฒด VIP๋กœ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด NGINX Plus HA ์Œ์„ Active- Active๋กœ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

1. ๋ณด์กฐ ๋…ธ๋“œ์—์„œ keepalived.conf๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

  • ์ „์ฒด vrrp_instance block VI_1 ์„น์…˜์„ ๋ณต์‚ฌํ•˜์—ฌ ๊ธฐ์กด ๋ธ”๋ก ์•„๋ž˜์— ๋ถ™์—ฌ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ๋ณต์‚ฌํ•œ vrrp_instance ์„น์…˜์—์„œ:
    • ์ƒˆ vrrp_instance์˜ ์ด๋ฆ„์„ VI_2 ๋˜๋Š” ๋‹ค๋ฅธ ๊ณ ์œ  ์ด๋ฆ„์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    • virtual_router_id๋ฅผ 61 ๋˜๋Š” ๋‹ค๋ฅธ ๊ณ ์œ  ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
    • virtual_ipaddress๋ฅผ ๋™์ผํ•œ ์„œ๋ธŒ๋„ท์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ IP ์ฃผ์†Œ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค(์ด ์˜ˆ์ œ์—์„œ๋Š” 192.168.10.101).
    • priority ๊ฐ’์„ 100์œผ๋กœ ๋ณ€๊ฒฝ
vrrp_script chk_nginx_service {
    script  "/usr/lib/keepalived/nginx-ha-check"
    interval 3
    weight   50
}

vrrp_instance VI_1 {
    interface         eth0
    state             BACKUP
    priority          101
    virtual_router_id 51
    advert_int        1
    accept
    unicast_src_ip    192.168.10.10

    unicast_peer {
        192.168.10.11
    }

    virtual_ipaddress {
        192.168.10.100
    }

    track_script {
        chk_nginx_service
    }

    notify "/usr/lib/keepalived/nginx-ha-notify"
}

vrrp_instance VI_2 {
    interface         eth0
    state             BACKUP
    priority          100
    virtual_router_id 61
    advert_int        1
    accept
    unicast_src_ip    192.168.10.10

    unicast_peer {
        192.168.10.11
    }

    virtual_ipaddress {
        192.168.10.101
    }

    track_script {
        chk_nginx_service
    }

    notify "/usr/lib/keepalived/nginx-ha-notify"
}

2. ๊ธฐ๋ณธ ๋…ธ๋“œ์—์„œ keepalived.conf๋ฅผ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณด์กฐ ๋…ธ๋“œ์—์„œ ์ˆ˜ํ–‰ํ•œ ํŽธ์ง‘์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ vrrp_instance ๋‚ด์˜ priority๋ฅผ 99 ๋˜๋Š” ๋ณด์กฐ ๋…ธ๋“œ๋ณด๋‹ค ๋‚ฎ์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ชจ๋“  ๋…ธ๋“œ์—์„œ keepalived๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ํŒŒ์ผ ๋ฐ SSL ์ธ์ฆ์„œ ํŒŒ์ผ ๋™๊ธฐํ™”๋Š” ์ด ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์ง€๋งŒ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ NGINX Plus ๊ตฌ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

6. Active-Active ๊ณ ๊ฐ€์šฉ์„ฑ ๊ตฌ์„ฑ์„ ์œ„ํ•œ NGINX Plus

์ด์ œ ๋‘ ๊ฐœ์˜ NGINX Plus ๋…ธ๋“œ๊ฐ€ ์ž์ฒด VIP๋กœ ํ™œ์„ฑํ™”๋˜์—ˆ์œผ๋ฏ€๋กœ NGINX Plus ์ž์ฒด๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ๋…ธ๋“œ์— ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•˜๋Š” ๋ฐ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜ 1์€ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ฐ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ต์…˜ 2๋Š” ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

Note: Load Balancing ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์„ธ์…˜ ์ง€์†์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ํ™œ์„ฑ ๋…ธ๋“œ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜๋Š” Sticky Cookie, Sticky Route ๋˜๋Š” IP ํ•ด์‹œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Sticky Learn์€ ํ™œ์„ฑ ๋…ธ๋“œ ๊ฐ„์— ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ์„ธ์…˜ ํ…Œ์ด๋ธ”์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

6-1. ๊ฐ ๋…ธ๋“œ์—์„œ ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋งž๊ฒŒ NGINX Plus ๊ตฌ์„ฑํ•˜๊ธฐ

์ด ๊ตฌ์„ฑ์—์„œ ๊ฐ NGINX Plus ๋…ธ๋“œ๋Š” Active VIP๊ฐ€ ์žˆ๋Š” server ๋ธ”๋ก์— ๋Œ€ํ•œ ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Active ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€ VIP์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๋…ธ๋“œ๊ฐ€ ๋˜์–ด ์—ฐ๊ฒฐ๋œ server ๋ธ”๋ก์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ server ๋ธ”๋ก์—๋Š” ์ˆ˜์‹  ์ค‘์ธ VIP๋ฅผ ์ง€์ •ํ•˜๋Š” listen ์ง€์‹œ๋ฌธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ์„น์…˜์˜ Active-Active keepalived ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๋™์ผํ•œ ๋‘ ๊ฐœ์˜ VIP๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ 1์€ NGINX Plus ๋…ธ๋“œ 1์—์„œ ํ™œ์„ฑํ™”๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ 2๋Š” NGINX ๋…ธ๋“œ 2์—์„œ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.

server {
    listen 192.168.10.100:80;

    location / {
        root /application1;
    }
}

server {
    listen 192.168.10.101:80;

    location / {
        root /application2;
    }
}

6-2. ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ NGINX Plus ๊ตฌ์„ฑํ•˜๊ธฐ

์ด ๊ตฌ์„ฑ์—์„œ NGINX Plus๋Š” ๋ชจ๋“  VIP์—์„œ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ VIP๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‹ค์Œ์œผ๋กœ ๋†’์€ ๋…ธ๋“œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DNS Load Balancing ๊ตฌ์„ฑ์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ NGINX Plus ๋…ธ๋“œ๋Š” ๋ชจ๋“  ์š”์ฒญ์„ ์ˆ˜์‹  ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. DNS Load Balancing์€ ์š”์ฒญ์„ NGINX Plus ๋…ธ๋“œ์— ๋ถ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ Round-Robin DNS๋กœ ์ถฉ๋ถ„ํ•˜๋ฉฐ DNS ์„œ๋ฒ„ ์„ค๋ช…์„œ์— ๋”ฐ๋ผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ VIP์— ๋Œ€ํ•ด ๋™์ผํ•œ FQDN(์ •๊ทœํ™”๋œ ๋„๋ฉ”์ธ ์ด๋ฆ„)์„ ๊ฐ€์ง„ A๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์ด๋ฆ„์ด ํ™•์ธ๋  ๋•Œ๋งˆ๋‹ค DNS ์„œ๋ฒ„์˜ ์‘๋‹ต์—๋Š” ๋ชจ๋“  VIP๊ฐ€ ํฌํ•จ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ์ˆœ์„œ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

server {
    listen *:80;

    location /app1 {
        root /application1;
    }

    location /app2 {
        root /application2;
    }
}

7. ๋ฉ”์„œ๋“œ ๊ฒฐํ•ฉ ๋ฐ ํ™•์žฅ

Active-Active HA๋ฅผ ์œ„ํ•œ NGINX Plus ๊ตฌ์„ฑ์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ๊ฒฐํ•ฉํ•˜์—ฌ Active-Active-Passive ๊ตฌ์„ฑ์„ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ Active ๋…ธ๋“œ ์ˆ˜์— ๊ด€๊ณ„์—†์ด ๊ตฌ์„ฑ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

7-1. 3๊ฐœ ์ด์ƒ์˜ ๋…ธ๋“œ์—์„œ All-Active HA ๊ตฌ์„ฑํ•˜๊ธฐ

๋‹ค์Œ keepalived ๊ตฌ์„ฑ์€ Active-Active-Active ๊ตฌ์„ฑ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Active ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์„ธ ๋ฒˆ์งธ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ๋Š” ํ•œ ๋ช…์˜ VIP์— ๋Œ€ํ•ด Active, ๋‘ ๋ฒˆ์งธ ๋…ธ๋“œ๋Š” ํ•œ ๋ช…์˜ VIP์— ๋Œ€ํ•ด Active, ์„ธ ๋ฒˆ์งธ ๋…ธ๋“œ๋Š” ํ•œ ๋ช…์˜ VIP์— ๋Œ€ํ•ด Active์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

vrrp_script chk_nginx_service {
    script   "/usr/lib/keepalived/nginx-ha-check"
    interval 3
    weight   50
}

vrrp_instance VI_1 {
    interface         eth0
    state             BACKUP
    priority          101
    virtual_router_id 51
    advert_int        1
    accept
    unicast_src_ip    192.168.10.10

    unicast_peer {
        192.168.10.11
        192.168.10.12
        192.168.10.13
    }

    virtual_ipaddress {
        192.168.10.100
    }

    track_script {
        chk_nginx_service
    }

    notify "/usr/lib/keepalived/nginx-ha-notify"
}

vrrp_instance VI_2 {
    interface         eth0
    state             BACKUP
    priority          100
    virtual_router_id 61
    advert_int        1
    accept
    unicast_src_ip    192.168.10.10

    unicast_peer {
        192.168.10.11
        192.168.10.12
        192.168.10.13
    }

    virtual_ipaddress {
        192.168.10.101
    }

    track_script {
        chk_nginx_service
    }

    notify "/usr/lib/keepalived/nginx-ha-notify"
}

vrrp_instance VI_3 {
    interface         eth0
    state             BACKUP
    priority          99
    virtual_router_id 71
    advert_int        1
    accept
    unicast_src_ip    192.168.10.10

    unicast_peer {
        192.168.10.11
        192.168.10.12
        192.168.10.13
    }

    virtual_ipaddress {
        192.168.10.102
    }

    track_script {
        chk_nginx_service
    }

    notify "/usr/lib/keepalived/nginx-ha-notify"
}

7-2. Active-Active-Passive HA ๊ตฌ์„ฑํ•˜๊ธฐ

์ด ์˜ˆ์ œ keepalived ๊ตฌ์„ฑ์€ Active-Active-Passive ๊ตฌ์„ฑ์˜ Passive ๋…ธ๋“œ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€ Passive ๋…ธ๋“œ์— ๋Œ€ํ•œ keepalived ๊ตฌ์„ฑ ๋ฐ Active-Active HA์— ๋Œ€ํ•œ keepalived ๊ตฌ์„ฑ์˜ ๋‹จ๊ณ„๋ฅผ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

vrrp_script chk_nginx_service {
    script   "/usr/lib/keepalived/nginx-ha-check"
    interval 3
    weight   50
}

vrrp_instance VI_1 {
    interface         eth0
    state             BACKUP
    priority          99
    virtual_router_id 51
    advert_int        1
    accept
    unicast_src_ip    192.168.10.12

    unicast_peer {
        192.168.10.10
        192.168.10.11
    }

    virtual_ipaddress {
        192.168.10.100
    }

    track_script {
        chk_nginx_service
    }

    notify "/usr/lib/keepalived/nginx-ha-notify"
}

vrrp_instance VI_2 {
    interface         eth0
    state             BACKUP
    priority          99
    virtual_router_id 61
    advert_int        1
    accept
    unicast_src_ip    192.168.10.12

    unicast_peer {
        192.168.10.10
        192.168.10.11
    }

    virtual_ipaddress {
        192.168.10.101
    }

    track_script {
        chk_nginx_service
    }

    notify "/usr/lib/keepalived/nginx-ha-notify"
}