์ด ์ ์ฅ์๋ 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 ์ ๋ฒ์ ๋ณ ์ฃผ์ ๊ธฐ๋ฅ๊ณผ ์ง์ ๊ธฐ๊ฐ, ์ ํ ๊ธฐ์ค์ ์ ๋ฆฌํด ๋์์ต๋๋ค.
- ๋น ๋ฅธ ์์
- ๋ฌด์์ด ๋ง๋ค์ด์ง๋์
- ๋น๋ ์ค๋นํ๊ธฐ
- ๋ฐฉ๋ฒ 1 โ Docker๋ก ๋น๋ํ๊ธฐ (๊ถ์ฅ)
- ๋ฐฉ๋ฒ 2 โ ์๋ฒ์์ ์ง์ ๋น๋ํ๊ธฐ
- ๋น๋ ์ต์
- ์ค์นํ๊ณ ์คํํ๊ธฐ
- ํต๊ณ(Stats) ํ์ด์ง
- ์ค์ ํ์ผ ์ดํดํ๊ธฐ
- ์ค์ ์์ ๋ชจ์ โ ์น ยท HTTPS ยท ๋ผ์ฐํ ยท DB ยท TCP ยท ์๋ ์ ํ
- ๋ก๊ทธ ํ์ธํ๊ธฐ
- ์ HAProxy ๋ฒ์ ์ผ๋ก ์ฌ๋ฆฌ๊ธฐ
- ๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋
- ์ฐธ๊ณ ์๋ฃ
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์์ ์์ค ์ฝ๋๋ฅผ ๋ด๋ ค๋ฐ์ผ๋ฏ๋ก ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ํ์ํฉ๋๋ค.
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:9Dockerfile์ ํ๋์ ๋๋ค. EL8๊ณผ EL9์ ์ค์น ํจํค์ง ๋ชฉ๋ก์ด ์์ ํ ๊ฐ์์, ํ์ผ์ ๋ณต์ ํ๋ ๋์
BASE_IMAGE์ธ์๋ก ๋ฒ ์ด์ค๋ง ๋ฐ๊ฟ๋๋ค. ๋์ค์ EL10์ ์ถ๊ฐํ ๋๋ Makefile์ ํ ์ค๋ง ๋ํ๋ฉด ๋ฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์ 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
makeDocker ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ ๊ฒฐ๊ณผ๋ฌผ์ด 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๋ฅผ ๋ถ์ฌ ์คํ |
make run-docker USE_LUA=1Lua๋ฅผ ์ผ๋ฉด HAProxy ์ค์ ์์์ Lua ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๋ณต์กํ ์์ฒญ ๋ผ์ฐํ ๊ท์น์ด๋ ์ปค์คํ ์ธ์ฆ ๋ก์ง์ฒ๋ผ, ๊ธฐ๋ณธ ์ค์ ๋ฌธ๋ฒ๋ง์ผ๋ก๋ ํํํ๊ธฐ ์ด๋ ค์ด ์ฒ๋ฆฌ๋ฅผ ์ง์ ์ฝ๋๋ก ์งค ๋ ์๋๋ค. ๋น๋ ๊ณผ์ ์์ Lua 5.4.7์ ์์ค๋ก ํจ๊ป ์ปดํ์ผํ๋ฏ๋ก ์๊ฐ์ด ๋ช ๋ถ ๋ ๊ฑธ๋ฆฝ๋๋ค.
make run-docker USE_PROMETHEUS=1Prometheus๋ 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 haproxyactive (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 --reloadHAProxy์๋ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ด์ด ๋ณด๋ ์ค์๊ฐ ์ํ ํ๋ฉด์ด ๋ด์ฅ๋์ด ์์ต๋๋ค. ๋ณ๋ ํ๋ก๊ทธ๋จ์ ์ค์นํ ํ์ ์์ด, ์ง๊ธ ํธ๋ํฝ์ด ์ผ๋ง๋ ๋ค์ด์ค๋์ง ยท ์ด๋ ๋ฐฑ์๋ ์๋ฒ๊ฐ ์ฃฝ์๋์ง ยท ์ค๋ฅ๊ฐ ์ผ๋ง๋ ๋๋์ง๋ฅผ ํ๋์ ๋ณผ ์ ์์ต๋๋ค. ์ฅ์ ๊ฐ ๋ฌ์ ๋ ๊ฐ์ฅ ๋จผ์ ์ด์ด ๋ณด๊ฒ ๋๋ ํ๋ฉด์ ๋๋ค.
์ด ํจํค์ง๋ ํต๊ณ ํ์ด์ง๊ฐ ์ฒ์๋ถํฐ ์ผ์ง ์ฑ๋ก ์ค์น๋ฉ๋๋ค. ์๋น์ค๋ฅผ ์์ํ ๋ค ๋ธ๋ผ์ฐ์ ์์ ์๋ ์ฃผ์๋ก ๋ค์ด๊ฐ๋ฉด ๋ฉ๋๋ค.
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 haproxystats 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์ ๋ ๊ฐ์ ์๋ฒ๋ก ๊ฐ์ผ ์ ์ค๋ฅ ์ด ์ค๋ฆ ๋๋ค |
๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ํํ์ ๋๋ค. ์ฌ๋ฌ ๋์ ์น ์๋ฒ(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ํ ์ฐ์ ์ฑ๊ณตํด์ผ ๋ค์ ์ด๋ฆฌ๋ ๊ฒ์ผ๋ก ๋ด
๋๋ค. ์๊ฐ์ ์ธ ๋คํธ์ํฌ ๋ถ์์ ์ผ๋ก ์๋ฒ๊ฐ ๋ค๋ฝ๋ ๋ฝํ๋ ๊ฒ์ ๋ง์ ์ค๋๋ค.
๋ถํ ๋ถ์ฐ์ ๊ฑธ๋ฉด ์น ์๋ฒ ์
์ฅ์์๋ ๋ชจ๋ ์์ฒญ์ด 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)์์ ์ด ํค๋๋ฅผ ์ ๋ขฐํ๋๋ก ์ค์ ํด ์ฃผ์ด์ผ ๋ก๊ทธ์ ์ ๋๋ก ์ฐํ๋๋ค.
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/
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์ ์ ๋๋ก ์ง์ ํ์ธ์.
ํ ๋์ 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 |
๋ก๊ทธ์ธ ์ํ๋ฅผ ์๋ฒ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๊ณ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด, ๊ฐ์ ์ฌ์ฉ์๋ฅผ ๊ณ์ ๊ฐ์ ์๋ฒ๋ก ๋ณด๋ด์ผ ํฉ๋๋ค. 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
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ HTTP๊ฐ ์๋๋ฏ๋ก ๋ฐ๋์ mode tcp ๋ก ๋์์์ผ์ผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์น๊ณผ ๋ฌ๋ฆฌ ์ฐ๊ฒฐ์ด ์ค๋ ์ ์ง๋๋ฏ๋ก ํ์์์์ ๋๋ํ ์ก์์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ธ 50์ด๋ฅผ ๊ทธ๋๋ก ์ฐ๋ฉด ์กฐ๊ธ ๊ธด ์ฟผ๋ฆฌ๊ฐ ๋์ค์ ๋๊น๋๋ค.
์ฝ๊ธฐ ๋ถํ๋ฅผ ๋ณต์ ์๋ฒ๋ก ๋ถ์ฐํ๋ ๊ตฌ์ฑ์ ๋๋ค.
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๋ก ์ ์ํ๋๋ก ๋๋๋ฉด ๋ฉ๋๋ค.
๋ฐฉ์์ 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๋ ๋ง์คํฐ ํ ๋์๋ง ์จ์ผ ํ๋ฏ๋ก, ๋ง์คํฐ๋ฅผ ์๋์ผ๋ก ์ฐพ์๋ด๋ ํฌ์ค์ฒดํฌ๋ฅผ ์๋๋ค.
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์ ๋ฐฑ์ฌ๋์๋ ๋ฌธ๋ฒ์ ๋ฐ๋์ ํ์ํ๋ ๊ทธ๋๋ก ์ ์ด ์ฃผ์ธ์.
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๋ก ๋ฎ์ด์ฐ๋ฉด ๋ฉ๋๋ค.
ํน์ 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 ์ด์ ๋ณด๋ฉด์ ์กฐ์ฌ ๋๊ฐ์ธ์. ๋๋ฌด ๋นก๋นกํ๋ฉด ์ ์ ์ฌ์ฉ์๊ฐ ์ฐจ๋จ๋ฉ๋๋ค.
์๋ฒ๋ฅผ ์ ๊ฒํ ๋ ํธ๋ํฝ๋ง ์ ์ ๋นผ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ค์ ํ์ผ์ 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์ ์ผ ๋์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ฒํผ์ผ๋ก๋ ๊ฐ์ ์ผ์ ํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ๋ก๊ทธ์ธ ์ฐฝ์ผ๋ก ์ ๊ทผ์ ์ ํํฉ๋๋ค. ๊ด๋ฆฌ ํ์ด์ง๋ ์ฌ๋ด ๋๊ตฌ์ฒ๋ผ ๊ฐ๋จํ ๋ณดํธ๋ง ํ์ํ ๊ณณ์ ์ฐ๊ธฐ ์ข์ต๋๋ค.
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 ํ๋ก์๋ฅผ ์ฐ์ธ์.
ํฌ์ค์ฒดํฌ๋ "์๋ฒ๊ฐ ์๋ตํ๋๊ฐ"๋ง ๋ด ๋๋ค. ํ์ง๋ง ์ค์ ๋ก๋ ์๋ต์ ํ๋๋ฐ ๋นผ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ฐฐํฌ๊ฐ ์งํ ์ค์ด๊ฑฐ๋, ๋์คํฌ๊ฐ ์ฐผ๊ฑฐ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๊ธฐ ์ํ๋ฅผ ์ด๋ฏธ ์๊ณ ์๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ด ๋ ์ฐ๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๊ฐ ์๋ฒ์ ์์ ์์ด์ ํธ๋ฅผ ๋์ ๋๋ฉด 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 -๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๊ฐ ๊ด๋ฆฌ ์์ผ์ผ๋ก ๋ช ๋ น์ ๋ณด๋ด๋ ๋ฐฉ์์ ๋๋ค. ์ค์ ๋ณ๊ฒฝ๋ ์ฌ์์๋ ํ์ ์๊ณ ์ฆ์ ๋ฐ์๋ฉ๋๋ค. ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ๋ฃ๊ธฐ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
# ๋ฐฐํฌ ์ โ ํธ๋ํฝ ๋นผ๊ธฐ (๊ธฐ์กด ์ฐ๊ฒฐ์ ์ ์ ์ข
๋ฃ๋ ๋๊น์ง ์ ์ง)
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์๋ฒ๊ฐ ์๋๋ผ ์์ฒญ์ ๊ฑธ๋ฌ ๋ด๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ฐจ๋จ ๋ชฉ๋ก์ ํ์ผ๋ก ๋๊ณ ๋ฐํ์์ ๊ฐฑ์ ํ๋ฉด ๋ฆฌ๋ก๋ ์์ด ์ฆ์ ๋ฐ์๋ฉ๋๋ค.
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 rsyslogsystemd ์ ๋์์๋ ์๋น์ค ์์ฒด์ ๊ธฐ๋ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
sudo journalctl -u haproxy -f๋ก๊ทธ๊ฐ ์์ด๋ฉด ํจ๊ป ์ค์น๋ halog ๋๊ตฌ๋ก ๋ถ์ํ ์ ์์ต๋๋ค. ์๋ต ์๊ฐ์ด ๋๋ฆฐ ์์ฒญ์ ๋ฝ์๋ด๋ ๋ฑ์ ํต๊ณ๋ฅผ ๋ด ์ค๋๋ค.
halog -srv < /var/log/haproxy/access.log์ด ์ ์ฅ์๋ฅผ ๊ด๋ฆฌํ๋ฉด์ ๊ฐ์ฅ ์์ฃผ ํ๊ฒ ๋ ์์ ์ ๋๋ค. ์๊ฐ๋ณด๋ค ๊ฐ๋จํฉ๋๋ค.
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๊ฐ ์ผ์ง ์ํ์์๋ 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 9000rpm -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 ๋ฐ๋ชฌ๊ณผ ์ปจํ
์ด๋ ์์ชฝ์ ํ๋ก์ ์ค์ ์ด ํ์ํฉ๋๋ค.
- HAProxy ๊ณต์ ํํ์ด์ง โ ์ต์ ๋ฒ์ ๊ณผ ์ง์ ๊ธฐ๊ฐ ํ์ธ
- HAProxy 3.4 ์ค์ ๋งค๋ด์ผ โ ๋ชจ๋ ์ค์ ํญ๋ชฉ์ ์์ธ ์ค๋ช
- HAProxy ๊ด๋ฆฌ ๊ฐ์ด๋ โ ์ด์ ์ค ๊ด๋ฆฌ ๋ช ๋ น
- HAProxy ์ ๋ฌธ ๋ฌธ์ โ ๊ฐ๋ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ
์๋ฒ์ ์ค์นํ ๋ค์๋ ๋งค๋ด์ผ์ด ๋ก์ปฌ์๋ ํจ๊ป ๊น๋ฆฝ๋๋ค.
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 ๋ณธ์ฒด)