Skip to content

Instantly share code, notes, and snippets.

@ruo91
Last active June 11, 2023 06:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ruo91/cad21cfb8e0d6395e2c80d11b19bd1ba to your computer and use it in GitHub Desktop.
Save ruo91/cad21cfb8e0d6395e2c80d11b19bd1ba to your computer and use it in GitHub Desktop.
How to Install and Configure HAProxy+QUIC on Rocky Linux 9

How to Install and Configure HAProxy+QUIC on Rocky Linux 9

RockyLinux 9 ๋ฒ„์ „์—์„œ HAProxy+QUIC ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•œ๋‹ค.

1. HAProxy๋ž€?

HAProxy๋Š” C ์–ธ์–ด๋กœ ๊ฐœ๋ฐœ๋œ TCP ๋ฐ HTTP ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ๊ณ ๊ฐ€์šฉ์„ฑ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์™€ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด๋‹ค.

TCP ๋ฐ HTTP ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑํ•˜๊ณ  ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์€ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์‚ฌ์ด์— ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•˜์—ฌ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ๊ฐ€์šฉ์„ฑ์„ ๋†’์ด๋Š” ๊ธฐ์ˆ ์ด๋‹ค.
์—ฌ๋Ÿฌ ์„œ๋ฒ„๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ๋ถ„์‚ฐํ•˜์—ฌ ๋ถ€ํ•˜๋ฅผ ๊ณต์ •ํ•˜๊ฒŒ ๋ถ„๋ฐฐํ•˜๊ณ , ๊ฐ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉฐ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์„œ๋ฒ„๋ฅผ ์ œ์™ธ์‹œํ‚ด์œผ๋กœ์จ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ผ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์–ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ์ค‘๊ฐœํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๋ณด์•ˆ, ๋กœ๊น…, SSL ์ข…๋‹จ ๊ฐ์‹œ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

๋†’์€ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ, ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, HTTP/1.1, HTTP/2, HTTP/3, TCP, SSL ๋“ฑ ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•œ๋‹ค.
์ฃผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜(MicroService Architecture, MSA)์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋Œ€๊ทœ๋ชจ ์›น ์‚ฌ์ดํŠธ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

MSA์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋กœ๋Š” RedHat OpenShift์˜ Ingress Controller์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์œผ๋ฉฐ,
์‹ค์ œ๋กœ ๋ณธ์ธ์€ ํ˜„์—…์—์„œ OpenShift ์—”์ง€๋‹ˆ์–ด๋กœ ์žฌ์ง ์ค‘์ด๊ณ , ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ์‹œ ์—ฌ๋Ÿฌ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์„ ์ž˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ–ˆ๋‹ค.

2. QUIC๋ž€?

QUIC (Quick UDP Internet Connections)๋Š” ์›น ํ”„๋กœํ† ์ฝœ์˜ ํ•˜๋‚˜๋กœ์„œ, Google์ด YouTube, Gmail ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.
๊ธฐ์กด์˜ TCP(Transmission Control Protocol)๋ฅผ ๋Œ€์ฒดํ•˜๊ณ ์ž ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, OSI 7 ๊ณ„์ธต์˜ Layer 4 ์ „์†ก ๊ณ„์ธต(Transport Layer)์—์„œ ์ž‘๋™ํ•˜๋Š” UDP(User Datagram Protocol)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.

QUIC๋Š” TCP์™€ ๋น„๊ตํ•˜์—ฌ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์ ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์ธ TCP ์—ฐ๊ฒฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” Handshake์™€ RTT(Round-Trip Time)์„ ์ค„์—ฌ ๋น ๋ฅธ ์—ฐ๊ฒฐ ์„ค์ •์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ , TCP์˜ ํ˜ผ์žก ์ œ์–ด(TCP Congestion Control)์™€ ์žฌ์ „์†ก ๊ธฐ๋Šฅ์„ ๊ฐœ์„ ํ•˜์—ฌ ํŒจํ‚ท ์†์‹ค ๋ฐ ์ง€์—ฐ์„ ๊ฐ์†Œ์‹œํ‚ค๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋™์‹œ ์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ์–ด์„œ,
์›น ํŽ˜์ด์ง€์˜ ๋ฆฌ์†Œ์Šค๋“ค์„ ๋™์‹œ์— ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ, ๋”์šฑ ๋น ๋ฅธ ์›น ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ๋‹จ์ถ• ์‹œํ‚ค๊ณ  ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์˜ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

QUIC๋Š” ์ฃผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €์™€ ์›น ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, HTTP/3(Hypertext Transfer Protocol version 3)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.
ํ˜„์žฌ QUIC์€ IETF(Internet Engineering Task Force)์—์„œ 2021๋…„ 5์›”์— ํ‘œ์ค€ํ™” ๋ฐœํ‘œํ•˜์˜€์œผ๋ฉฐ, ๋งŽ์€ ์ธํ„ฐ๋„ท ๊ธฐ์—…๋“ค์ด QUIC๋ฅผ ์ง€์›ํ•˜๊ณ  ๋„์ž…ํ•˜๊ณ  ์žˆ๋‹ค.

2.1. QUIC ํŠน์ง•

- ์„ฑ๋Šฅ ํ–ฅ์ƒ

QUIC๋Š” UDP๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ TCP์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋” ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„๊ณผ ๋” ๋†’์€ ๋Œ€์—ญํญ์„ ์ œ๊ณตํ•œ๋‹ค.
์ด๋Š” ์›น ํŽ˜์ด์ง€์˜ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•˜๋‹ค.

- ์—ฐ๊ฒฐ ์„ค์ •

QUIC์€ ๊ธฐ์กด์˜ TCP์™€ ๋‹ฌ๋ฆฌ ์—ฐ๊ฒฐ ์„ค์ • ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
์ด๋Š” ์›น ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ, TCP HOL(Head-of-Line Blocking) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋ณด์•ˆ

QUIC๋Š” TLS(Transport Layer Security) ์•”ํ˜ธํ™”๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ , ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ฐ€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

- ์ด๋™์„ฑ

QUIC๋Š” IP ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์—๋„ ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ๋ฐ”์ผ ์žฅ์น˜์™€ ๊ฐ™์ด ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์ด ๋ถˆ์•ˆ์ •ํ•œ ํ™˜๊ฒฝ์—์„œ ์œ ์šฉํ•˜๋‹ค.

2.2. QUIC ํ”„๋กœํ† ์ฝœ ์ŠคํŽ™ ๋ฌธ์„œ

- QUIC Transport Protocol

RFC 9000: https://datatracker.ietf.org/doc/html/rfc9000

- QUIC TLS

RFC 9001: https://datatracker.ietf.org/doc/html/rfc9001

- QUIC Recovery and Congestion Control

RFC 9002: https://datatracker.ietf.org/doc/html/rfc9002

- QUIC Loss Detection and Congestion Control

RFC 9003: https://datatracker.ietf.org/doc/html/rfc9003

3. HAProxy ๋นŒ๋“œ

RockyLinux 9 ๊ธฐ๋ฐ˜์—์„œ HAProxy๋ฅผ ์†Œ์Šค ์ปดํŒŒ์ผ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•œ๋‹ค.

3.1. HAProxy ์‚ฌ์šฉ์ž & ๊ทธ๋ฃน ์ƒ์„ฑ

HAProxy์—์„œ ์‚ฌ์šฉํ•  ์‚ฌ์šฉ์ž์™€ ๊ทธ๋ฃน์„ ์ƒ์„ฑํ•œ๋‹ค.

[root@haproxy ~]# HAPROXY_UID=1000
[root@haproxy ~]# HAPROXY_GID=1000
[root@haproxy ~]# groupadd -g $HAPROXY_GID haproxy
[root@haproxy ~]# useradd -d $PREFIX_DIR -c "HAProxy User" -u $HAPROXY_UID -g $HAPROXY_GID -s /sbin/nologin haproxy

3.2. ํ•„์š” ํŒจํ‚ค์ง€ ์„ค์น˜

์†Œ์Šค ์ปดํŒŒ์ผ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ ํ•œ๋‹ค.

[root@haproxy ~]# dnf groupinstall 'Development Tools'
[root@haproxy ~]# dnf install epel-release
[root@haproxy ~]# dnf install systemd-devel git-core procps-ng perl-FindBin perl-IPC-Cmd perl-Pod-Html cmake make gcc g++ perl python

3.3. Golang ์„ค์น˜

Go๋Š” 2007๋…„์— ๊ฐœ๋ฐœ๋œ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋‹ค.
Google์—์„œ ๊ฐœ๋ฐœํ•œ Go๋Š” ๊ฐ„๊ฒฐํ•˜๋ฉด์„œ๋„ ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ,
์ •์  ํƒ€์ž…์˜ ์ปดํŒŒ์ผ ์–ธ์–ด๋กœ, C์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ์ˆ˜์ค€์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋ฉด์„œ๋„ ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

BoringSSL ๋นŒ๋“œ์‹œ Golang์„ ํ•„์š”๋กœํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์„ฑํ•œ๋‹ค.
QuicSSL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Golang์„ ๊ตณ์ด ๊ตฌ์„ฑํ•  ํ•„์š”๋Š” ์—†๋‹ค.

3.3.1. Golang ๊ตฌ์„ฑ

[root@haproxy ~]# cd /opt
[root@haproxy ~]# curl -LO "https://go.dev/dl/go1.20.5.linux-amd64.tar.gz"
[root@haproxy ~]# tar xzvf go1.20.5.linux-amd64.tar.gz
[root@haproxy ~]# mkdir /opt/gopath

3.3.2. Golang Profile ๋ณ€์ˆ˜ ์„ค์ •

[root@haproxy ~]# vi /etc/profile
# GoLang
export GO_HOME=/opt/go
export GOPATH=/opt/gopath
export PATH=$PATH:$GO_HOME/bin
[root@haproxy ~]# source /etc/profile

3.4. QUIC library ๋นŒ๋“œ

QUIC๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” QUIC ์ „์šฉ SSL library๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
library๋กœ๋Š” ํฌ๊ฒŒ Google BoringSSL๊ณผ QuicTLS๊ฐ€ ์žˆ๋‹ค.

์ด ๋ฌธ์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก 2๊ฐ€์ง€ ๋ฐฉ์•ˆ์„ ์ œ์‹œํ•˜๊ฒ ๋‹ค.

3.4.1. BoringSSL

BoringSSL์€ Google์—์„œ ๊ฐœ๋ฐœํ•œ OpenSSL์˜ ํฌํฌ(Fork) ๋ฒ„์ „์œผ๋กœ, Google์˜ ๋‚ด๋ถ€ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์ง€๋งŒ ์•ˆ์ •์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ์— ์ค‘์ ์„ ๋‘” ์•”ํ˜ธํ™” ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.
OpenSSL์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ๊ฒฝ๋Ÿ‰ํ™” ๋ฐ ๊ฐ„์†Œํ™”๋œ ๋ฒ„์ „์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

BoringSSL์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

- ๊ฐ„์†Œํ™”๋œ ๊ตฌํ˜„

BoringSSL์€ OpenSSL์— ๋น„ํ•ด ์ฝ”๋“œ ๋ฒ ์ด์Šค๊ฐ€ ๊ฐ„์†Œํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๋ณด์ˆ˜์˜ ์šฉ์ด์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.

- ๋ณด์•ˆ ๊ฐ•ํ™”

BoringSSL์€ OpenSSL์˜ ์ทจ์•ฝ์ ์„ ๋ณด์™„ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋ณด์•ˆ ๊ธฐ๋Šฅ๊ณผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”์— ์ดˆ์ ์„ ๋‘๊ณ  ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

- ์ตœ์‹  ์•”ํ˜ธํ™” ์ง€์›

BoringSSL์€ ์ตœ์‹ ์˜ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋ฉฐ, TLS 1.3, ChaCha20-Poly1305, ECDSA(Elliptic Curve Digital Signature Algorithm) ๋“ฑ์˜ ์•”ํ˜ธํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

- ๊ฒฝ๋Ÿ‰์„ฑ

BoringSSL์€ ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋””์ž์ธ์„ ํ†ตํ•ด ์ž‘์€ ํฌ๊ธฐ์™€ ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ๋ฆฌ์†Œ์Šค ์ œ์•ฝ์ด ์žˆ๋Š” ์žฅ์น˜๋‚˜ ํ™˜๊ฒฝ์—์„œ ์œ ์šฉํ•˜๋‹ค.

์„ค๋ช…์€ ์ด์ฏค์—์„œ ํ•˜๊ณ , BoringSSL์˜ ์†Œ์Šค ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
nproc ๋ช…๋ น์–ด๋Š” ์‹œ์Šคํ…œ์˜ CPU ์ฝ”์–ด ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ GCC ๋นŒ๋“œ์‹œ multi thread๋กœ ์ปดํŒŒ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
์•ˆ์ „ํ•˜๊ฒŒ ์ปดํŒŒ์ผ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, -j $(nproc) ์ œ๊ฑฐํ•˜๊ณ  make๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

[root@haproxy ~]# git clone https://github.com/google/boringssl.git /opt/boringssl
[root@haproxy ~]# cd /opt/boringssl
[root@haproxy ~]# mkdir build
[root@haproxy ~]# cd build
[root@haproxy ~]# cmake ..
[root@haproxy ~]# make -j $(nproc)
[root@haproxy ~]# make install

๋งŒ์•ฝ, Container ํ™˜๊ฒฝ์—์„œ ๋นŒ๋“œ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด Threads๊ฐ€ ์—†๋‹ค๊ณ  ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

Could NOT find Threads (missing: Threads_FOUND)

์ด ๊ฒฝ์šฐ์—๋Š” CMakeLists.txt ํŒŒ์ผ์— ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ ํ›„ ๋นŒ๋“œํ•˜๋ฉด ๋œ๋‹ค.

[root@haproxy ~]# vi CMakeLists.txt
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_USE_WIN32_THREADS_INIT 0)
set(CMAKE_USE_PTHREADS_INIT 1)
set(THREADS_PREFER_PTHREAD_FLAG ON)

๋˜๋Š”, sed ๋ช…๋ น์–ด๋กœ ํ•œ์ค„๋กœ ์ฒ˜๋ฆฌํ• ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

[root@haproxy ~]# sed -i "1s/.*/set(CMAKE_THREAD_LIBS_INIT \"-lpthread\")\nset(CMAKE_HAVE_THREADS_LIBRARY 1)\nset(CMAKE_USE_WIN32_THREADS_INIT 0)\nset(CMAKE_USE_PTHREADS_INIT 1)\nset(THREADS_PREFER_PTHREAD_FLAG ON)\n\ncmake_minimum_required(VERSION 3.10)/g" CMakeLists.txt

3.4.2. QuicTLS

QuicTLS๋Š” Google์˜ BoringSSL ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๊ณ , BoringSSL์—์„œ ๊ฐ€์ ธ์˜จ ๊ธฐ์ˆ ๊ณผ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ QUIC ํ”„๋กœํ† ์ฝœ์˜ TLS ์ ์šฉ์„ ์ง€์›ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ฐ€์„ฑ, ๋ฌด๊ฒฐ์„ฑ, ์ธ์ฆ์„ ๋ณด์žฅํ•œ๋‹ค.
๋˜ํ•œ, ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ œ๊ณต๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด QUIC ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด์•ˆ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค๊ณ  ์•ˆ์ „ํ•œ ํ†ต์‹ ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

QuicTLS์˜ ์ฃผ์š” ํŠน์ง•๊ณผ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

- QUIC ํ”„๋กœํ† ์ฝœ๊ณผ์˜ ํ†ตํ•ฉ

QuicTLS๋Š” QUIC ํ”„๋กœํ† ์ฝœ๊ณผ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ TLS ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, QUIC์˜ ํŠน์„ฑ์— ๋งž๊ฒŒ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ , QUIC ์—ฐ๊ฒฐ ์„ค์ •๊ณผ ํ•ธ๋“œ์‰์ดํฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

- TLS ๋ณด์•ˆ ๊ธฐ๋Šฅ

QuicTLS๋Š” TLS์˜ ๊ธฐ๋Šฅ๊ณผ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์„ ์ œ๊ณตํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ฐ€์„ฑ, ๋ฌด๊ฒฐ์„ฑ, ์ธ์ฆ ๋ณด์žฅ ๋ฐ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋””์ง€ํ„ธ ์ธ์ฆ์„œ, ํ‚ค ๊ตํ™˜ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

- ์„ฑ๋Šฅ ์ตœ์ ํ™”

QuicTLS๋Š” BoringSSL์˜ ๊ธฐ์ˆ ๊ณผ ์ตœ์ ํ™”๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋ฉฐ, QUIC์˜ ํŠน์„ฑ๊ณผ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๊ฒŒ ๋””์ž์ธ๋˜์–ด, ๋น ๋ฅธ ์—ฐ๊ฒฐ ์„ค์ •๊ณผ ๋‚ฎ์€ ์ง€์—ฐ์„ ์ œ๊ณตํ•œ๋‹ค.

- ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ ์ง€์›

QuicTLS๋Š” ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ ๋™์ž‘ํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์–ด์„œ, Linux, Windows, macOS ๋“ฑ ๋‹ค์–‘ํ•œ ์šด์˜์ฒด์ œ์™€ ํ˜ธํ™˜๋œ๋‹ค.

์„ค๋ช…์€ ์ด์ฏค์—์„œ ํ•˜๊ณ , QuicTLS์˜ ์†Œ์Šค ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
nproc ๋ช…๋ น์–ด๋Š” ์‹œ์Šคํ…œ์˜ CPU ์ฝ”์–ด ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ GCC ๋นŒ๋“œ์‹œ multi thread๋กœ ์ปดํŒŒ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
์•ˆ์ „ํ•˜๊ฒŒ ์ปดํŒŒ์ผ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, -j $(nproc) ์ œ๊ฑฐํ•˜๊ณ  make๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

[root@haproxy ~]# git clone https://github.com/quictls/openssl.git /opt/quictls
[root@haproxy ~]# cd /opt/quictls
[root@haproxy ~]# ./Configure
[root@haproxy ~]# make -j $(nproc)
[root@haproxy ~]# make install

3.5. HAProxy ์†Œ์Šค ์ปดํŒŒ์ผ

3.5.1. ๋‹ค์šด๋กœ๋“œ ๋ฐ ์••์ถ• ํ•ด์ œ

[root@haproxy ~]# curl -LO "https://www.haproxy.org/download/2.8/src/haproxy-2.8.0.tar.gz"
[root@haproxy ~]# tar xzvf haproxy-2.8.0.tar.gz

3.5.2. Makefile ๋ณ€์ˆ˜ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ

QUIC๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Makefile์— ํ•ด๋‹น ๋ณ€์ˆ˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
(์ผ๋ถ€ ๋ณ€์ˆ˜๋“ค์€ ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•œ๋‹ค.)

[root@haproxy ~]# cd /opt/haproxy-2.8.0
[root@haproxy ~]# vi Makefile
# Valid USE_* options are enumerated in the "use_opts" variable and are listed
# below. Most of them are automatically set by the TARGET, others have to be
# explicitly specified :
USE_EPOLL=1
USE_NETFILTER=1
USE_THREAD=1
USE_PTHREAD_PSHARED=1
USE_REGPARM=1
USE_TPROXY=1
USE_LINUX_TPROXY=1
USE_LIBCRYPT=1
USE_GETADDRINFO=1
USE_FUTEX=1
USE_ACCEPT4=1
USE_PRCTL=1
USE_ZLIB=1
USE_CPU_AFFINITY=1
USE_TFO=1
USE_OBSOLETE_LINKER=1
USE_THREAD_DUMP=1
USE_SYSTEMD=1

# QUIC ํ™œ์„ฑํ™”
USE_QUIC=1
USE_OPENSSL=1

# BoringSSL ๋˜๋Š” QuicTLS ์œ„์น˜
# ๋ณ„๋„์˜ Prefix๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋””๋ ‰ํ† ๋ฆฌ ์œ„์น˜๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
#SSL_INC=/opt/quictls/include
#SSL_LIB=/opt/quictls/lib
#LDFLAGS="-Wl,-rpath,/opt/quictls/lib"

#### Installation options.
DESTDIR =
INSTALL = install
PREFIX = /opt/haproxy
SBINDIR = $(PREFIX)/sbin
MANDIR = $(PREFIX)/share/man
DOCDIR = $(PREFIX)/doc/haproxy

#### TARGET system
# Use TARGET=<target_name> to optimize for a specific target OS among the
# following list (use the default "generic" if uncertain) :
#    linux-glibc, linux-glibc-legacy, linux-musl, solaris, freebsd, freebsd-glibc,
#    dragonfly, openbsd, netbsd, cygwin, haiku, aix51, aix52, aix72-gcc, osx, generic,
#    custom
TARGET = linux-glibc

#### TARGET CPU
# Use CPU=<cpu_name> to optimize for a particular CPU, among the following
# list :
#    generic, native, i586, i686, ultrasparc, power8, power9, custom,
#    a53, a72, armv81, armv8-auto
CPU = native

#### Architecture, used when not building for native architecture
# Use ARCH=<arch_name> to force build for a specific architecture. Known
# architectures will lead to "-m32" or "-m64" being added to CFLAGS and
# LDFLAGS. This can be required to build 32-bit binaries on 64-bit targets.
# Currently, only 32, 64, x86_64, i386, i486, i586 and i686 are understood.
ARCH = x86_64

3.5.3. ๋นŒ๋“œ

[root@haproxy ~]# cd /opt/haproxy-2.8.0
[root@haproxy ~]# make -j $(nproc)
[root@haproxy ~]# make install

4. Systemd ์„œ๋น„์Šค ๋“ฑ๋ก

systemd๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๊ตฌ๋™ ๋ฐ ์ค‘์ง€๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•œ๋‹ค.

4.1. ์„œ๋น„์Šค ํŒŒ์ผ ๋ณต์‚ฌ

[root@haproxy ~]# cp /opt/haproxy-2.8.0/admin/systemd/haproxy.service.in /lib/systemd/system/haproxy.service

4.2. ์„œ๋น„์Šค ํŒŒ์ผ ์ˆ˜์ •

์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์— ๋งž๋„๋ก ์„ค์ • ๊ฐ’๋“ค์„ ์ˆ˜์ •ํ•œ๋‹ค.

[root@haproxy ~]# vi /lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=network-online.target
Wants=network-online.target

[Service]
EnvironmentFile=-/etc/default/haproxy
EnvironmentFile=-/etc/sysconfig/haproxy
Environment="CONFIG=/opt/haproxy/conf/haproxy.cfg" "PIDFILE=/opt/haproxy/haproxy.pid" "EXTRAOPTS=-S /opt/haproxy/stats"
ExecStart=@SBINDIR@/haproxy -Ws -f $CONFIG -p $PIDFILE $EXTRAOPTS
ExecReload=@SBINDIR@/haproxy -Ws -f $CONFIG -c -q $EXTRAOPTS
ExecReload=/bin/kill -USR2 $MAINPID
KillMode=mixed
Restart=always
SuccessExitStatus=143
Type=notify

# The following lines leverage SystemD's sandboxing options to provide
# defense in depth protection at the expense of restricting some flexibility
# in your setup (e.g. placement of your configuration files) or possibly
# reduced performance. See systemd.service(5) and systemd.exec(5) for further
# information.

# NoNewPrivileges=true
# ProtectHome=true
# If you want to use 'ProtectSystem=strict' you should whitelist the PIDFILE,
# any state files and any other files written using 'ReadWritePaths' or
# 'RuntimeDirectory'.
# ProtectSystem=true
# ProtectKernelTunables=true
# ProtectKernelModules=true
# ProtectControlGroups=true
# If your SystemD version supports them, you can add: @reboot, @swap, @sync
# SystemCallFilter=~@cpu-emulation @keyring @module @obsolete @raw-io

[Install]
WantedBy=multi-user.target

4.3. ์„œ๋น„์Šค ๋“ฑ๋ก

[root@haproxy ~]# systemctl enable haproxy

5. HAProxy ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ

๊ฐ„๋‹จํ•œ HTTP, HTTPS ์„ค์ • ํŒŒ์ผ์„ ์˜ˆ์ œ๋กœ ๋งŒ๋“ ๋‹ค.

[root@haproxy ~]# vi /opt/haproxy/conf/haproxy.cfg
# Global settings
global
    chroot /opt/haproxy
    pidfile /opt/haproxy/haproxy.pid
    maxconn 200000
    # 800/KB
    tune.maxrewrite 8192
    tune.bufsize 32768
    user haproxy
    group haproxy
    #daemon
    log /dev/log  local0 info
    # turn on stats unix socket
    stats socket /opt/haproxy/stats level admin expose-fd listeners

    # SSL Cipher
    tune.ssl.default-dh-param 2048
    #ssl-default-bind-options no-sslv3

    # generated 2023-06-10, Mozilla Guideline v5.7, HAProxy 2.8.0, OpenSSL 3.0.9+quic, intermediate configuration
    # https://ssl-config.mozilla.org/#server=haproxy&version=2.8.0&config=intermediate&openssl=3.0.9+quic&guideline=5.7
    # intermediate configuration
    ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
    ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
    ssl-default-bind-options prefer-client-ciphers no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets

    ssl-default-server-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305
    ssl-default-server-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
    ssl-default-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets

    # mkdir /opt/haproxy/certs/
    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /opt/haproxy/certs/dhparam
    ssl-dh-param-file /opt/haproxy/certs/dhparam

    # Multi-thread mode
    nbthread 4
    #cpu-map auto:1/1-4 0-3

    # Multi-process mode
    cpu-map 1 0
    cpu-map 2 1
    cpu-map 3 2
    cpu-map 4 3

    # HAProxy Status
    #stats bind-process 4

defaults
    mode http
    log global
    #option httplog clf
    option dontlognull
    option http-server-close
    #option forwardfor except 10.88.0.0/16
    option forwardfor
    option redispatch
    retries 3
    timeout http-request 10s
    timeout queue 1m
    timeout connect 10s
    timeout client 300s
    timeout server 300s
    timeout http-keep-alive 20s
    timeout check 10s
    maxconn 200000

#### HAProxy Status ####
listen stats
    bind *:1936
    mode http
    stats enable
    stats uri /
    stats auth    'admin:admin'
    #bind-process 4

#### HTTP ####
frontend default-http
    # Service Port
    bind *:80

    # Balancer Type
    balance roundrobin

    # Syslog
    log 127.0.0.1 local1

    # Backend
    default_backend default-http

backend default-http
    # Balancer Type
    balance roundrobin

    # Backend Server
    server nginx01 192.168.0.11:80 check inter 5s maxconn 200000
    server nginx02 192.168.0.12:80 check inter 5s maxconn 200000
    server nginx03 192.168.0.13:80 check inter 5s maxconn 200000
    server nginx04 192.168.0.14:80 check inter 5s maxconn 200000

#### HTTPS ####
frontend default-https
    # Service Port
    bind :443 ssl crt /opt/haproxy/certs/ssl.pem alpn h2,http/1.1 allow-0rtt
    bind quic4@:443 ssl crt /opt/haproxy/certs/ssl.pem alpn h3 allow-0rtt

    # Balancer Type
    balance roundrobin

    # Syslog
    log 127.0.0.1 local2

    # Backend
    default_backend default-https

    # HTTP/3 (QUIC)
    http-response set-header alt-svc "h3=\":443\"; ma=31536000"

    # Enable HSTS(HTTP Strict Transport Security)
    http-response set-header Strict-Transport-Security max-age=63072000

backend default-https
    # Balancer Type
    balance roundrobin

    # Backend Server
    server nginx01 192.168.0.11:443 ssl check inter 5s verify none maxconn 200000
    server nginx02 192.168.0.12:443 ssl check inter 5s verify none maxconn 200000
    server nginx03 192.168.0.13:443 ssl check inter 5s verify none maxconn 200000
    server nginx04 192.168.0.14:443 ssl check inter 5s verify none maxconn 200000

6. ์„œ๋น„์Šค ์‹œ์ž‘

[root@haproxy ~]# systemctl start haproxy

7. HTTP/3 ํ™•์ธ

์œ„์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ HTTP/3๊ฐ€ ์ง€์›๋˜๊ณ  ์žˆ๋Š”์ง€ ๋งํฌ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•œ๋‹ค. HTTP/3 Check

๋.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment