Load Balancer - HAProxy

์ด ๊ธ€์—์„œ ์„ค๋ช…ํ•˜๋Š” ์„œ๋น„์Šค ๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ๊ฐ€์ƒ ๋จธ์‹ , ๊ณต์ธ IP, ๋„๋ฉ”์ธ์€ ๋ชจ๋‘ ์ค€๋น„๋˜์–ด ์žˆ์Œ์„ ์ „์ œํ•จ

์„œ๋น„์Šค ๊ตฌ์„ฑ๋„

์„œ๋ฒ„ ์ •๋ณด

๊ฐ€์ƒ๋จธ์‹ 
IP
์šด์˜์ฒด์ œ
์šฉ๋„

VM1

192.168.10.116

Linux (CentOS 7)

Load Balancer

VM2

192.168.10.121

WindowsServer2016

์›น ์„œ๋น„์Šค (IIS)

VM3

192.168.10.122

WindowsServer2016

์›น ์„œ๋น„์Šค (IIS)

VM4

192.168.10.123

WindowsServer2016

์›น ์„œ๋น„์Šค (IIS)

VM5

192.168.10.125

WindowsServer2016

์›น ์„œ๋น„์Šค (IIS)

HAProxy ์„ค์ •

์„ค์น˜

sudo yum -y install haproxy

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ธฐ๋ณธ์ ์ธ ์„ค์ •ํŒŒ์ผ์€ ๋‹ค์Œ ๊ฒฝ๋กœ์— ์žˆ์Œ

vi /etc/haproxy/haproxy.cfg

ํŒŒ์ผ ๋‚ด์šฉ ์ˆ˜์ •

๋ฐฑ์—”๋“œ ์„ค์ •

backend web_main
    balance roundrobin
    server web1 192.168.10.121:80 check
    server web2 192.168.10.122:80 check
	
backend web_abc
    balance roundrobin
    server web1 192.168.10.123:80 check
	
backend web_xyz
    balance roundrobin
    server web1 192.168.10.125:80 check

HTTP ์„ค์ •

frontend http_front
    bind *:80
    default_backend web_main

WEB UI ์„ค์ •

listen stats
    bind *:9000
    mode http
    stats enable
    stats hide-version
    stats realm Haproxy Statistics
    stats uri /

HAProxy ์„œ๋น„์Šค

์‹œ์ž‘

systemctl start haproxy

๋ถ€ํŒ… ํ›„ ์ž๋™ ์‹คํ–‰

systemctl enable haproxy

์ƒํƒœ ํ™•์ธ

systemctl status haproxy

์‹คํ–‰ ์˜ค๋ฅ˜ ์‹œ ํ™•์ธ ๋ฐฉ๋ฒ•: ๋ฃจํŠธ๋กœ ํฌ๊ทธ๋ผ์šด๋“œ์—์„œ ์ˆ˜๋™์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธ

haproxy -f /etc/haproxy/haproxy.cfg -db

์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š๊ณ  ์•„๋ž˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ๊ฐ™์ด ๋œฐ ๊ฒฝ์šฐ

์˜ค๋ฅ˜๋ฉ”์‹œ์ง€: "Starting frontend mssql_frontend: cannot bind socket [0.0.0.0:1433]"

setsebool -P haproxy_connect_any=1

setsebool -P haproxy_connect_any=1 ๋ช…๋ น์–ด์˜ ์—ญํ• 

  • setsebool: SELinux์˜ boolean ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ช…๋ น์–ด

  • -P: ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์˜๊ตฌ์ ์œผ๋กœ ์ ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ์žฌ๋ถ€ํŒ… ํ›„์—๋„ ์œ ์ง€

  • haproxy_connect_any=1: HAProxy๊ฐ€ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” boolean ๊ฐ’์„ ํ™œ์„ฑํ™”

๋ฐฉํ™”๋ฒฝ ์„ค์ • (ํฌํŠธ ๋ฐ ์„œ๋น„์Šค ๋“ฑ๋ก)

์ƒˆ๋กœ์šด zone ์ƒ์„ฑ

firewall-cmd --permanent --new-zone=webserver

๋ฐฉํ™”๋ฒฝ์— ์„œ๋น„์Šค ์ถ”๊ฐ€

firewall-cmd --permanent --zone=webserver --add-service=http
firewall-cmd --permanent --zone=webserver --add-service=https

๋ฐฉํ™”๋ฒฝ์— ํฌํŠธ ์ถ”๊ฐ€

firewall-cmd --permanent --zone=webserver --add-port=80/tcp
firewall-cmd --permanent --zone=webserver --add-port=443/tcp
firewall-cmd --permanent --zone=webserver --add-port=9000/tcp

firewalld ์žฌ์‹œ์ž‘ ๋ฐ ์ƒˆ๋กœ ๋“ฑ๋กํ•œ zone ํ™œ์„ฑํ™”

firewall-cmd --reload
firewall-cmd --set-default-zone=webserver

์ •์ƒ ์„ค์ • ์—ฌ๋ถ€ ํ™•์ธ

firewall-cmd --list-services --zone=webserver
firewall-cmd --list-ports --zone=webserver

์ˆ˜์‹ ์ค‘์ธ ํฌํŠธ ํ™•์ธ

  • ๋ฐฉํ™”๋ฒฝ์—์„œ ํฌํŠธ๋ฅผ ์„ค์ •ํ•ด๋„ ํ•ด๋‹น ํฌํŠธ๋กœ ์‹ค์ œ ์„œ๋น„์Šค๊ฐ€ ์ˆ˜์‹ ๋˜๊ณ  ์žˆ์–ด์•ผ ๋‚˜ํƒ€๋‚จ

  • ๋ฐฉํ™”๋ฒฝ ์˜คํ”ˆ์€ ๋˜์—ˆ์œผ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•ˆ ๋–  ์žˆ๋Š” ๊ฒƒ (ํฌํŠธ๋ฅผ ์—ด๊ณ  ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ์ƒํƒœ)

netstat -tulpn | grep LISTEN
grep -w '80/tcp' /etc/services

certbot SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰

letsencrypt์œผ๋กœ ๋ฐœ๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” certbot ํ”„๋กœ์„ธ์„œ๋กœ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ CentOS7์—์„œ๋Š” epel-release๋ฅผ ์„ค์น˜ํ•ด์•ผ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅ

sudo yum -y install epel-release
sudo yum -y install certbot

๋ฐœ๊ธ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

sudo certbot certonly --standalone -d <domain>

Multi-Domain

sudo certbot certonly --standalone -d <domain1> -d <domain2> -d <domain3>

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ ๊ฒฝ๋กœ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜

/etc/letsencrypt/live/<domain>/

ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š”๊ฒƒ์„ ๊ฐ„์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ๋‹ค

mkdir /etc/haproxy/certs
cat /etc/letsencrypt/live/<domain>/*.pem > /etc/haproxy/certs/ssl.pem

์ธ์ฆ์„œ ์ž๋™ ๊ฐฑ์‹  ์„ค์ •

Bash ์‰˜ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ž‘์„ฑ

vi /bin/letsencrypt.sh
#!/bin/sh

systemctl stop haproxy
/usr/bin/certbot renew > /var/log/letsencrypt/renew.log
cat /etc/letsencrypt/live/<domain>/*.pem > /etc/haproxy/certs/ssl.pem
fuser -k 80/tcp
systemctl start haproxy

์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์— ๊ถŒํ•œ ๋ถ€์—ฌ

chmod +x /bin/letsencrypt.sh

์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์‹คํ–‰ํ•˜๊ณ  ์ƒ์„ฑ๋œ ๋กœ๊ทธ ํŒŒ์ผ ๋งˆ์ง€๋ง‰ ์ˆ˜์ • ์ผ์ž ํ™•์ธ

/bin/letsencrypt.sh
ls -l /var/log/letsencrypt

crontab์„ ์ด์šฉํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ž๋™ ์‹คํ–‰ ์„ค์ •

sudo crontab -e

๋งค์ผ ์˜ค์ „ 3์‹œ ๋งˆ๋‹ค ์‹คํ–‰

0 3 * * * /bin/letsencrypt.sh

crontab ์„œ๋น„์Šค ์‹œ์ž‘

service crond start

HTTPS ๋ฐ ๋„๋ฉ”์ธ๋ณ„ ์ ‘์†ํ•  ๋ฐฑ์—”๋“œ ์„ค์ •

vi /etc/haproxy/haproxy.cfg

๊ธฐ์กด ์ •์˜ํ•œ 80 ํฌํŠธ ์„ค์ •์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ

  • HTTP ์š”์ฒญ์„ ๋ฐ›์•„๋“ค์ด๋Š” ํ”„๋ก ํŠธ์—”๋“œ๋กœ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTTPS๊ฐ€ ์•„๋‹Œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒฝ์šฐ์—๋Š” redirect ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTPS๋กœ ๋ฆฌ๋””๋ ‰์…˜

frontend http-in
    bind *:80
    redirect scheme https if !{ ssl_fc }

HTTPS ์„ค์ •

forntend https
    bind *:433 ssl crt /etc/haproxy/certs/ssl.pem
    acl host_abc hdr_end(host) -i abc.gsti.co.kr
    acl host_xyz hdr_end(host) -i xyz.gsti.co.kr
    mode http
    use_backend web_abc if host_abc
    use_backend web_xyz if host_xyz
    default_backend web_main

์—ฌ๋Ÿฌ๊ฐœ ์ธ์ฆ์„œ ํŒŒ์ผ(.pem) ์„ธํŒ… ๋ฐฉ๋ฒ• <์ฐธ๊ณ >

frontend ft_test
    mode http
    bind 0.0.0.0:443 ssl crt /certs/haproxy1.pem crt /certs/haproxy2.pem 
    use_backend bk_cert1 if { ssl_fc_sni my.example.com } # content switching based on SNI
    use_backend bk_cert2 if { ssl_fc_sni my.example.org } # content switching based on SNI

โ€ป ๋ฆฌ๋ˆ…์Šค ์˜คํ”ˆ๋œ ํฌํŠธ ํ™•์ธ ๋ฐ ๋“ฑ๋ก

์˜คํ”ˆ๋œ HTTP Port ํ™•์ธ๋ฐฉ๋ฒ•

semanage port -l | grep http_port_t

HTTP Port ์˜คํ”ˆํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•

semanage port -a -t http_port_t -p tcp 8081

HTTP Port ๋‹ซ๊ธฐ ์œ„ํ•ด ์ œ๊ฑฐ

semanage port -d -t http_port_t -p tcp 8081

๊ธฐํƒ€

Last updated