Skip to content

Latest commit

ย 

History

227 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

HAProxy 3 RPM ๋นŒ๋”

์ด ์ €์žฅ์†Œ๋Š” HAProxy 3.4.3์„ RHEL 8 / RHEL 9(๋ฐ Rocky Linux, AlmaLinux ๊ฐ™์€ ํ˜ธํ™˜ ๋ฐฐํฌํŒ)์— ๋ฐ”๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” RPM ํŒจํ‚ค์ง€๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒ„์ „์šฉ ํŒจํ‚ค์ง€๋ฅผ ํ•œ ๋ฒˆ์— ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

๋ฆฌ๋ˆ…์Šค ๋ฐฐํฌํŒ์ด ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” HAProxy๋Š” ์•ˆ์ •์„ฑ์„ ์œ„ํ•ด ๋ณดํ†ต ๋ช‡ ๋…„ ์ „ ๋ฒ„์ „์— ๋จธ๋ฌผ๋Ÿฌ ์žˆ์–ด์„œ, ACME ์ž๋™ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ฐ™์€ 3.x ์‹ ๊ทœ ๊ธฐ๋Šฅ์„ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ์ง์ ‘ ์†Œ์Šค๋ฅผ ๋ฐ›์•„ ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ์„ค์น˜ํ•˜๋ฉด ๋‚˜์ค‘์— ์‚ญ์ œ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์ง€์ €๋ถ„ํ•ด์ง‘๋‹ˆ๋‹ค.

์ด ์ €์žฅ์†Œ๋Š” ๊ทธ ์ค‘๊ฐ„์„ ๋ฉ”์›๋‹ˆ๋‹ค. ์ตœ์‹  HAProxy ์†Œ์Šค๋ฅผ ๋ฐ›์•„์„œ ์ปดํŒŒ์ผํ•˜๋˜, ๊ฒฐ๊ณผ๋ฌผ์„ RPM ํŒจํ‚ค์ง€๋กœ ํฌ์žฅํ•ด ์ค๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ dnf install๋กœ ์„ค์น˜ํ•˜๊ณ  dnf remove๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ง€์šธ ์ˆ˜ ์žˆ์œผ๋ฉฐ, systemd ์„œ๋น„์Šค ๋“ฑ๋กยท๋กœ๊ทธ ์„ค์ •ยท๋กœ๊ทธ ๋กœํ…Œ์ด์…˜๊นŒ์ง€ ๋ชจ๋‘ ์ž๋™์œผ๋กœ ์žกํž™๋‹ˆ๋‹ค.

์ฒ˜์Œ ์˜ค์…จ๋‹ค๋ฉด โ€” ๋น ๋ฅธ ์‹œ์ž‘ ์„ธ ์ค„๋งŒ ๋”ฐ๋ผ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ํ•„์š”ํ•  ๋•Œ ์ฐพ์•„๋ณด์„ธ์š”.

์–ด๋А ๋ฒ„์ „์„ ์“ธ์ง€ ๊ณ ๋ฏผ๋œ๋‹ค๋ฉด โ€” RELEASE.md ์— ๋ฒ„์ „๋ณ„ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ์ง€์› ๊ธฐ๊ฐ„, ์„ ํƒ ๊ธฐ์ค€์„ ์ •๋ฆฌํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.


๋ชฉ์ฐจ


๋น ๋ฅธ ์‹œ์ž‘

Docker๋งŒ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ์•„๋ž˜ ์„ธ ์ค„๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์— ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊น” ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค.

git clone https://github.com/DataDynamics-OSS/haproxy3-rpm-builder.git
cd haproxy3-rpm-builder
make run-docker

๋ช‡ ๋ถ„ ๋’ค RPM ํŒŒ์ผ์ด OS ๋ฒ„์ „๋ณ„๋กœ ๋‚˜๋‰˜์–ด ์ƒ๊น๋‹ˆ๋‹ค.

RPMS/
โ”œโ”€โ”€ el8/    โ† RHEL 8 / Rocky 8 / Alma 8 ์šฉ
โ””โ”€โ”€ el9/    โ† RHEL 9 / Rocky 9 / Alma 9 ์šฉ

๋Œ€์ƒ ์„œ๋ฒ„์˜ ๋ฒ„์ „์— ๋งž๋Š” ๊ฒƒ์„ ์˜ฎ๊ฒจ์„œ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

sudo dnf install -y ./RPMS/el9/haproxy-3.4.3-1.el9.x86_64.rpm
sudo systemctl enable --now haproxy

์ด์ œ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://<์„œ๋ฒ„์ฃผ์†Œ>:9000/haproxy_stats ์— ์ ‘์†ํ•˜๋ฉด ํ†ต๊ณ„ ํ™”๋ฉด์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ†ต๊ณ„ ํŽ˜์ด์ง€ ํ•ญ๋ชฉ์„ ๋ณด์„ธ์š”.


๋ฌด์—‡์ด ๋งŒ๋“ค์–ด์ง€๋‚˜์š”

๋นŒ๋“œ๊ฐ€ ๋๋‚˜๋ฉด OS ๋ฒ„์ „๋ณ„๋กœ RPM ํŒŒ์ผ ๋„ค ๊ฐœ์”ฉ ์ƒ๊น๋‹ˆ๋‹ค. ๋ณดํ†ต์€ ์ฒซ ๋ฒˆ์งธ ๊ฒƒ๋งŒ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ํฌ๊ธฐ ์„ค๋ช…
haproxy-3.4.3-1.el9.x86_64.rpm ์•ฝ 2.4 MB ์‹ค์ œ๋กœ ์„ค์น˜ํ•  ํŒจํ‚ค์ง€. HAProxy ๋ณธ์ฒด์™€ ์„ค์ • ํŒŒ์ผ์ด ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
haproxy-3.4.3-1.el9.src.rpm ์•ฝ 5.3 MB ์†Œ์Šค RPM. ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ด ํŒจํ‚ค์ง€๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•ด ๋นŒ๋“œํ•  ๋•Œ ์”๋‹ˆ๋‹ค.
haproxy-debuginfo-โ€ฆrpm ์•ฝ 48 KB ๋””๋ฒ„๊น… ์‹ฌ๋ณผ. ์žฅ์•  ๋ถ„์„์œผ๋กœ ์ฝ”์–ด ๋คํ”„๋ฅผ ๋œฏ์–ด๋ณผ ๋•Œ๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
haproxy-debugsource-โ€ฆrpm ์•ฝ 43 KB ๋””๋ฒ„๊น…์šฉ ์†Œ์Šค. ์œ„์™€ ๊ฐ™์€ ์šฉ๋„์ž…๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ด๋ฆ„์˜ 1์€ ํŒจํ‚ค์ง€ ๋ฆด๋ฆฌ์Šค ๋ฒˆํ˜ธ์ด๊ณ , el8/el9๊ฐ€ ์–ด๋А OS์šฉ์ธ์ง€ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. el8์€ RHEL 8ยทRocky 8ยทAlmaLinux 8์—, el9๋Š” RHEL 9ยทRocky 9ยทAlmaLinux 9์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „์„ ๋งž์ถฐ์„œ ์„ค์น˜ํ•˜์„ธ์š”. RHEL 8 ์„œ๋ฒ„์— el9 ํŒจํ‚ค์ง€๋ฅผ ๋„ฃ์œผ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์ด ๋งž์ง€ ์•Š์•„ ์„ค์น˜๊ฐ€ ๊ฑฐ๋ถ€๋˜๊ฑฐ๋‚˜ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋ฒ„์ „์€ cat /etc/redhat-release๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ํŒจํ‚ค์ง€๋Š” ๊ฐ™์€ ์†Œ์Šค์—์„œ ๋งŒ๋“ค์–ด์ง€์ง€๋งŒ ๊ทธ OS๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งž์ถฐ ๋นŒ๋“œ๋˜๋ฏ€๋กœ ๋‚ด์šฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ SSL ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

RHEL 8 RHEL 9
์ปดํŒŒ์ผ๋Ÿฌ GCC 8.5 GCC 11 ์ด์ƒ
OpenSSL 1.1.1 3.x

OpenSSL 1.1.1์€ 3.x๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹์€ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์–ด์„œ, ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ๋‹ค๋ฉด RHEL 8 ์ชฝ์ด ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜๋˜๋Š” ํŒŒ์ผ๋“ค

ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ๋‹ค์Œ ์œ„์น˜์— ํŒŒ์ผ์ด ๋†“์ž…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ญ˜ ๊ณ ์ณ์•ผ ํ• ์ง€ ํ—ท๊ฐˆ๋ฆด ๋•Œ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ฒฝ๋กœ ์„ค๋ช…
/usr/sbin/haproxy HAProxy ์‹คํ–‰ ํŒŒ์ผ
/etc/haproxy/haproxy.cfg ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์„ค์ • ํŒŒ์ผ. ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ ์—ฌ๊ธฐ์„œ ํ•ฉ๋‹ˆ๋‹ค.
/etc/haproxy/errors/ ์˜ค๋ฅ˜ ์‘๋‹ต HTML (400, 403, 500, 502, 503, 504 ๋“ฑ)
/usr/lib/systemd/system/haproxy.service systemd ์„œ๋น„์Šค ์ •์˜
/etc/rsyslog.d/49-haproxy.conf ๋กœ๊ทธ๋ฅผ ํŒŒ์ผ๋กœ ๋–จ๊ตฌ๋Š” rsyslog ๊ทœ์น™
/etc/logrotate.d/haproxy ๋กœ๊ทธ ์ž๋™ ์ •๋ฆฌ ๊ทœ์น™ (๋งค์ผ, 14์ผ ๋ณด๊ด€)
/var/log/haproxy/ ๋กœ๊ทธ๊ฐ€ ์Œ“์ด๋Š” ๊ณณ
/var/lib/haproxy/ ๋ณด์•ˆ ๊ฒฉ๋ฆฌ(chroot)์šฉ ๋นˆ ๋””๋ ‰ํ„ฐ๋ฆฌ
/usr/bin/halog ๋กœ๊ทธ ๋ถ„์„ ๋„๊ตฌ
/usr/bin/iprange IP ๋Œ€์—ญ ๊ณ„์‚ฐ ๋„๊ตฌ

์–ด๋–ค ๊ธฐ๋Šฅ์ด ์ผœ์ ธ ์žˆ๋‚˜์š”

๊ธฐ๋ณธ ๋นŒ๋“œ์—๋Š” ์‹ค๋ฌด์—์„œ ํ”ํžˆ ์“ฐ๋Š” ๊ธฐ๋Šฅ์ด ์ผœ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ํ›„ haproxy -vv ๋ช…๋ น์œผ๋กœ ์–ธ์ œ๋“  ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • SSL/TLS โ€” OpenSSL 3.x ์—ฐ๋™ (HTTPS ์ฒ˜๋ฆฌ)
  • ์••์ถ• โ€” zlib (gzip, deflate ์‘๋‹ต ์••์ถ•)
  • ์ •๊ทœ์‹ โ€” PCRE + JIT ๊ฐ€์†
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ โ€” ๊ธฐ๋ณธ 64์Šค๋ ˆ๋“œ, ์ตœ๋Œ€ 1024์Šค๋ ˆ๋“œ
  • ํˆฌ๋ช… ํ”„๋ก์‹œ, TCP Fast Open, ๋„คํŠธ์›Œํฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค
  • ACME โ€” ์ธ์ฆ์„œ ์ž๋™ ๋ฐœ๊ธ‰ (HAProxy 3.x ์‹ ๊ทœ ๊ธฐ๋Šฅ)

Lua ์Šคํฌ๋ฆฝํŠธ์™€ Prometheus ์ง€ํ‘œ๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๊บผ์ ธ ์žˆ๊ณ , ํ•„์š”ํ•˜๋ฉด ๋นŒ๋“œ ์˜ต์…˜์—์„œ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋นŒ๋“œ ์ค€๋น„ํ•˜๊ธฐ

๋นŒ๋“œ ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€์ด๊ณ , ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๊ณ ๋ฅด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Docker ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ์— ํ•„์š”ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ „๋ถ€ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ๋งŒ ์„ค์น˜๋˜๊ณ  ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ๋ถ„์˜ ์„œ๋ฒ„๋Š” ์กฐ๊ธˆ๋„ ๋”๋Ÿฌ์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค RHEL 8์šฉ๊ณผ RHEL 9์šฉ์„ ํ•œ ๋ฒˆ์— ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RHEL 8 ํŒจํ‚ค์ง€๋Š” RHEL 8 ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œํ•ด์•ผ ํ•˜๋Š”๋ฐ, Docker๋ฅผ ์“ฐ๋ฉด RHEL 8 ์„œ๋ฒ„๋ฅผ ๋”ฐ๋กœ ์ค€๋น„ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ๋…ธํŠธ๋ถ(๋งฅ์ด๋“  ์œˆ๋„์šฐ๋“  ๋ฆฌ๋ˆ…์Šค๋“ )์—์„œ ๋นŒ๋“œํ•ด์„œ RPM๋งŒ ์„œ๋ฒ„๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ง์ ‘ ๋นŒ๋“œ ๋ฐฉ์‹์€ Docker๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์ผ ๋•Œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋นŒ๋“œํ•˜๋Š” ์„œ๋ฒ„์™€ ๊ฐ™์€ ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋งŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RHEL 9 ์„œ๋ฒ„์—์„œ ๋นŒ๋“œํ•˜๋ฉด el9 ํŒจํ‚ค์ง€๋งŒ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋„๊ตฌ ์ˆ˜์‹ญ ๊ฐœ๊ฐ€ ๊ทธ ์„œ๋ฒ„์— ์„ค์น˜๋˜๋ฏ€๋กœ ์šด์˜ ์„œ๋ฒ„์—์„œ๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ๋นŒ๋“œ ๋„์ค‘ haproxy.org์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋‚ด๋ ค๋ฐ›์œผ๋ฏ€๋กœ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


๋ฐฉ๋ฒ• 1 โ€” Docker๋กœ ๋นŒ๋“œํ•˜๊ธฐ (๊ถŒ์žฅ)

Docker๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

docker --version

๊ทธ๋‹ค์Œ ์ €์žฅ์†Œ๋ฅผ ๋ฐ›์•„์„œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

git clone https://github.com/DataDynamics-OSS/haproxy3-rpm-builder.git
cd haproxy3-rpm-builder
make run-docker

์ด ํ•œ ์ค„์ด RHEL 8์šฉ๊ณผ RHEL 9์šฉ์„ ์ฐจ๋ก€๋กœ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ๊ฐ ๋ฒ„์ „๋งˆ๋‹ค ํ•ด๋‹น OS์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์šฐ๊ณ , ๊ทธ ์•ˆ์—์„œ HAProxy ์†Œ์Šค๋ฅผ ๋ฐ›์•„ ์ปดํŒŒ์ผํ•œ ๋’ค, ์™„์„ฑ๋œ RPM์„ RPMS/el8/๊ณผ RPMS/el9/๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฒ˜์Œ ์‹คํ–‰ํ•˜๋ฉด ์ด๋ฏธ์ง€ ๋‘ ๊ฐœ๋ฅผ ๋‚ด๋ ค๋ฐ›๊ณ  ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•˜๋А๋ผ 10~20๋ถ„์ฏค ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋ถ€ํ„ฐ๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์บ์‹œ๋˜์–ด ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋๋‚˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ls -lh RPMS/el8/ RPMS/el9/

ํ•œ์ชฝ๋งŒ ๋นŒ๋“œํ•˜๊ธฐ

RHEL 9๋งŒ ์“ด๋‹ค๋ฉด ๊ตณ์ด ๋‘˜ ๋‹ค ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. EL_VERSIONS๋กœ ์›ํ•˜๋Š” ๊ฒƒ๋งŒ ๊ณ ๋ฅด์„ธ์š”.

make run-docker EL_VERSIONS=9      # RHEL 9 ์šฉ๋งŒ
make run-docker EL_VERSIONS=8      # RHEL 8 ์šฉ๋งŒ
make run-docker EL_VERSIONS="8 9"  # ๋‘˜ ๋‹ค (๊ธฐ๋ณธ๊ฐ’)

๋ฒ ์ด์Šค ์ด๋ฏธ์ง€ ๋ฐ”๊พธ๊ธฐ

๊ธฐ๋ณธ๊ฐ’์€ Rocky Linux์ž…๋‹ˆ๋‹ค. AlmaLinux๋‚˜ ์‚ฌ๋‚ด ๋ฏธ๋Ÿฌ๋ฅผ ์“ฐ๋ ค๋ฉด ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

make run-docker BASE_IMAGE_8=almalinux:8 BASE_IMAGE_9=almalinux:9

Dockerfile์€ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. EL8๊ณผ EL9์˜ ์„ค์น˜ ํŒจํ‚ค์ง€ ๋ชฉ๋ก์ด ์™„์ „ํžˆ ๊ฐ™์•„์„œ, ํŒŒ์ผ์„ ๋ณต์ œํ•˜๋Š” ๋Œ€์‹  BASE_IMAGE ์ธ์ž๋กœ ๋ฒ ์ด์Šค๋งŒ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋‚˜์ค‘์— EL10์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋„ Makefile์— ํ•œ ์ค„๋งŒ ๋”ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๋ฐฉ๋ฒ• 2 โ€” ์„œ๋ฒ„์—์„œ ์ง์ ‘ ๋นŒ๋“œํ•˜๊ธฐ

์ด ๋ฐฉ๋ฒ•์€ RHEL 8 ๋˜๋Š” RHEL 9 ์„œ๋ฒ„์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ๊ทธ ์„œ๋ฒ„์™€ ๊ฐ™์€ ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋งŒ ๋งŒ๋“ค์–ด ๋ƒ…๋‹ˆ๋‹ค. RHEL 8 ์„œ๋ฒ„์—์„œ ๋นŒ๋“œํ•˜๋ฉด el8 ํŒจํ‚ค์ง€๊ฐ€, RHEL 9์—์„œ ๋นŒ๋“œํ•˜๋ฉด el9 ํŒจํ‚ค์ง€๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฐฐํฌํŒ(Fedora, Ubuntu ๋“ฑ)์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ฆ‰์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

error: haproxy: unsupported build target (dist=.fc44). RHEL 8 or 9 required.

๋จผ์ € ๋นŒ๋“œ์— ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

sudo dnf groupinstall -y "Development Tools"
sudo dnf install -y openssl-devel zlib-devel systemd-devel pcre-devel \
                    rpm-build redhat-rpm-config wget

๊ทธ๋‹ค์Œ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

git clone https://github.com/DataDynamics-OSS/haproxy3-rpm-builder.git
cd haproxy3-rpm-builder
make

Docker ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ ๊ฒฐ๊ณผ๋ฌผ์ด RPMS/๊ฐ€ ์•„๋‹ˆ๋ผ ์•„๋ž˜ ๊ฒฝ๋กœ์— ์ƒ๊น๋‹ˆ๋‹ค. ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šฐ๋‹ˆ ์ฃผ์˜ํ•˜์„ธ์š”.

ls -lh rpmbuild/RPMS/x86_64/

์ฐธ๊ณ  โ€” make๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ sudo ์—†์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(NO_SUDO=1์ด ๊ธฐ๋ณธ๊ฐ’). ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๊ถŒํ•œ์œผ๋กœ ๋นŒ๋“œํ•˜๋‹ค๊ฐ€ ๊ถŒํ•œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด make NO_SUDO=0์œผ๋กœ ๊ฐ ๋‹จ๊ณ„์— sudo๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋นŒ๋“œ ์˜ต์…˜

์˜ต์…˜์€ make ๋’ค์— ์ด๋ฆ„=๊ฐ’ ํ˜•ํƒœ๋กœ ๋ถ™์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Lua๋ฅผ ์ผœ๋ ค๋ฉด make run-docker USE_LUA=1์ฒ˜๋Ÿผ ์”๋‹ˆ๋‹ค.

์˜ต์…˜ ๊ธฐ๋ณธ๊ฐ’ ์„ค๋ช…
MAINVERSION 3.4 HAProxy ๊ณ„์—ด ๋ฒ„์ „. ๋‹ค์šด๋กœ๋“œ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
VERSION 3.4.3 ์ •ํ™•ํ•œ HAProxy ๋ฒ„์ „
RELEASE 1 ํŒจํ‚ค์ง€ ๋ฆด๋ฆฌ์Šค ๋ฒˆํ˜ธ. ๊ฐ™์€ HAProxy ๋ฒ„์ „์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค ๋•Œ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.
EL_VERSIONS 8 9 ์–ด๋А OS ๋ฒ„์ „์šฉ์œผ๋กœ ๋นŒ๋“œํ• ์ง€ (Docker ๋ฐฉ์‹ ์ „์šฉ)
BASE_IMAGE_8 rockylinux:8 RHEL 8 ๋นŒ๋“œ์— ์“ธ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€
BASE_IMAGE_9 rockylinux:9 RHEL 9 ๋นŒ๋“œ์— ์“ธ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€
USE_LUA 0 Lua ์Šคํฌ๋ฆฝํŠธ ์ง€์›
USE_PROMETHEUS 0 Prometheus ์ง€ํ‘œ ๋…ธ์ถœ ๊ธฐ๋Šฅ
NO_SUDO 1 1์ด๋ฉด sudo ์—†์ด, 0์ด๋ฉด ๊ฐ ๋ช…๋ น์— sudo๋ฅผ ๋ถ™์—ฌ ์‹คํ–‰

Lua ์ง€์› ์ผœ๊ธฐ

make run-docker USE_LUA=1

Lua๋ฅผ ์ผœ๋ฉด HAProxy ์„ค์ • ์•ˆ์—์„œ Lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์š”์ฒญ ๋ผ์šฐํŒ… ๊ทœ์น™์ด๋‚˜ ์ปค์Šคํ…€ ์ธ์ฆ ๋กœ์ง์ฒ˜๋Ÿผ, ๊ธฐ๋ณธ ์„ค์ • ๋ฌธ๋ฒ•๋งŒ์œผ๋กœ๋Š” ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ์ฒ˜๋ฆฌ๋ฅผ ์ง์ ‘ ์ฝ”๋“œ๋กœ ์งค ๋•Œ ์”๋‹ˆ๋‹ค. ๋นŒ๋“œ ๊ณผ์ •์—์„œ Lua 5.4.7์„ ์†Œ์Šค๋กœ ํ•จ๊ป˜ ์ปดํŒŒ์ผํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๋ช‡ ๋ถ„ ๋” ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

Prometheus ์ง€ํ‘œ ์ผœ๊ธฐ

make run-docker USE_PROMETHEUS=1

Prometheus๋‚˜ Grafana๋กœ HAProxy๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค๋ฉด ์ด ์˜ต์…˜์„ ์ผœ์„ธ์š”. ์ผœ๊ณ  ๋‚˜๋ฉด ์„ค์ • ํŒŒ์ผ์— ์•„๋ž˜์ฒ˜๋Ÿผ ์ถ”๊ฐ€ํ•ด์„œ ์ง€ํ‘œ ์ˆ˜์ง‘ ์ฃผ์†Œ๋ฅผ ์—ด์–ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

frontend metrics
  bind :8405
  http-request use-service prometheus-exporter if { path /metrics }

์ด์ œ http://<์„œ๋ฒ„์ฃผ์†Œ>:8405/metrics ์—์„œ Prometheus๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์˜ ์ง€ํ‘œ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ๋ˆˆ์œผ๋กœ ๋ณด๋Š” ์šฉ๋„๋ผ๋ฉด ํ†ต๊ณ„ ํŽ˜์ด์ง€๊ฐ€ ๋” ํŽธํ•˜๊ณ , ์žฅ๊ธฐ ์ถ”์„ธ๋ฅผ ์ €์žฅํ•˜๊ณ  ์•Œ๋ฆผ์„ ๊ฑธ๋ ค๋ฉด Prometheus ์ชฝ์ด ๋งž์Šต๋‹ˆ๋‹ค.

๋‘ ์˜ต์…˜์„ ํ•จ๊ป˜ ์ผœ๋Š” ๊ฒƒ๋„ ๋ฉ๋‹ˆ๋‹ค.

make run-docker USE_LUA=1 USE_PROMETHEUS=1

์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ

๋งŒ๋“ค์–ด์ง„ RPM์„ ๋Œ€์ƒ ์„œ๋ฒ„๋กœ ์˜ฎ๊ธด ๋’ค ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๋ฒ„์ „์— ๋งž๋Š” ํŒŒ์ผ์„ ๊ณจ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

cat /etc/redhat-release                                   # ์„œ๋ฒ„๊ฐ€ 8์ธ์ง€ 9์ธ์ง€ ํ™•์ธ
sudo dnf install -y ./haproxy-3.4.3-1.el9.x86_64.rpm      # el9 ์„œ๋ฒ„๋ผ๋ฉด

dnf๋Š” ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(OpenSSL, zlib, PCRE, rsyslog)๋ฅผ ์•Œ์•„์„œ ํ•จ๊ป˜ ์„ค์น˜ํ•ด ์ค๋‹ˆ๋‹ค. ์„ค์น˜๊ฐ€ ์ž˜ ๋๋Š”์ง€ ๋ฒ„์ „์„ ํ™•์ธํ•ด ๋ด…๋‹ˆ๋‹ค.

haproxy -v

์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋ถ€ํŒ… ์‹œ ์ž๋™ ์‹œ์ž‘๋˜๋„๋ก ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. --now๊ฐ€ "์ง€๊ธˆ ๋ฐ”๋กœ ์‹œ์ž‘"์ด๊ณ  enable์ด "๋ถ€ํŒ…ํ•  ๋•Œ๋„ ์‹œ์ž‘"์ž…๋‹ˆ๋‹ค.

sudo systemctl enable --now haproxy
sudo systemctl status haproxy

active (running)์ด ๋ณด์ด๋ฉด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

์„ค์ •์„ ๋ฐ”๊พผ ๋’ค์—๋Š” ๋จผ์ € ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ๋ถ€ํ„ฐ ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด์„ธ์š”. ์ž˜๋ชป๋œ ์„ค์ •์œผ๋กœ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ์„œ๋น„์Šค๊ฐ€ ๋‚ด๋ ค๊ฐ„ ์ฑ„ ์•ˆ ์˜ฌ๋ผ์˜ต๋‹ˆ๋‹ค.

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

์•„๋ฌด ๋ฉ”์‹œ์ง€ ์—†์ด ๋๋‚˜๋ฉด ์ด์ƒ์ด ์—†๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ–ˆ๋‹ค๋ฉด ์žฌ์‹œ์ž‘(restart)์ด ์•„๋‹ˆ๋ผ ๋ฆฌ๋กœ๋“œ(reload) ๋ฅผ ์“ฐ์„ธ์š”. ๋ฆฌ๋กœ๋“œ๋Š” ๊ธฐ์กด ์—ฐ๊ฒฐ์„ ๋Š์ง€ ์•Š๊ณ  ์„ค์ •๋งŒ ์ƒˆ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

sudo systemctl reload haproxy

๋ฐฉํ™”๋ฒฝ์ด ์ผœ์ ธ ์žˆ๋‹ค๋ฉด ์‚ฌ์šฉํ•  ํฌํŠธ๋ฅผ ์—ด์–ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

sudo firewall-cmd --permanent --add-port=9000/tcp   # ํ†ต๊ณ„ ํŽ˜์ด์ง€
sudo firewall-cmd --reload

ํ†ต๊ณ„(Stats) ํŽ˜์ด์ง€

HAProxy์—๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด์–ด ๋ณด๋Š” ์‹ค์‹œ๊ฐ„ ์ƒํƒœ ํ™”๋ฉด์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ํ•  ํ•„์š” ์—†์ด, ์ง€๊ธˆ ํŠธ๋ž˜ํ”ฝ์ด ์–ผ๋งˆ๋‚˜ ๋“ค์–ด์˜ค๋Š”์ง€ ยท ์–ด๋А ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ ์ฃฝ์—ˆ๋Š”์ง€ ยท ์˜ค๋ฅ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋‚˜๋Š”์ง€๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฅ์• ๊ฐ€ ๋‚ฌ์„ ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์—ด์–ด ๋ณด๊ฒŒ ๋˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

์ ‘์†ํ•˜๊ธฐ

์ด ํŒจํ‚ค์ง€๋Š” ํ†ต๊ณ„ ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ผœ์ง„ ์ฑ„๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•œ ๋’ค ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„๋ž˜ ์ฃผ์†Œ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๋ฉ๋‹ˆ๋‹ค.

http://<์„œ๋ฒ„์ฃผ์†Œ>:9000/haproxy_stats

ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

curl -s http://127.0.0.1:9000/haproxy_stats | head

ํ™”๋ฉด์ด ์•ˆ ๋œฌ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ ๋ฐฉํ™”๋ฒฝ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์œ„ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ์˜ firewall-cmd ๋ช…๋ น์œผ๋กœ 9000 ํฌํŠธ๋ฅผ ์—ด์–ด ์ฃผ์„ธ์š”.

ํ™”๋ฉด ์ฝ๋Š” ๋ฒ•

์ ‘์†ํ•˜๋ฉด ํ‘œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๊ฐ ํ‘œ๊ฐ€ ์„ค์ • ํŒŒ์ผ์— ์ •์˜ํ•œ ํ”„๋ก์‹œ ํ•˜๋‚˜์— ํ•ด๋‹นํ•˜๊ณ , ํ‘œ ์•ˆ์˜ ํ–‰์€ ํ”„๋ก ํŠธ์—”๋“œ(๋“ค์–ด์˜ค๋Š” ์ชฝ), ๋ฐฑ์—”๋“œ(๋‚˜๊ฐ€๋Š” ์ชฝ), ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ณ„ ์„œ๋ฒ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ฃผ์š” ์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—ด ์ด๋ฆ„ ์˜๋ฏธ
Status ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. UP์€ ์ •์ƒ, DOWN์€ ํ—ฌ์Šค์ฒดํฌ ์‹คํŒจ, OPEN์€ ์š”์ฒญ์„ ๋ฐ›๋Š” ์ค‘์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
Sessions โ€” Cur / Max / Limit ํ˜„์žฌ ์—ฐ๊ฒฐ ์ˆ˜ / ์ง€๊ธˆ๊นŒ์ง€ ์ตœ๊ณ ์น˜ / ํ—ˆ์šฉ ํ•œ๊ณ„. Cur๊ฐ€ Limit์— ๊ทผ์ ‘ํ•˜๋ฉด ์ฆ์„ค์„ ๊ฒ€ํ† ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.
Session rate โ€” Cur / Max ์ดˆ๋‹น ์ƒˆ ์—ฐ๊ฒฐ ์ˆ˜. ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ์„ ๊ฐ์ง€ํ•  ๋•Œ ๋ด…๋‹ˆ๋‹ค.
Bytes โ€” In / Out ์ฃผ๊ณ ๋ฐ›์€ ์ด ๋ฐ”์ดํŠธ
Denied โ€” Req / Resp ์„ค์ •ํ•œ ๊ทœ์น™์— ๊ฑธ๋ ค ์ฐจ๋‹จ๋œ ์š”์ฒญยท์‘๋‹ต ์ˆ˜
Errors โ€” Req / Conn / Resp ์ž˜๋ชป๋œ ์š”์ฒญ, ๋ฐฑ์—”๋“œ ์—ฐ๊ฒฐ ์‹คํŒจ, ์‘๋‹ต ์˜ค๋ฅ˜ ์ˆ˜. ์—ฌ๊ธฐ ์ˆซ์ž๊ฐ€ ์˜ฌ๋ผ๊ฐ€๋ฉด ์›์ธ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
Warnings โ€” Retr / Redis ์žฌ์‹œ๋„ ํšŸ์ˆ˜์™€ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ๋„˜๊ธด ํšŸ์ˆ˜. ํŠน์ • ์„œ๋ฒ„๊ฐ€ ๋ถˆ์•ˆ์ •ํ•  ๋•Œ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
LastChk ๋งˆ์ง€๋ง‰ ํ—ฌ์Šค์ฒดํฌ ๊ฒฐ๊ณผ

ํ–‰ ์ƒ‰๊น”๋กœ๋„ ์ƒํƒœ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๋ก์ƒ‰์€ ์ •์ƒ, ๋…ธ๋ž€์ƒ‰์€ ํ—ฌ์Šค์ฒดํฌ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜ ๊ฒฝ๊ณ  ์ƒํƒœ, ๋นจ๊ฐ„์ƒ‰์€ ๋‹ค์šด, ํšŒ์ƒ‰์€ ๊ด€๋ฆฌ์ž๊ฐ€ ์˜๋„์ ์œผ๋กœ ๋‚ด๋ ค ๋‘”(maintenance) ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋ณด์•ˆ โ€” ๊ผญ ์ฝ์–ด ์ฃผ์„ธ์š”

โš ๏ธ ๊ธฐ๋ณธ ์„ค์ •์˜ ํ†ต๊ณ„ ํŽ˜์ด์ง€์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ฑธ๋ ค ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์ €์žฅ์†Œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” haproxy.cfg๋Š” ์„ค์ • ํŒŒ์ผ ์ฒซ ์ค„์—๋„ ์ ํ˜€ ์žˆ๋“ฏ ํ…Œ์ŠคํŠธ์šฉ ์ƒ˜ํ”Œ์ž…๋‹ˆ๋‹ค. ํ†ต๊ณ„ ํŽ˜์ด์ง€๋Š” ์„œ๋ฒ„ ์ด๋ฆ„, ๋‚ด๋ถ€ ๊ตฌ์กฐ, ํŠธ๋ž˜ํ”ฝ ๊ทœ๋ชจ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœํ•˜๋ฏ€๋กœ, ์ธํ„ฐ๋„ท์— ์—ด๋ฆฐ ์„œ๋ฒ„๋ผ๋ฉด ์šด์˜์— ์“ฐ๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ์กฐ์น˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ•˜์„ธ์š”.

์ฒซ์งธ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฑธ๊ธฐ. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. /etc/haproxy/haproxy.cfg์˜ listen stats ๋ถ€๋ถ„์— stats auth ํ•œ ์ค„์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

listen stats
  bind :9000
  mode http
  stats enable
  stats realm Haproxy\ Statistics
  stats uri /haproxy_stats
  stats auth admin:์—ฌ๊ธฐ์—_๊ฐ•๋ ฅํ•œ_๋น„๋ฐ€๋ฒˆํ˜ธ

๋‘˜์งธ, ์ ‘์† ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ ์ œํ•œ. ์•„์˜ˆ ๋‚ด๋ถ€๋ง์—์„œ๋งŒ ์—ด๋ฆฌ๊ฒŒ ํ•˜๋Š” ํŽธ์ด ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. bind ์ฃผ์†Œ๋ฅผ ๋‚ด๋ถ€ IP๋กœ ๋ชป ๋ฐ•๊ฑฐ๋‚˜, ์ ‘๊ทผ ์ œ์–ด ๊ทœ์น™์„ ๊ฒ๋‹ˆ๋‹ค.

listen stats
  bind 10.0.0.5:9000              # ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค์—๋งŒ ๋ฐ”์ธ๋”ฉ
  mode http
  stats enable
  stats uri /haproxy_stats
  acl allowed_net src 10.0.0.0/8 192.168.0.0/16
  http-request deny if !allowed_net

์…‹์งธ, URL ๋ฐ”๊พธ๊ธฐ. ์ด๊ฒƒ๋งŒ์œผ๋กœ ๋ณด์•ˆ์ด ๋˜์ง€๋Š” ์•Š์ง€๋งŒ, ์ž๋™ํ™”๋œ ์Šค์บ๋„ˆ์— ๊ฑธ๋ฆด ํ™•๋ฅ ์€ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. stats uri ๊ฐ’์„ ์ถ”์ธกํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ์™€ ๋ฆฌ๋กœ๋“œ๋ฅผ ํ•˜์„ธ์š”.

sudo haproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl reload haproxy

๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ ์ผœ๊ธฐ

stats admin ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ†ต๊ณ„ ํ™”๋ฉด์—์„œ ๋ฒ„ํŠผ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๋‚ด๋ฆฌ๊ณ  ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ ์ ๊ฒ€ํ•  ๋•Œ ํŠธ๋ž˜ํ”ฝ๋งŒ ์ž ์‹œ ๋นผ ๋‘๋Š” ์šฉ๋„๋กœ ์•„์ฃผ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋น„์Šค๋ฅผ ์ค‘๋‹จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ์ธ์ฆ๊ณผ ํ•จ๊ป˜ ์“ฐ๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ์—์„œ๋งŒ ์—ฌ์„ธ์š”.

  stats auth admin:๊ฐ•๋ ฅํ•œ_๋น„๋ฐ€๋ฒˆํ˜ธ
  stats admin if TRUE

ํฌํŠธ์™€ ๊ฒฝ๋กœ ๋ฐ”๊พธ๊ธฐ

9000๋ฒˆ ํฌํŠธ๊ฐ€ ์ด๋ฏธ ์“ฐ์ด๊ณ  ์žˆ๋‹ค๋ฉด bind ๋’ค์˜ ์ˆซ์ž๋ฅผ, ์ ‘์† ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด stats uri ๊ฐ’์„ ๊ณ ์น˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

listen stats
  bind :8404                       # ํฌํŠธ ๋ณ€๊ฒฝ
  stats uri /my_secret_stats_path  # ๊ฒฝ๋กœ ๋ณ€๊ฒฝ

๋ช…๋ น์ค„์—์„œ ํ™•์ธํ•˜๊ธฐ (๊ด€๋ฆฌ ์†Œ์ผ“)

๋ธŒ๋ผ์šฐ์ € ๋Œ€์‹  ํ„ฐ๋ฏธ๋„์—์„œ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. HAProxy๋Š” /run/haproxy/haproxy.sock ์— ๊ด€๋ฆฌ์šฉ ์†Œ์ผ“์„ ์—ด์–ด ๋‘๋Š”๋ฐ, socat์œผ๋กœ ๋ช…๋ น์„ ๋ณด๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งค ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

sudo dnf install -y socat

echo "show stat" | sudo socat stdio /run/haproxy/haproxy.sock   # ํ†ต๊ณ„ (CSV ํ˜•์‹)
echo "show info" | sudo socat stdio /run/haproxy/haproxy.sock   # ํ”„๋กœ์„ธ์Šค ์ •๋ณด
echo "show servers state" | sudo socat stdio /run/haproxy/haproxy.sock

์ด ์†Œ์ผ“์€ level admin ๊ถŒํ•œ์œผ๋กœ ์—ด๋ ค ์žˆ์–ด์„œ ์„œ๋ฒ„๋ฅผ ๋‚ด๋ฆฌ๊ณ  ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๊ถŒํ•œ์ด 600์ด๋ผ root๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์„ค์ • ํŒŒ์ผ ์ดํ•ดํ•˜๊ธฐ

๊ฑฐ์˜ ๋ชจ๋“  ์ž‘์—…์€ /etc/haproxy/haproxy.cfg ํ•œ ํŒŒ์ผ์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๊ฐ€ ๋„ฃ์–ด ์ฃผ๋Š” ๊ธฐ๋ณธ ์„ค์ •์€ ํฌ๊ฒŒ ์„ธ ๋ฉ์–ด๋ฆฌ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

global ์€ HAProxy ํ”„๋กœ์„ธ์Šค ์ „์ฒด์— ์ ์šฉ๋˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ๊ณ„์ •์œผ๋กœ ์‹คํ–‰ํ• ์ง€(user, group), ์–ด๋””์— ๊ฒฉ๋ฆฌ์‹œํ‚ฌ์ง€(chroot), ๋กœ๊ทธ๋ฅผ ์–ด๋””๋กœ ๋ณด๋‚ผ์ง€, ๊ด€๋ฆฌ ์†Œ์ผ“์„ ์–ด๋””์— ์—ด์ง€ ๊ฐ™์€ ๊ฒƒ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๊ฐ’๋“ค์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์™„์ „ํžˆ ์žฌ์‹œ์ž‘ํ•ด์•ผ ๋ฐ˜์˜๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

defaults ๋Š” ๋’ค๋”ฐ๋ผ ๋‚˜์˜ค๋Š” ๋ชจ๋“  ํ”„๋ก์‹œ๊ฐ€ ๊ณตํ†ต์œผ๋กœ ๋ฌผ๋ ค๋ฐ›๋Š” ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค. ํƒ€์ž„์•„์›ƒ์ด๋‚˜ ๋กœ๊ทธ ํ˜•์‹์ฒ˜๋Ÿผ ๋งค๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์“ฐ๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์šด ์„ค์ •์„ ์—ฌ๊ธฐ ํ•œ ๋ฒˆ๋งŒ ์ ์–ด ๋‘ก๋‹ˆ๋‹ค.

์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. defaults๋Š” ์ž๊ธฐ ๋’ค์— ๋‚˜์˜ค๋Š” ์„น์…˜์—๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. defaults๋ฅผ ํŒŒ์ผ ๋งจ ์•„๋ž˜์— ๋‘๋ฉด ์œ„์ชฝ ํ”„๋ก์‹œ๋“ค์ด ํƒ€์ž„์•„์›ƒ์„ ๋ฌผ๋ ค๋ฐ›์ง€ ๋ชปํ•ด ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๊ณ , ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ์ด ๋ฌดํ•œ์ • ๋งค๋‹ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

listen (๋˜๋Š” frontend + backend)์€ ์‹ค์ œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ค์ •์—๋Š” ํ†ต๊ณ„ ํŽ˜์ด์ง€์šฉ listen stats ํ•˜๋‚˜๋งŒ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. listen์€ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ํ•ฉ์ณ ์“ฐ๋Š” ๊ฐ„ํŽธ ๋ฌธ๋ฒ•์ด๊ณ , ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด frontend์™€ backend๋กœ ๋‚˜๋ˆ„์–ด ์“ฐ๋Š” ํŽธ์ด ๊ด€๋ฆฌํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด listen์ด๋‚˜ frontend/backend๋ฅผ ์ง์ ‘ ์จ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๋‹ค์Œ ์„ค์ • ์˜ˆ์ œ ๋ชจ์Œ์— ์šฉ๋„๋ณ„๋กœ ์ •๋ฆฌํ•ด ๋‘์—ˆ์œผ๋‹ˆ ํ•„์š”ํ•œ ๊ฒƒ์„ ๊ณจ๋ผ ์“ฐ์„ธ์š”.

๋ถ€ํ•˜ ๋ถ„์‚ฐ์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์˜ˆ๋ถ€ํ„ฐ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ์„ ์„ค์ • ํŒŒ์ผ ๋์— ๋ง๋ถ™์ด๋ฉด ์›น ์„œ๋ฒ„ ๋‘ ๋Œ€๋กœ ํŠธ๋ž˜ํ”ฝ์ด ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

frontend web
  bind :80
  default_backend web_servers

backend web_servers
  balance roundrobin
  option httpchk GET /health
  server web1 10.0.0.11:8080 check
  server web2 10.0.0.12:8080 check

frontend web์€ 80๋ฒˆ ํฌํŠธ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๋ฐ›์•„ backend web_servers๋กœ ๋„˜๊น๋‹ˆ๋‹ค. balance roundrobin์€ ๋‘ ์„œ๋ฒ„์— ๋ฒˆ๊ฐˆ์•„ ๋‚˜๋ˆ  ์ค€๋‹ค๋Š” ๋œป์ด๊ณ , check๊ฐ€ ๋ถ™์€ ์„œ๋ฒ„๋Š” HAProxy๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ /health ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ถœํ•ด ์‚ด์•„ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ฃฝ์€ ์„œ๋ฒ„๋Š” ์ž๋™์œผ๋กœ ์ œ์™ธ๋˜๋ฉฐ, ๊ทธ ์ƒํƒœ๊ฐ€ ํ†ต๊ณ„ ํŽ˜์ด์ง€์— ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋Š˜ ๊ทธ๋ ‡๋“ฏ ์ €์žฅํ•œ ๋’ค์—๋Š” ๊ฒ€์‚ฌํ•˜๊ณ  ๋ฆฌ๋กœ๋“œํ•˜์„ธ์š”.

sudo haproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl reload haproxy

์„ค์ • ์˜ˆ์ œ ๋ชจ์Œ

์‹ค๋ฌด์—์„œ ์ž์ฃผ ์“ฐ๋Š” ์„ค์ •์„ ์šฉ๋„๋ณ„๋กœ ๋ชจ์•˜์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ณจ๋ผ์„œ /etc/haproxy/haproxy.cfg ๋์— ๋ถ™์—ฌ ๋„ฃ๊ณ , IP ์ฃผ์†Œ์™€ ํฌํŠธ๋งŒ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ๋ฐ”๊พธ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์˜ ๋ชจ๋“  ์˜ˆ์ œ๋Š” HAProxy 3.4.3์—์„œ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ(haproxy -c)๋ฅผ ๊ฒฝ๊ณ  ์—†์ด ํ†ต๊ณผํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์›นยท๋ผ์šฐํŒ…ยท์„ธ์…˜ ๊ณ ์ •ยทHTTPSยทTCPยท์†๋„ ์ œํ•œยท๊ธฐ๋ณธ ์ธ์ฆยท๋™์  ์ œ์™ธ ์˜ˆ์ œ๋Š” ์‹ค์ œ๋กœ ๋„์›Œ ๋™์ž‘๊นŒ์ง€ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ๋Š” ํŒจํ‚ค์ง€์—๋„ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค

์ด ๋ฌธ์„œ๋ฅผ ์ฐพ์•„๋ณด์ง€ ์•Š์•„๋„ ๋˜๋„๋ก, ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํŒŒ์ผ๋กœ๋„ ํ•จ๊ป˜ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๊น”๋ฉด ์„œ๋ฒ„์—์„œ ๋ฐ”๋กœ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ls /usr/share/doc/haproxy/recipes/
cat /usr/share/doc/haproxy/recipes/README.txt

๊ฐ ํŒŒ์ผ์€ global์ด๋‚˜ defaults ์—†์ด ํ”„๋ก์‹œ ์ •์˜๋งŒ ๋‹ด์€ ์กฐ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์“ฐ๋Š” ์„ค์ •๊ณผ ํ•ฉ์ณ์„œ ๋ฏธ๋ฆฌ ์‹œํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -f๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฃผ๋ฉด HAProxy๊ฐ€ ์„ค์ •์„ ํ•ฉ์ณ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

haproxy -c -f /etc/haproxy/haproxy.cfg -f /usr/share/doc/haproxy/recipes/01-web-http.cfg

๋ถ™์—ฌ ๋„ฃ๊ธฐ ์ „์— ์ด๋ ‡๊ฒŒ ํ™•์ธํ•ด ๋ณด๋ฉด, ๊ธฐ์กด ์„ค์ •๊ณผ ์ด๋ฆ„์ด ๊ฒน์น˜๊ฑฐ๋‚˜ ๋ฌธ๋ฒ•์ด ํ‹€๋ฆฐ ๊ฒƒ์„ ๋ฏธ๋ฆฌ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณตํ†ต ์ ˆ์ฐจ

์–ด๋–ค ์˜ˆ์ œ๋“  ์ ์šฉ ๋ฐฉ๋ฒ•์€ ๋˜‘๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์„ธ ๋‹จ๊ณ„๋ฅผ ์Šต๊ด€์œผ๋กœ ๋งŒ๋“œ์„ธ์š”.

sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak   # 1. ๋ฐฑ์—…
sudo vi /etc/haproxy/haproxy.cfg                                 # 2. ์˜ˆ์ œ ๋ถ™์—ฌ ๋„ฃ๊ณ  IP ์ˆ˜์ •
sudo haproxy -c -f /etc/haproxy/haproxy.cfg && sudo systemctl reload haproxy   # 3. ๊ฒ€์‚ฌ ํ›„ ๋ฐ˜์˜

3๋‹จ๊ณ„์—์„œ &&๋กœ ์ด์–ด ๋‘” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๋ฆฌ๋กœ๋“œ๊ฐ€ ์•„์˜ˆ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ž˜๋ชป๋œ ์„ค์ •์ด ์„œ๋น„์Šค์— ๋ฐ˜์˜๋˜๋Š” ์‚ฌ๊ณ ๋ฅผ ๋ง‰์•„ ์ค๋‹ˆ๋‹ค.

๋ถ€ํ•˜ ๋ถ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณ ๋ฅด๊ธฐ

balance ๋’ค์— ์˜ค๋Š” ๊ฐ’์ด ํŠธ๋ž˜ํ”ฝ์„ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์„ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒํ™ฉ์— ๋งž๋Š” ๊ฒƒ์„ ๊ณ ๋ฅด์„ธ์š”.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ์–ธ์ œ ์“ฐ๋‚˜
roundrobin ์ฐจ๋ก€๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ๋ฐฐ๋ถ„ ์„œ๋ฒ„ ์„ฑ๋Šฅ์ด ๋น„์Šทํ•œ ์ผ๋ฐ˜ ์›น ์„œ๋ฒ„. ๊ฐ€์žฅ ๋ฌด๋‚œํ•œ ๊ธฐ๋ณธ๊ฐ’
leastconn ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์€ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ์ด ์˜ค๋ž˜ ์œ ์ง€๋˜๋Š” ์„œ๋น„์Šค
source ์ ‘์†์ž IP๋ฅผ ํ•ด์‹œํ•ด ํ•ญ์ƒ ๊ฐ™์€ ์„œ๋ฒ„๋กœ ์ฟ ํ‚ค๋ฅผ ๋ชป ์“ฐ๋Š” ํ™˜๊ฒฝ์—์„œ ์„ธ์…˜์„ ๊ณ ์ •ํ•  ๋•Œ
first ์‚ด์•„ ์žˆ๋Š” ์ฒซ ๋ฒˆ์งธ ์„œ๋ฒ„์— ๋ชฐ์•„์ฃผ๊ธฐ Redis์ฒ˜๋Ÿผ ๋งˆ์Šคํ„ฐ ํ•œ ๋Œ€๋งŒ ์จ์•ผ ํ•  ๋•Œ
uri ์š”์ฒญ URL์„ ํ•ด์‹œํ•ด ๋ฐฐ๋ถ„ ์บ์‹œ ์„œ๋ฒ„. ๊ฐ™์€ URL์€ ๋Š˜ ๊ฐ™์€ ์„œ๋ฒ„๋กœ ๊ฐ€์•ผ ์ ์ค‘๋ฅ ์ด ์˜ค๋ฆ…๋‹ˆ๋‹ค

1. ์›น ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ถ„์‚ฐ (HTTP)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋Œ€์˜ ์›น ์„œ๋ฒ„(WAS)์— ์š”์ฒญ์„ ๋‚˜๋ˆ  ์ฃผ๊ณ , ์ฃฝ์€ ์„œ๋ฒ„๋Š” ์ž๋™์œผ๋กœ ๋นผ ์ค๋‹ˆ๋‹ค.

frontend web
  bind :80
  default_backend web_servers

backend web_servers
  balance roundrobin
  option httpchk GET /health
  http-check expect status 200
  server web1 10.0.0.11:8080 check
  server web2 10.0.0.12:8080 check

option httpchk GET /health๋Š” ํ—ฌ์Šค์ฒดํฌ ๋ฐฉ๋ฒ•์„ ์ •ํ•ฉ๋‹ˆ๋‹ค. HAProxy๊ฐ€ ๊ฐ ์„œ๋ฒ„์˜ /health ๊ฒฝ๋กœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๊ณ , http-check expect status 200์— ๋”ฐ๋ผ 200์ด ๋Œ์•„์˜ฌ ๋•Œ๋งŒ ์ •์ƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ํ—ฌ์Šค์ฒดํฌ ๊ฒฝ๋กœ๋ฅผ ์ž˜ ๊ณ ๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. / ๊ฐ™์€ ๋ฌด๊ฑฐ์šด ํŽ˜์ด์ง€ ๋Œ€์‹ , DB ์—ฐ๊ฒฐ ์ƒํƒœ ์ •๋„๋งŒ ํ™•์ธํ•˜๊ณ  ๋ฐ”๋กœ 200์„ ๋Œ๋ ค์ฃผ๋Š” ๊ฐ€๋ฒผ์šด ์ „์šฉ ๊ฒฝ๋กœ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋งŒ๋“ค์–ด ๋‘๋Š” ํŽธ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํ—ฌ์Šค์ฒดํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 2์ดˆ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ๋ฌด๊ฑฐ์šด ๊ฒฝ๋กœ๋ฅผ ์“ฐ๋ฉด ๊ทธ ์ž์ฒด๊ฐ€ ๋ถ€ํ•˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ฒดํฌ ๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ•˜๋ ค๋ฉด check ๋’ค์— ์˜ต์…˜์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

  server web1 10.0.0.11:8080 check inter 5s fall 3 rise 2

inter 5s๋Š” 5์ดˆ๋งˆ๋‹ค ๊ฒ€์‚ฌ, fall 3์€ 3ํšŒ ์—ฐ์† ์‹คํŒจํ•ด์•ผ ์ฃฝ์€ ๊ฒƒ์œผ๋กœ ํŒ์ •, rise 2๋Š” 2ํšŒ ์—ฐ์† ์„ฑ๊ณตํ•ด์•ผ ๋‹ค์‹œ ์‚ด๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. ์ˆœ๊ฐ„์ ์ธ ๋„คํŠธ์›Œํฌ ๋ถˆ์•ˆ์ •์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ๋“ค๋ฝ๋‚ ๋ฝํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ ์ค๋‹ˆ๋‹ค.

2. ๋ฐฑ์—”๋“œ์— ์ง„์งœ ์ ‘์†์ž IP ์•Œ๋ ค์ฃผ๊ธฐ

๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ๊ฑธ๋ฉด ์›น ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ๋ชจ๋“  ์š”์ฒญ์ด HAProxy์—์„œ ์˜จ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ ‘์†์ž์˜ ์‹ค์ œ IP๋ฅผ ์•Œ๋ ค๋ฉด option forwardfor๋ฅผ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

backend web_servers
  balance roundrobin
  option forwardfor
  server web1 10.0.0.11:8080 check

์ด๋Ÿฌ๋ฉด X-Forwarded-For ํ—ค๋”์— ์›๋ž˜ ์ ‘์†์ž IP๊ฐ€ ๋‹ด๊ฒจ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋˜๋Š” ๊ทธ ์•ž์˜ Nginx/Tomcat)์—์„œ ์ด ํ—ค๋”๋ฅผ ์‹ ๋ขฐํ•˜๋„๋ก ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ๋กœ๊ทธ์— ์ œ๋Œ€๋กœ ์ฐํž™๋‹ˆ๋‹ค.

3. HTTPS ์ฒ˜๋ฆฌ (SSL ์ข…๋ฃŒ)

HAProxy๊ฐ€ HTTPS๋ฅผ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•˜๊ณ  ๋’ค์ชฝ ์„œ๋ฒ„์™€๋Š” ํ‰๋ฌธ HTTP๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ธ์ฆ์„œ๋ฅผ ํ•œ ๊ณณ์—์„œ๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ž…๋‹ˆ๋‹ค.

frontend web
  bind :80
  bind :443 ssl crt /etc/haproxy/certs/example.com.pem
  http-request redirect scheme https code 301 unless { ssl_fc }
  http-response set-header Strict-Transport-Security "max-age=31536000"
  default_backend web_servers

backend web_servers
  balance roundrobin
  option forwardfor
  http-request set-header X-Forwarded-Proto https if { ssl_fc }
  server web1 10.0.0.11:8080 check
  server web2 10.0.0.12:8080 check

http-request redirect ... unless { ssl_fc } ํ•œ ์ค„์ด HTTP๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ์ž๋™์œผ๋กœ HTTPS๋กœ ๋Œ๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค. ssl_fc๋Š” "์ด ์—ฐ๊ฒฐ์ด SSL์ด๋ƒ"๋ฅผ ๋œปํ•˜๋ฏ€๋กœ, SSL์ด ์•„๋‹ ๋•Œ๋งŒ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

code 301์„ ๋นผ๋ฉด 302(์ž„์‹œ ์ด๋™) ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. HTTP๋ฅผ ์˜๊ตฌํžˆ ๋‹ซ์„ ์ƒ๊ฐ์ด๋ผ๋ฉด 301์„ ๋ช…์‹œํ•˜์„ธ์š”. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œํ•˜๋ฏ€๋กœ, ๋˜๋Œ๋ฆด ์—ฌ์ง€๋ฅผ ๋‚จ๊ฒจ ๋‘๊ณ  ์‹ถ๋‹ค๋ฉด ์˜คํžˆ๋ ค 302๊ฐ€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

X-Forwarded-Proto https ํ—ค๋”๋Š” ๋’ค์ชฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ "์›๋ž˜๋Š” HTTPS ์š”์ฒญ์ด์—ˆ๋‹ค"๊ณ  ์•Œ๋ ค ์ค๋‹ˆ๋‹ค. ์ด๊ฒŒ ์—†์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งŒ๋“œ๋Š” ๋งํฌ๊ฐ€ http://๋กœ ๋‚˜๊ฐ€์„œ ๋ฌดํ•œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ์ƒ๊ธฐ๋Š” ์ผ์ด ํ”ํ•ฉ๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ํŒŒ์ผ ์ค€๋น„ํ•˜๊ธฐ. HAProxy๋Š” ์ธ์ฆ์„œ์™€ ๊ฐœ์ธํ‚ค๋ฅผ ํ•œ ํŒŒ์ผ์— ํ•ฉ์ณ์„œ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Let's Encrypt๋ฅผ ์“ด๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

sudo mkdir -p /etc/haproxy/certs
sudo cat /etc/letsencrypt/live/example.com/fullchain.pem \
         /etc/letsencrypt/live/example.com/privkey.pem \
         > /etc/haproxy/certs/example.com.pem
sudo chmod 600 /etc/haproxy/certs/example.com.pem

์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์„ ์“ด๋‹ค๋ฉด crt ๋’ค์— ํŒŒ์ผ ๋Œ€์‹  ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. HAProxy๊ฐ€ ๊ทธ ์•ˆ์˜ ์ธ์ฆ์„œ๋ฅผ ๋ชจ๋‘ ์ฝ์–ด SNI๋กœ ์•Œ์•„์„œ ๊ณจ๋ผ ์”๋‹ˆ๋‹ค.

  bind :443 ssl crt /etc/haproxy/certs/

4. HTTP/2 ์‚ฌ์šฉํ•˜๊ธฐ

alpn h2,http/1.1์„ ๋ถ™์ด๋ฉด HTTP/2๋ฅผ ์ง€์›ํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ €์™€๋Š” HTTP/2๋กœ, ์•„๋‹ˆ๋ฉด HTTP/1.1๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

frontend web
  bind :443 ssl crt /etc/haproxy/certs/example.com.pem alpn h2,http/1.1
  default_backend web_servers

backend web_servers
  balance roundrobin
  server web1 10.0.0.11:8080 check
  server web2 10.0.0.12:8443 check ssl verify none alpn h2

๋ฐฑ์—”๋“œ ์ชฝ server ์ค„์˜ ssl verify none alpn h2๋Š” HAProxy์™€ ๋’ค์ชฝ ์„œ๋ฒ„ ์‚ฌ์ด๋„ HTTPS/HTTP2๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€๋ง์ด๋ผ ์ธ์ฆ์„œ ๊ฒ€์ฆ์ด ํ•„์š” ์—†์„ ๋•Œ verify none์„ ์”๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์„ ๊ฑฐ์นœ๋‹ค๋ฉด verify required์™€ ca-file์„ ์ œ๋Œ€๋กœ ์ง€์ •ํ•˜์„ธ์š”.

5. ๊ฒฝ๋กœยท๋„๋ฉ”์ธ๋ณ„๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋ณด๋‚ด๊ธฐ

ํ•œ ๋Œ€์˜ HAProxy๋กœ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ๋‚˜๋ˆ  ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. acl๋กœ ์กฐ๊ฑด์— ์ด๋ฆ„์„ ๋ถ™์ด๊ณ  use_backend๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

frontend web
  bind :80
  acl is_api      path_beg /api
  acl is_static   path_beg /static /images
  acl is_admin    hdr(host) -i admin.example.com
  use_backend api_servers    if is_api
  use_backend static_servers if is_static
  use_backend admin_servers  if is_admin
  default_backend web_servers

backend api_servers
  balance leastconn
  server api1 10.0.0.21:8080 check

backend static_servers
  balance roundrobin
  server st1 10.0.0.31:80 check

backend admin_servers
  server adm1 10.0.0.41:8080 check

backend web_servers
  server web1 10.0.0.11:8080 check

path_beg /api๋Š” "๊ฒฝ๋กœ๊ฐ€ /api๋กœ ์‹œ์ž‘ํ•˜๋ฉด", hdr(host) -i admin.example.com์€ "Host ํ—ค๋”๊ฐ€ ์ด ๋„๋ฉ”์ธ์ด๋ฉด"์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค(-i๋Š” ๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ). ์–ด๋А ์กฐ๊ฑด์—๋„ ์•ˆ ๊ฑธ๋ฆฌ๋ฉด default_backend๋กœ ๊ฐ‘๋‹ˆ๋‹ค.

๊ทœ์น™์€ ์œ„์—์„œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ํ‰๊ฐ€๋˜๊ณ  ๋จผ์ € ๋งž๋Š” ๊ฒƒ์ด ์ด๊น๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ๋ฒ”์œ„๊ฐ€ ์ข์€ ์กฐ๊ฑด์„ ์œ„์—, ๋„“์€ ์กฐ๊ฑด์„ ์•„๋ž˜์— ๋‘์„ธ์š”.

์ž์ฃผ ์“ฐ๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์กฐ๊ฑด ์˜๋ฏธ
path_beg /api ๊ฒฝ๋กœ๊ฐ€ /api๋กœ ์‹œ์ž‘
path_end .jpg .png ๊ฒฝ๋กœ๊ฐ€ ํ•ด๋‹น ํ™•์žฅ์ž๋กœ ๋๋‚จ
hdr(host) -i example.com Host ํ—ค๋”๊ฐ€ ์ผ์น˜
hdr_beg(host) -i api. Host๊ฐ€ api.๋กœ ์‹œ์ž‘ (์„œ๋ธŒ๋„๋ฉ”์ธ)
src 10.0.0.0/8 ์ ‘์†์ž IP๊ฐ€ ํ•ด๋‹น ๋Œ€์—ญ
method POST HTTP ๋ฉ”์„œ๋“œ๊ฐ€ POST

6. ์„ธ์…˜ ๊ณ ์ • (sticky session)

๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ค๊ณ  ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋ฉด, ๊ฐ™์€ ์‚ฌ์šฉ์ž๋ฅผ ๊ณ„์† ๊ฐ™์€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. HAProxy๊ฐ€ ์ฟ ํ‚ค๋ฅผ ์‹ฌ์–ด์„œ ์ฒ˜๋ฆฌํ•ด ์ค๋‹ˆ๋‹ค.

backend web_servers
  balance roundrobin
  cookie SRVID insert indirect nocache
  server web1 10.0.0.11:8080 check cookie web1
  server web2 10.0.0.12:8080 check cookie web2

cookie SRVID insert๋Š” HAProxy๊ฐ€ SRVID๋ผ๋Š” ์ฟ ํ‚ค๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‘๋‹ต์— ๋„ฃ๋Š”๋‹ค๋Š” ๋œป์ด๊ณ , ๊ฐ server ์ค„ ๋์˜ cookie web1์ด ๊ทธ ์ฟ ํ‚ค์— ๋‹ด๊ธธ ๊ฐ’์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด ์ฟ ํ‚ค๋ฅผ ๋‹ค์‹œ ๋ณด๋‚ด๋ฉด HAProxy๊ฐ€ ๊ทธ ๊ฐ’์„ ๋ณด๊ณ  ์›๋ž˜ ์„œ๋ฒ„๋กœ ๋˜๋Œ๋ ค ์ค๋‹ˆ๋‹ค. indirect nocache๋Š” ์ด ์ฟ ํ‚ค๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ „๋‹ฌ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ  ์ค‘๊ฐ„ ์บ์‹œ์— ์ €์žฅ๋˜์ง€ ์•Š๊ฒŒ ๋ง‰๋Š” ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค.

์„ธ์…˜ ๊ณ ์ •์€ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋ถ€ํ•˜๊ฐ€ ๊ณ ๋ฅด๊ฒŒ ๋‚˜๋‰˜์ง€ ์•Š๋Š” ๋ถ€์ž‘์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ์„œ๋ฒ„๊ฐ€ ์ฃฝ์œผ๋ฉด ๊ทธ ์„œ๋ฒ„์— ๋ฌถ์—ฌ ์žˆ๋˜ ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ์ด ํ’€๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์„ธ์…˜์„ Redis ๊ฐ™์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋กœ ๋นผ์„œ ์„ธ์…˜ ๊ณ ์ • ์ž์ฒด๊ฐ€ ํ•„์š” ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ํŽธ์ด ๊ทผ๋ณธ์ ์ธ ํ•ด๋ฒ•์ž…๋‹ˆ๋‹ค.

์ฟ ํ‚ค๋ฅผ ์“ธ ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ(์˜ˆ: TCP ๋ชจ๋“œ)์—์„œ๋Š” ์ ‘์†์ž IP ๊ธฐ์ค€์œผ๋กœ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

backend web_servers
  balance source
  server web1 10.0.0.11:8080 check
  server web2 10.0.0.12:8080 check

7. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€ํ•˜ ๋ถ„์‚ฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” HTTP๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ mode tcp ๋กœ ๋™์ž‘์‹œ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›น๊ณผ ๋‹ฌ๋ฆฌ ์—ฐ๊ฒฐ์ด ์˜ค๋ž˜ ์œ ์ง€๋˜๋ฏ€๋กœ ํƒ€์ž„์•„์›ƒ์„ ๋„‰๋„‰ํžˆ ์žก์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ธ 50์ดˆ๋ฅผ ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด ์กฐ๊ธˆ ๊ธด ์ฟผ๋ฆฌ๊ฐ€ ๋„์ค‘์— ๋Š๊น๋‹ˆ๋‹ค.

MySQL / MariaDB

์ฝ๊ธฐ ๋ถ€ํ•˜๋ฅผ ๋ณต์ œ ์„œ๋ฒ„๋กœ ๋ถ„์‚ฐํ•˜๋Š” ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

listen mysql
  bind :3306
  mode tcp
  option tcplog
  balance leastconn
  timeout client 600s
  timeout server 600s
  option mysql-check user haproxy_check
  server db1 10.0.0.21:3306 check
  server db2 10.0.0.22:3306 check backup

option mysql-check๋ฅผ ์“ฐ๋ ค๋ฉด DB์— ์ „์šฉ ์ ๊ฒ€ ๊ณ„์ •์„ ๋จผ์ € ๋งŒ๋“ค์–ด ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ์ ‘์†๋งŒ ๋˜๋ฉด ๋˜๊ณ  ์•„๋ฌด ๊ถŒํ•œ๋„ ์ค„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

CREATE USER 'haproxy_check'@'10.0.0.%';

db2์— ๋ถ™์€ backup์€ "ํ‰์†Œ์—๋Š” ์“ฐ์ง€ ๋ง๊ณ  ์•ž์˜ ์„œ๋ฒ„๊ฐ€ ๋ชจ๋‘ ์ฃฝ์—ˆ์„ ๋•Œ๋งŒ ์“ฐ๋ผ"๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์“ฐ๊ธฐ(master)์™€ ์ฝ๊ธฐ(replica)๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์ด ๊ตฌ์„ฑ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ์šฉ ํฌํŠธ์™€ ์ฝ๊ธฐ์šฉ ํฌํŠธ๋ฅผ ๋”ฐ๋กœ ์—ด์–ด ์ฃผ์„ธ์š”.

listen mysql_write
  bind :3306
  mode tcp
  option tcplog
  timeout client 600s
  timeout server 600s
  option mysql-check user haproxy_check
  server master 10.0.0.21:3306 check
  server standby 10.0.0.22:3306 check backup

listen mysql_read
  bind :3307
  mode tcp
  option tcplog
  balance roundrobin
  timeout client 600s
  timeout server 600s
  option mysql-check user haproxy_check
  server replica1 10.0.0.22:3306 check
  server replica2 10.0.0.23:3306 check

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์“ฐ๊ธฐ๋Š” 3306, ์ฝ๊ธฐ๋Š” 3307๋กœ ์ ‘์†ํ•˜๋„๋ก ๋‚˜๋ˆ„๋ฉด ๋ฉ๋‹ˆ๋‹ค.

PostgreSQL

๋ฐฉ์‹์€ MySQL๊ณผ ๊ฐ™๊ณ  ์ ๊ฒ€ ์˜ต์…˜๋งŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

listen postgresql
  bind :5432
  mode tcp
  option tcplog
  balance leastconn
  timeout client 600s
  timeout server 600s
  option pgsql-check user haproxy_check
  server pg1 10.0.0.21:5432 check
  server pg2 10.0.0.22:5432 check backup

์ ๊ฒ€ ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  ์ ‘์†์„ ํ—ˆ์šฉํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CREATE ROLE haproxy_check LOGIN;

pg_hba.conf์—๋„ ์ด ๊ณ„์ •์ด ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ์ค„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Redis

Redis๋Š” ๋งˆ์Šคํ„ฐ ํ•œ ๋Œ€์—๋งŒ ์จ์•ผ ํ•˜๋ฏ€๋กœ, ๋งˆ์Šคํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ฐพ์•„๋‚ด๋Š” ํ—ฌ์Šค์ฒดํฌ๋ฅผ ์”๋‹ˆ๋‹ค.

listen redis
  bind :6379
  mode tcp
  option tcplog
  balance first
  option tcp-check
  tcp-check send PING\r\n
  tcp-check expect string +PONG
  tcp-check send info\ replication\r\n
  tcp-check expect string role:master
  tcp-check send QUIT\r\n
  tcp-check expect string +OK
  server redis1 10.0.0.31:6379 check inter 1s
  server redis2 10.0.0.32:6379 check inter 1s

tcp-check๊ฐ€ ์‹ค์ œ๋กœ Redis์— ์ ‘์†ํ•ด์„œ PING์„ ๋ณด๋‚ด๊ณ  +PONG์„ ํ™•์ธํ•œ ๋’ค, INFO replication ๊ฒฐ๊ณผ์— role:master๊ฐ€ ์žˆ๋Š”์ง€๊นŒ์ง€ ๋ด…๋‹ˆ๋‹ค. ๋ณต์ œ(slave) ์„œ๋ฒ„๋Š” ์ด ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ ์ž๋™์œผ๋กœ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค. ์žฅ์•  ์กฐ์น˜(failover)๋กœ ๋งˆ์Šคํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด HAProxy๊ฐ€ ์•Œ์•„์„œ ์ƒˆ ๋งˆ์Šคํ„ฐ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์˜ฎ๊น๋‹ˆ๋‹ค.

send ์ค„์˜ \r\n๊ณผ info\ replication์˜ ๋ฐฑ์Šฌ๋ž˜์‹œ๋Š” ๋ฌธ๋ฒ•์ƒ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ˆ ๊ทธ๋Œ€๋กœ ์ ์–ด ์ฃผ์„ธ์š”.


8. ์ผ๋ฐ˜ TCP ์„œ๋น„์Šค ์ค‘๊ณ„

HTTP๊ฐ€ ์•„๋‹Œ ์„œ๋น„์Šค(๋ฉ”์ผ, SSH, ์‚ฌ์„ค ํ”„๋กœํ† ์ฝœ ๋“ฑ)๋Š” mode tcp๋กœ ๊ทธ๋Œ€๋กœ ํ˜๋ ค๋ณด๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

listen smtp
  bind :25
  mode tcp
  option tcplog
  balance roundrobin
  option tcp-check
  server mail1 10.0.0.41:25 check
  server mail2 10.0.0.42:25 check

option tcp-check๋งŒ ์“ฐ๋ฉด ํฌํŠธ๊ฐ€ ์—ด๋ ค ์žˆ๋Š”์ง€๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋” ์ •ํ™•ํžˆ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์‹ค์ œ๋กœ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฌธ์ž์—ด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  option tcp-check
  tcp-check expect string 220

๋ฉ”์ผ ์„œ๋ฒ„๊ฐ€ ์ ‘์† ์‹œ ๋ณด๋‚ด๋Š” 220 ์ธ์‚ฌ๋ง์„ ํ™•์ธํ•˜๋Š” ์‹์ž…๋‹ˆ๋‹ค.

mode tcp์—์„œ๋Š” option httplog๋ฅผ ์“ฐ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. HTTP ์ •๋ณด๊ฐ€ ์—†์–ด ๋กœ๊ทธ๊ฐ€ ๋น„์–ด ๋ณด์ž…๋‹ˆ๋‹ค. ์˜ˆ์ œ์ฒ˜๋Ÿผ option tcplog๋กœ ๋ฐ”๊ฟ” ์ฃผ์„ธ์š”. defaults์— mode http๊ฐ€ ์žˆ์–ด๋„ ๊ฐ ์„น์…˜์—์„œ mode tcp๋กœ ๋ฎ์–ด์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


9. ์ ‘์† ์ œํ•œ๊ณผ ์†๋„ ์ œํ•œ

ํŠน์ • IP์—์„œ ์งง์€ ์‹œ๊ฐ„์— ๊ณผ๋„ํ•œ ์š”์ฒญ์ด ์˜ค๋ฉด ์ฐจ๋‹จํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•œ ํฌ๋กค๋Ÿฌ๋‚˜ ๋ฌด์ฐจ๋ณ„ ๋กœ๊ทธ์ธ ์‹œ๋„๋ฅผ ๋ง‰๋Š” ๋ฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

frontend web
  bind :80
  stick-table type ip size 100k expire 30s store http_req_rate(10s)
  http-request track-sc0 src
  http-request deny deny_status 429 if { sc_http_req_rate(0) gt 100 }
  acl allowed_net src 10.0.0.0/8 192.168.0.0/16
  http-request deny if { path_beg /admin } !allowed_net
  default_backend web_servers

backend web_servers
  server web1 10.0.0.11:8080 check maxconn 200

stick-table์€ IP๋ณ„ ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ํ‘œ์ž…๋‹ˆ๋‹ค. http_req_rate(10s)๋Š” ์ตœ๊ทผ 10์ดˆ๊ฐ„์˜ ์š”์ฒญ ์ˆ˜๋ฅผ ์„ธ๊ณ , ๊ทธ ๊ฐ’์ด 100์„ ๋„˜์œผ๋ฉด 429 Too Many Requests๋กœ ๊ฑฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. 30์ดˆ๊ฐ„ ์š”์ฒญ์ด ์—†์œผ๋ฉด ๊ธฐ๋ก์ด ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

๊ทธ ์•„๋ž˜ ๋‘ ์ค„์€ /admin ๊ฒฝ๋กœ๋ฅผ ๋‚ด๋ถ€๋ง์—์„œ๋งŒ ์—ด์–ด ์ฃผ๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

server ์ค„์˜ maxconn 200์€ ๊ทธ ์„œ๋ฒ„๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์„ ๋„˜์–ด์„œ๋ฉด HAProxy๊ฐ€ ๋Œ€๊ธฐ์‹œ์ผœ ์ฃผ๋ฏ€๋กœ, ํŠธ๋ž˜ํ”ฝ ํญ์ฃผ๋กœ ์„œ๋ฒ„๊ฐ€ ํ†ต์งธ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์„ ๋ง‰์•„ ์ค๋‹ˆ๋‹ค.

์ž„๊ณ„๊ฐ’์€ ์„œ๋น„์Šค ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋„‰๋„‰ํ•˜๊ฒŒ ์žก๊ณ  ํ†ต๊ณ„ ํŽ˜์ด์ง€์˜ Denied ์—ด์„ ๋ณด๋ฉด์„œ ์กฐ์—ฌ ๋‚˜๊ฐ€์„ธ์š”. ๋„ˆ๋ฌด ๋นก๋นกํ•˜๋ฉด ์ •์ƒ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.


10. ์„œ๋ฒ„ ์ ๊ฒ€(maintenance) ์ฒ˜๋ฆฌ

์„œ๋ฒ„๋ฅผ ์ ๊ฒ€ํ•  ๋•Œ ํŠธ๋ž˜ํ”ฝ๋งŒ ์ž ์‹œ ๋นผ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์„ค์ • ํŒŒ์ผ์— disabled๋ฅผ ๋ถ™์ด๋ฉด ๊ทธ ์„œ๋ฒ„๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ œ์™ธ๋œ ์ฑ„๋กœ ๋œน๋‹ˆ๋‹ค.

backend web_servers
  balance roundrobin
  server web1 10.0.0.11:8080 check
  server web2 10.0.0.12:8080 check disabled

๋‹ค๋งŒ ์‹ค์ œ ์šด์˜์—์„œ๋Š” ์„ค์ • ํŒŒ์ผ์„ ๊ณ ์น˜๊ณ  ๋ฆฌ๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ด€๋ฆฌ ์†Œ์ผ“์œผ๋กœ ์ฆ‰์‹œ ๋นผ๋Š” ํŽธ์ด ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

# ์ ๊ฒ€ ์‹œ์ž‘ โ€” ์ƒˆ ์—ฐ๊ฒฐ์„ ๋ฐ›์ง€ ์•Š์Œ (๊ธฐ์กด ์—ฐ๊ฒฐ์€ ์œ ์ง€)
echo "disable server web_servers/web2" | sudo socat stdio /run/haproxy/haproxy.sock

# ์ ๊ฒ€ ์ข…๋ฃŒ โ€” ๋‹ค์‹œ ํˆฌ์ž…
echo "enable server web_servers/web2" | sudo socat stdio /run/haproxy/haproxy.sock

# ํ˜„์žฌ ์ƒํƒœ ํ™•์ธ
echo "show servers state" | sudo socat stdio /run/haproxy/haproxy.sock

์ด ๋ฐฉ์‹์€ HAProxy๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ ์—ฐ๊ฒฐ์— ์ „ํ˜€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ†ต๊ณ„ ํŽ˜์ด์ง€์—์„œ stats admin์„ ์ผœ ๋‘์—ˆ๋‹ค๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋ฒ„ํŠผ์œผ๋กœ๋„ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


11. HTTP ๊ธฐ๋ณธ ์ธ์ฆ (Basic Auth)

๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ณธ ๋กœ๊ทธ์ธ ์ฐฝ์œผ๋กœ ์ ‘๊ทผ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ ํŽ˜์ด์ง€๋‚˜ ์‚ฌ๋‚ด ๋„๊ตฌ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ๋ณดํ˜ธ๋งŒ ํ•„์š”ํ•œ ๊ณณ์— ์“ฐ๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

userlist site_users
  user admin  password $6$rounds=5000$saltsalt$ํ•ด์‹œ๊ฐ’์„_์—ฌ๊ธฐ์—_๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”

frontend web
  bind :80
  acl auth_ok http_auth(site_users)
  http-request auth realm "Restricted Area" unless auth_ok
  default_backend web_servers

backend web_servers
  balance roundrobin
  server web1 10.0.0.11:8080 check

userlist์— ๊ณ„์ •์„ ์ •์˜ํ•˜๊ณ , http_auth(site_users)๋กœ "์ด ์š”์ฒญ์˜ ์ž๊ฒฉ ์ฆ๋ช…์ด ๋ชฉ๋ก๊ณผ ๋งž๋Š”๊ฐ€"๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งž์ง€ ์•Š์œผ๋ฉด(unless auth_ok) http-request auth๊ฐ€ 401์„ ๋Œ๋ ค์ฃผ๊ณ , ๋ธŒ๋ผ์šฐ์ €๋Š” ๋กœ๊ทธ์ธ ์ฐฝ์„ ๋„์›๋‹ˆ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ•ด์‹œ๋กœ ์ €์žฅํ•˜์„ธ์š”. ํ•ด์‹œ๋Š” ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

openssl passwd -6 '์‹ค์ œ๋น„๋ฐ€๋ฒˆํ˜ธ'

-6์€ SHA-512๋ฅผ ๋œปํ•˜๋ฉฐ, ์ถœ๋ ฅ๋œ ๋ฌธ์ž์—ด์„ password ๋’ค์— ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์‹œํ—˜์šฉ์œผ๋กœ ํ‰๋ฌธ์„ ์“ฐ๋ ค๋ฉด password ๋Œ€์‹  insecure-password๋ฅผ ์”๋‹ˆ๋‹ค. ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐฉ์‹์ด๋ผ, ์„ค์ • ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

ํŠน์ • ๊ฒฝ๋กœ์—๋งŒ ์ธ์ฆ์„ ๊ฑธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

userlist site_users
  user admin  password $6$rounds=5000$saltsalt$ํ•ด์‹œ๊ฐ’์„_์—ฌ๊ธฐ์—_๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”

frontend web
  bind :80
  acl is_admin_path path_beg /admin
  acl auth_ok       http_auth(site_users)
  http-request auth realm "Admin Only" if is_admin_path !auth_ok
  default_backend web_servers

backend web_servers
  balance roundrobin
  server web1 10.0.0.11:8080 check

โš ๏ธ Basic Auth๋Š” ์ž๊ฒฉ ์ฆ๋ช…์„ ๋งค ์š”์ฒญ๋งˆ๋‹ค ๊ทธ๋Œ€๋กœ ์‹ค์–ด ๋ณด๋ƒ…๋‹ˆ๋‹ค. HTTP๋กœ ์“ฐ๋ฉด ๋„คํŠธ์›Œํฌ์—์„œ ๊ทธ๋Œ€๋กœ ์ฝํž™๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ HTTPS์™€ ํ•จ๊ป˜ ์“ฐ์„ธ์š”. ๋˜ํ•œ ๊ณ„์ •์ด ์„ค์ • ํŒŒ์ผ์— ๋ฐ•ํžˆ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฌ๋Ÿฌ ๋ช…์ด๊ฑฐ๋‚˜ ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ์„œ๋น„์Šค์—๋Š” ๋งž์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์˜ ์ธ์ฆ์ด๋‚˜ OAuth ํ”„๋ก์‹œ๋ฅผ ์“ฐ์„ธ์š”.


12. ์™ธ๋ถ€ ์ •๋ณด๋กœ ์„œ๋ฒ„๋ฅผ ๋™์ ์œผ๋กœ ์ œ์™ธํ•˜๊ธฐ

ํ—ฌ์Šค์ฒดํฌ๋Š” "์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•˜๋Š”๊ฐ€"๋งŒ ๋ด…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์‘๋‹ต์€ ํ•˜๋Š”๋ฐ ๋นผ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ฐฐํฌ๊ฐ€ ์ง„ํ–‰ ์ค‘์ด๊ฑฐ๋‚˜, ๋””์Šคํฌ๊ฐ€ ์ฐผ๊ฑฐ๋‚˜, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž๊ธฐ ์ƒํƒœ๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์“ฐ๋Š” ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 1 โ€” agent-check: ์„œ๋ฒ„๊ฐ€ ์Šค์Šค๋กœ ์ƒํƒœ๋ฅผ ๋ณด๊ณ 

๊ฐ ์„œ๋ฒ„์— ์ž‘์€ ์—์ด์ „ํŠธ๋ฅผ ๋„์›Œ ๋‘๋ฉด HAProxy๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ ‘์†ํ•ด ํ•œ ์ค„์„ ์ฝ์–ด ๊ฐ‘๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž๊ธฐ ์ƒํƒœ๋ฅผ ๊ฐ€์žฅ ์ž˜ ์•Œ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

backend web_servers
  balance roundrobin
  server web1 10.0.0.11:8080 check agent-check agent-addr 10.0.0.11 agent-port 9999 agent-inter 5s
  server web2 10.0.0.12:8080 check agent-check agent-addr 10.0.0.12 agent-port 9999 agent-inter 5s

server ์ค„์€ ๋ฐ˜๋“œ์‹œ ํ•œ ์ค„๋กœ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„ค์ • ํŒŒ์ผ๊ณผ ๋‹ฌ๋ฆฌ HAProxy๋Š” ์—ญ์Šฌ๋ž˜์‹œ(\)๋ฅผ ์ด์šฉํ•œ ์ค„๋ฐ”๊ฟˆ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—์ด์ „ํŠธ๊ฐ€ ๋Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‘๋‹ต ์˜๋ฏธ
up / down ์ •์ƒ / ์ œ์™ธ
maint ์ ๊ฒ€ ์ƒํƒœ๋กœ ์ „ํ™˜
drain ์ƒˆ ์—ฐ๊ฒฐ๋งŒ ์ฐจ๋‹จํ•˜๊ณ  ๊ธฐ์กด ์—ฐ๊ฒฐ์€ ์œ ์ง€
ready ์ •์ƒ ๋ณต๊ท€
75% ๊ฐ€์ค‘์น˜๋ฅผ ์›๋ž˜์˜ 75%๋กœ ์กฐ์ •

์„œ๋ฒ„ ์ชฝ์—๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ๋„์›Œ ๋‘ก๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๋ถ€ํ•˜๊ฐ€ ๋†’์œผ๋ฉด ์Šค์Šค๋กœ ํŠธ๋ž˜ํ”ฝ์—์„œ ๋น ์ง€๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค.

while true; do
  if [ $(cut -d. -f1 /proc/loadavg) -gt 10 ]; then echo "drain"; else echo "up"; fi
done | socat TCP-LISTEN:9999,reuseaddr,fork -

๋ฐฉ๋ฒ• 2 โ€” Runtime API: ์™ธ๋ถ€ ์‹œ์Šคํ…œ์ด ์†Œ์ผ“์œผ๋กœ ์ œ์™ธ

๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๊ฐ€ ๊ด€๋ฆฌ ์†Œ์ผ“์œผ๋กœ ๋ช…๋ น์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์„ค์ • ๋ณ€๊ฒฝ๋„ ์žฌ์‹œ์ž‘๋„ ํ•„์š” ์—†๊ณ  ์ฆ‰์‹œ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์— ๋„ฃ๊ธฐ ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

# ๋ฐฐํฌ ์ „ โ€” ํŠธ๋ž˜ํ”ฝ ๋นผ๊ธฐ (๊ธฐ์กด ์—ฐ๊ฒฐ์€ ์ •์ƒ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์œ ์ง€)
echo "set server web_servers/web1 state drain" | sudo socat stdio /run/haproxy/haproxy.sock

# ๋ฐฐํฌ ํ›„ โ€” ๋ณต๊ท€
echo "set server web_servers/web1 state ready" | sudo socat stdio /run/haproxy/haproxy.sock

# ๊ฐ€์ค‘์น˜๋งŒ ๋‚ฎ์ถฐ ํŠธ๋ž˜ํ”ฝ์„ ์กฐ๊ธˆ์”ฉ ์˜ฎ๊ธฐ๊ธฐ (์นด๋‚˜๋ฆฌ ๋ฐฐํฌ)
echo "set server web_servers/web1 weight 10" | sudo socat stdio /run/haproxy/haproxy.sock

๋ฐฉ๋ฒ• 3 โ€” ๋งต ํŒŒ์ผ: ์š”์ฒญ ๋‹จ์œ„๋กœ ๋™์  ์ฐจ๋‹จ

์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ์š”์ฒญ์„ ๊ฑธ๋Ÿฌ ๋‚ด๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ฐจ๋‹จ ๋ชฉ๋ก์„ ํŒŒ์ผ๋กœ ๋‘๊ณ  ๋Ÿฐํƒ€์ž„์— ๊ฐฑ์‹ ํ•˜๋ฉด ๋ฆฌ๋กœ๋“œ ์—†์ด ์ฆ‰์‹œ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

frontend web
  bind :80
  acl is_blocked src,map_ip(/etc/haproxy/blocked.map) -m found
  http-request deny deny_status 403 if is_blocked
  default_backend web_servers

backend web_servers
  balance roundrobin
  server web1 10.0.0.11:8080 check
  server web2 10.0.0.12:8080 check

๋นˆ ํŒŒ์ผ์ด๋ผ๋„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘์–ด์•ผ ๊ธฐ๋™๋ฉ๋‹ˆ๋‹ค.

sudo touch /etc/haproxy/blocked.map

์ดํ›„ ๋ชฉ๋ก ๊ฐฑ์‹ ์€ ์†Œ์ผ“์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

echo "add map /etc/haproxy/blocked.map 1.2.3.4 blocked" | sudo socat stdio /run/haproxy/haproxy.sock
echo "del map /etc/haproxy/blocked.map 1.2.3.4"         | sudo socat stdio /run/haproxy/haproxy.sock
echo "show map /etc/haproxy/blocked.map"                | sudo socat stdio /run/haproxy/haproxy.sock

๋Ÿฐํƒ€์ž„ ๊ฐฑ์‹ ์€ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. HAProxy๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋ฉด ์‚ฌ๋ผ์ง€๋ฏ€๋กœ, ์˜๊ตฌํžˆ ์œ ์ง€ํ•˜๋ ค๋ฉด ํŒŒ์ผ์—๋„ ํ•จ๊ป˜ ๊ธฐ๋กํ•ด ๋‘์„ธ์š”.

์„ธ ๋ฐฉ๋ฒ•์€ ์„ฑ๊ฒฉ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ์„œ๋ฒ„ ์ž์‹ ์ด ํŒ๋‹จํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด 1๋ฒˆ, ๋ฐฐํฌ ๋„๊ตฌ์ฒ˜๋Ÿผ ์™ธ๋ถ€์—์„œ ํ†ต์ œํ•˜๋ ค๋ฉด 2๋ฒˆ, ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ ํŠน์ • ์ ‘์†์ž๋ฅผ ๋ง‰์œผ๋ ค๋ฉด 3๋ฒˆ์„ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๋กœ๊ทธ ํ™•์ธํ•˜๊ธฐ

์ด ํŒจํ‚ค์ง€๋Š” rsyslog ๊ทœ์น™(/etc/rsyslog.d/49-haproxy.conf)์„ ํ•จ๊ป˜ ์„ค์น˜ํ•ด์„œ, ๋กœ๊ทธ๋ฅผ ์‹ฌ๊ฐ๋„๋ณ„๋กœ ์„ธ ํŒŒ์ผ์— ๋‚˜๋ˆ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋‚ด์šฉ
/var/log/haproxy/access.log ์š”์ฒญ ๊ธฐ๋ก (๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ์š”์ฒญํ–ˆ๋Š”์ง€)
/var/log/haproxy/status.log ์ƒํƒœ ๋ณ€ํ™” (์„œ๋ฒ„๊ฐ€ ์˜ฌ๋ผ์˜ค๊ณ  ๋‚ด๋ ค๊ฐ„ ๊ธฐ๋ก)
/var/log/haproxy/error.log ์˜ค๋ฅ˜
sudo tail -f /var/log/haproxy/access.log

๋กœ๊ทธ๋Š” logrotate ์„ค์ •์— ๋”ฐ๋ผ ๋งค์ผ ํ•œ ๋ฒˆ ์ •๋ฆฌ๋˜๊ณ  14์ผ์น˜๊ฐ€ ์••์ถ• ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋””์Šคํฌ๊ฐ€ ์ฐจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ ํŒŒ์ผ์ด ๊ณ„์† ๋น„์–ด ์žˆ๋‹ค๋ฉด rsyslog๊ฐ€ ๋Œ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. HAProxy๋Š” ๋กœ๊ทธ๋ฅผ ์ง์ ‘ ํŒŒ์ผ์— ์“ฐ์ง€ ์•Š๊ณ  rsyslog์— ๋„˜๊ธฐ๋Š” ๊ตฌ์กฐ๋ผ, rsyslog๊ฐ€ ๋ฉˆ์ถฐ ์žˆ์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์Œ“์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

sudo systemctl status rsyslog
sudo systemctl restart rsyslog

systemd ์ €๋„์—์„œ๋„ ์„œ๋น„์Šค ์ž์ฒด์˜ ๊ธฐ๋™ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sudo journalctl -u haproxy -f

๋กœ๊ทธ๊ฐ€ ์Œ“์ด๋ฉด ํ•จ๊ป˜ ์„ค์น˜๋œ halog ๋„๊ตฌ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ์‹œ๊ฐ„์ด ๋А๋ฆฐ ์š”์ฒญ์„ ๋ฝ‘์•„๋‚ด๋Š” ๋“ฑ์˜ ํ†ต๊ณ„๋ฅผ ๋‚ด ์ค๋‹ˆ๋‹ค.

halog -srv < /var/log/haproxy/access.log

์ƒˆ HAProxy ๋ฒ„์ „์œผ๋กœ ์˜ฌ๋ฆฌ๊ธฐ

์ด ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์ž์ฃผ ํ•˜๊ฒŒ ๋  ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

1๋‹จ๊ณ„ โ€” ์ตœ์‹  ๋ฒ„์ „ ํ™•์ธ. haproxy.org ์ฒซ ํ™”๋ฉด์˜ "Latest versions" ํ‘œ์—์„œ ์›ํ•˜๋Š” ๊ณ„์—ด์˜ ์ตœ์‹  ๋ฒ„์ „์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์— LTS๋ผ๊ณ  ์ ํžŒ ๊ณ„์—ด์ด ์žฅ๊ธฐ ์ง€์› ๋ฒ„์ „์ด๋ผ ์šด์˜ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•˜๊ณ , dev๊ฐ€ ๋ถ™์€ ๊ฒƒ์€ ๊ฐœ๋ฐœ ์ค‘์ธ ๋ฒ„์ „์ด๋ผ ์“ฐ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

2๋‹จ๊ณ„ โ€” Makefile ์ˆ˜์ •. ์ €์žฅ์†Œ์˜ Makefile ๋งจ ์œ„ ๋‘ ์ค„๋งŒ ๊ณ ์น˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

MAINVERSION?=3.4      # ๊ณ„์—ด ๋ฒ„์ „ (์•ž ๋‘ ์ž๋ฆฌ)
VERSION=3.4.3         # ์ •ํ™•ํ•œ ๋ฒ„์ „ (์„ธ ์ž๋ฆฌ)

์˜ˆ๋ฅผ ๋“ค์–ด 3.4.5๊ฐ€ ๋‚˜์™”๋‹ค๋ฉด VERSION=3.4.5๋กœ๋งŒ ๋ฐ”๊พธ๋ฉด ๋˜๊ณ , 3.6 ๊ณ„์—ด๋กœ ์˜ฎ๊ฒจ ๊ฐ„๋‹ค๋ฉด MAINVERSION?=3.6, VERSION=3.6.0 ์ฒ˜๋Ÿผ ๋‘˜ ๋‹ค ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

ํŒŒ์ผ์„ ๊ณ ์น˜์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ๋งŒ ๋นŒ๋“œํ•˜๋ ค๋ฉด ๋ช…๋ น์ค„์—์„œ ๋ฐ”๋กœ ๋„˜๊ธธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ์†Œ์˜ ๊ธฐ๋ณธ ๋ฒ„์ „์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์‹œํ—˜ํ•ด ๋ณผ ๋•Œ ํŽธํ•ฉ๋‹ˆ๋‹ค.

make run-docker VERSION=3.2.22 MAINVERSION=3.2

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ณ„์—ด์„ ๊ฐ๊ฐ ๋นŒ๋“œํ•ด ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ RPMS/ ๋Š” ๋งค๋ฒˆ ๋ฎ์–ด์“ฐ์ด๋ฏ€๋กœ, ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ๋ชจ์•„ ๋‘๋ ค๋ฉด ๋นŒ๋“œ๊ฐ€ ๋๋‚  ๋•Œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์˜ฎ๊ฒจ ๋‘์„ธ์š”.

3๋‹จ๊ณ„ โ€” ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ํ™•์ธ.

make run-docker
ls -lh RPMS/el8/ RPMS/el9/

4๋‹จ๊ณ„ โ€” ๊ฒ€์ฆ. ์šด์˜์— ์˜ฌ๋ฆฌ๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์„ค์น˜ํ•ด ๋ณด๊ณ , ๋ฒ„์ „๊ณผ ๊ธฐ๋Šฅ์ด ์˜๋„๋Œ€๋กœ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

haproxy -v      # ๋ฒ„์ „ ํ™•์ธ
haproxy -vv     # ์ผœ์ง„ ๊ธฐ๋Šฅ ์ „์ฒด ํ™•์ธ

๊ฐ™์€ HAProxy ๋ฒ„์ „์ธ๋ฐ ํŒจํ‚ค์ง€๋งŒ ๋‹ค์‹œ ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•ด์•ผ ํ•œ๋‹ค๋ฉด(์˜ˆ: ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •), VERSION ๋Œ€์‹  RELEASE ๊ฐ’์„ ์˜ฌ๋ฆฌ์„ธ์š”. make run-docker RELEASE=2 ์ฒ˜๋Ÿผ ์“ฐ๋ฉด dnf๊ฐ€ ์ƒˆ ํŒจํ‚ค์ง€๋กœ ์ธ์‹ํ•ด ์—…๊ทธ๋ ˆ์ด๋“œํ•ด ์ค๋‹ˆ๋‹ค.


๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ

์„œ๋น„์Šค๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์•„์š”

๋จผ์ € ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์„ค์ • ํŒŒ์ผ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

sudo systemctl status haproxy
sudo journalctl -u haproxy -n 50 --no-pager
sudo haproxy -c -f /etc/haproxy/haproxy.cfg

-c ๊ฒ€์‚ฌ์—์„œ ๋‚˜์˜ค๋Š” ๋ฉ”์‹œ์ง€๋Š” ๋ช‡ ๋ฒˆ์งธ ์ค„์ด ์ž˜๋ชป๋๋Š”์ง€๊นŒ์ง€ ์•Œ๋ ค ์ฃผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํฌํŠธ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ผ๊ณ  ๋‚˜์™€์š”

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ™์€ ํฌํŠธ๋ฅผ ์“ฐ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ์“ฐ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค, ๊ทธ ํ”„๋กœ๊ทธ๋žจ์„ ๋„๊ฑฐ๋‚˜ HAProxy ์ชฝ ํฌํŠธ๋ฅผ ๋ฐ”๊พธ์„ธ์š”.

sudo ss -tlnp | grep -E ':80|:9000'

ํ†ต๊ณ„ ํŽ˜์ด์ง€๊ฐ€ ์•ˆ ์—ด๋ ค์š”

์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•˜์„ธ์š”. ์„œ๋ฒ„ ์•ˆ์—์„œ๋Š” ์—ด๋ฆฌ๋Š”๋ฐ ๋ฐ–์—์„œ๋งŒ ์•ˆ ๋œ๋‹ค๋ฉด ๋ฐฉํ™”๋ฒฝ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

sudo systemctl is-active haproxy                          # ์„œ๋น„์Šค๊ฐ€ ๋–  ์žˆ๋‚˜
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/haproxy_stats   # 200์ด ๋‚˜์˜ค๋‚˜
sudo firewall-cmd --list-ports                            # 9000 ํฌํŠธ๊ฐ€ ์—ด๋ ค ์žˆ๋‚˜

SELinux ๋•Œ๋ฌธ์— ๋ง‰ํžˆ๋Š” ๊ฒƒ ๊ฐ™์•„์š”

SELinux๊ฐ€ ์ผœ์ง„ ์ƒํƒœ์—์„œ๋Š” HAProxy๊ฐ€ ๋น„ํ‘œ์ค€ ํฌํŠธ์— ๋ฐ”์ธ๋”ฉํ•˜๊ฑฐ๋‚˜ ๋ฐฑ์—”๋“œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € SELinux๊ฐ€ ์›์ธ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

sudo getenforce
sudo ausearch -m avc -ts recent | grep haproxy

์›์ธ์ด ๋งž๋‹ค๋ฉด, SELinux๋ฅผ ํ†ต์งธ๋กœ ๋„๊ธฐ๋ณด๋‹ค ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. HAProxy๊ฐ€ ์ž„์˜์˜ ํฌํŠธ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ์•„๋ž˜ ํ•œ ์ค„์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

sudo setsebool -P haproxy_connect_any 1

ํŠน์ • ํฌํŠธ๋ฅผ ์“ฐ๊ฒŒ ํ•˜๋ ค๋ฉด ๊ทธ ํฌํŠธ๋ฅผ HTTP ํฌํŠธ๋กœ ๋“ฑ๋กํ•ด ์ค๋‹ˆ๋‹ค.

sudo semanage port -a -t http_port_t -p tcp 9000

์„ค์น˜ํ•  ๋•Œ ์˜์กด์„ฑ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์š”

rpm -i ๋Œ€์‹  dnf install์„ ์“ฐ์„ธ์š”. rpm ๋ช…๋ น์€ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์„ค์น˜ํ•ด ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

sudo dnf install -y ./haproxy-3.4.3-1.el9.x86_64.rpm

๊ทธ๋ž˜๋„ ์˜์กด์„ฑ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด ํŒจํ‚ค์ง€ ๋ฒ„์ „์ด ์„œ๋ฒ„์™€ ์•ˆ ๋งž๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. RHEL 8 ์„œ๋ฒ„์— el9 ํŒจํ‚ค์ง€๋ฅผ ๋„ฃ์œผ๋ฉด OpenSSL ๋ฒ„์ „์ด ๋‹ฌ๋ผ ์„ค์น˜๊ฐ€ ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค. cat /etc/redhat-release๋กœ ์„œ๋ฒ„ ๋ฒ„์ „์„ ํ™•์ธํ•˜๊ณ  ๋งž๋Š” ํŒŒ์ผ์„ ์“ฐ์„ธ์š”.

๋นŒ๋“œ ๋„์ค‘ ๋‹ค์šด๋กœ๋“œ์— ์‹คํŒจํ•ด์š”

๋นŒ๋“œ ๊ณผ์ •์—์„œ haproxy.org์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ํ์‡„๋ง์ด๊ฑฐ๋‚˜ ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด ๋นŒ๋“œ๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. ์‚ฌ๋‚ด ํ”„๋ก์‹œ๊ฐ€ ์žˆ๋‹ค๋ฉด Docker ๋ฐ๋ชฌ๊ณผ ์ปจํ…Œ์ด๋„ˆ ์–‘์ชฝ์— ํ”„๋ก์‹œ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

์„œ๋ฒ„์— ์„ค์น˜ํ•œ ๋’ค์—๋Š” ๋งค๋‰ด์–ผ์ด ๋กœ์ปฌ์—๋„ ํ•จ๊ป˜ ๊น”๋ฆฝ๋‹ˆ๋‹ค.

man haproxy
man halog
ls /usr/share/doc/haproxy/

๋ผ์ด์„ ์Šค

๋ผ์ด์„ ์Šค๊ฐ€ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šฐ๋‹ˆ ๊ตฌ๋ถ„ํ•ด์„œ ๋ณด์„ธ์š”.

๋Œ€์ƒ ๋ผ์ด์„ ์Šค
์ด ์ €์žฅ์†Œ์˜ ๋นŒ๋“œ ๋„๊ตฌ (spec, Makefile, Dockerfile, ์Šคํฌ๋ฆฝํŠธ, ๋ฌธ์„œ) GPL v3 โ€” ์ €์žฅ์†Œ์˜ LICENSE ํŒŒ์ผ
ํŒจํ‚ค์ง•๋˜๋Š” HAProxy ๋ณธ์ฒด GPLv2+ โ€” RPM ์˜ License ํ•„๋“œ์— ์„ ์–ธ๋œ ๊ฐ’

์ด ์ €์žฅ์†Œ๋Š” philyuchkoff/HAProxy-2-RPM-builder ์—์„œ ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ ํŒŒ์ƒ๋ฌผ์ด๊ณ , ์› ์ €์žฅ์†Œ๊ฐ€ GPLv3 ์ด๋ฏ€๋กœ ์ด ์ €์žฅ์†Œ๋„ GPLv3 ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ํฌํฌํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ด์„œ ๋ฐฐํฌํ•˜์‹ค ๋•Œ๋„ GPLv3 ์กฐ๊ฑด์ด ๊ทธ๋Œ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์„ค์น˜๋œ ํŒจํ‚ค์ง€์˜ ๋ผ์ด์„ ์Šค๋Š” ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

rpm -qi haproxy | grep License        # GPLv2+ (HAProxy ๋ณธ์ฒด)

About

HAProxy 3 RPM Builder

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages