# ๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ## ๐Ÿงฑ ๊ตฌ์„ฑ ์š”์†Œ Pingclair๋Š” Cargo workspace์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ์„œ๋ฒ„๋Š” `pingclair` ๋ฐ”์ด๋„ˆ๋ฆฌ์ด๋ฉฐ ๋‹ค์Œ crate๋ฅผ ๋งํฌํ•ฉ๋‹ˆ๋‹ค. | Crate | ์—ญํ•  | | --- | --- | | `pingclair` | ๋ช…๋ น์ค„ ์ง„์ž…์ . ์ธ์ˆ˜ ํŒŒ์‹ฑ, ๋กœ๊น…, ๊ธฐ๋™, ์„œ๋น„์Šค ๋ž˜ํผ. | | `pingclair-config` | ์„ค์ • ์ปดํŒŒ์ผ๋Ÿฌ. Pingclairfile์„ ์–ดํœ˜ ๋ถ„์„ํ•˜๊ณ  ํŒŒ์‹ฑํ•˜๋ฉฐ ์˜๋ฏธ๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. | | `pingclair-proxy` | Pingora ๊ธฐ๋ฐ˜ HTTP/1.1ยทHTTP/2 ํ”„๋ก์‹œ, quiche ๊ธฐ๋ฐ˜ HTTP/3 ๋ฆฌ์Šค๋„ˆ, ๋ถ€ํ•˜ ๋ถ„์‚ฐ, ๊ณต์šฉ ์š”์ฒญ ์ •์ฑ… ๊ณ„์ธต. | | `pingclair-static` | ์ •์  ํŒŒ์ผ ์ œ๊ณต. ํŒŒ์ผ ์ฝ๊ธฐ, MIME ํƒ€์ž…, ๋ฒ”์œ„ ์š”์ฒญ, ์ŠคํŠธ๋ฆฌ๋ฐ. | | `pingclair-tls` | ์ธ์ฆ์„œ ๊ด€๋ฆฌ. ์ˆ˜๋™ ์ธ์ฆ์„œ, ์ƒ์ฃผํ•˜๋Š” ๋‚ด๋ถ€ ์ธ์ฆ ๊ธฐ๊ด€, ACME ์ž๋™ ๋ฐœ๊ธ‰. | | `pingclair-api` | ์ƒํƒœ ํ™•์ธ๊ณผ ์„ค์ • ๋‹ค์‹œ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ Admin API. | | `pingclair-core` | ์œ„ crate๋“ค์ด ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ์„œ๋ฒ„ ์ˆ˜๋ช… ์ฃผ๊ธฐ. | ## ๐Ÿšฆ ์š”์ฒญ ๊ฒฝ๋กœ ```text client | | TLS with ALPN, or QUIC v listener HTTP/1.1 and HTTP/2 on TCP, HTTP/3 on UDP | v transport adapter Pingora ProxyHttp for TCP, tokio-quiche for QUIC | v policy layer routing, matchers, headers, rate limits, access log | v handler file server | reverse proxy | FastCGI | static response | v upstream or disk ``` ๋‘ ์ „์†ก ๋ฐฉ์‹์€ ๊ฒฐ๊ตญ ๊ฐ™์€ ์ •์ฑ… ๊ณ„์ธต์œผ๋กœ ํ•ฉ๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ผ์šฐํŒ…, ํ—ค๋” ์ฒ˜๋ฆฌ, ์†๋„ ์ œํ•œ, ์ ‘๊ทผ ๋กœ๊ทธ์˜ ๋™์ž‘์ด HTTP/1.1, HTTP/2, HTTP/3์—์„œ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ํ”„๋กœํ† ์ฝœ์ƒ ๊ผญ ํ•„์š”ํ•œ ์ง€์ ์—์„œ๋งŒ ๋‚ฉ๋‹ˆ๋‹ค. ## ๐ŸŒŠ ์š”์ฒญ ์ฒ˜๋ฆฌ ํŠน์„ฑ - **๋ณธ๋ฌธ์€ ์ŠคํŠธ๋ฆฌ๋ฐ๋ฉ๋‹ˆ๋‹ค.** ์š”์ฒญ๊ณผ ์‘๋‹ต ๋ณธ๋ฌธ์€ ์ƒํ•œ์ด ์žˆ๋Š” ์ฒญํฌ๋กœ ํ”„๋ก์‹œ๋ฅผ ์ง€๋‚ฉ๋‹ˆ๋‹ค. ์••์ถ•, ๋ฏธ๋“ค์›จ์–ด, ํ”„๋ก์‹œ๋Š” ๋ณธ๋ฌธ ์ „์ฒด๋ฅผ ๋ฒ„ํผ๋งํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํฐ ์—…๋กœ๋“œ๋‚˜ ๋А๋ฆฐ ์ˆ˜์‹ ์ž๊ฐ€ ๋ณธ๋ฌธ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - **์—…์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ์€ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.** ๋ฐฑ์—”๋“œ์™€์˜ keepalive ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ ์—…์ŠคํŠธ๋ฆผ์€ `dns_refresh`๋กœ ์„ค์ •ํ•œ ๊ฐ„๊ฒฉ๋งˆ๋‹ค ๋‹ค์‹œ ํ•ด์„๋˜๋ฏ€๋กœ, ์ƒˆ ์ฃผ์†Œ๋กœ ์žฌ์‹œ์ž‘ํ•œ ์ปจํ…Œ์ด๋„ˆ์—๋„ ์‚ฌ๋žŒ์ด ๊ฐœ์ž…ํ•˜์ง€ ์•Š๊ณ  ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค. - **๋Ÿฐํƒ€์ž„ ์ƒํƒœ๋Š” ์š”์ฒญ ์ค‘์— ๋ถˆ๋ณ€์ž…๋‹ˆ๋‹ค.** ์š”์ฒญ์€ ๊ณต๊ฐœ๋œ ์Šค๋ƒ…์ƒท์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋กœ๋“œ๋Š” ์‚ฌ์šฉ ์ค‘์ธ ๊ฒƒ์„ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹  ์ƒˆ ์Šค๋ƒ…์ƒท์„ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค. ## ๐ŸŒ ํ”„๋กœํ† ์ฝœ๋ณ„ ์ฐจ์ด ์ผ๋ถ€ ๋™์ž‘์€ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ์˜๋„์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ฐœ๊ฒฌํ•˜๋Š” ๋Œ€์‹  ์—ฌ๊ธฐ์— ์ ์–ด ๋‘ก๋‹ˆ๋‹ค. | ์˜์—ญ | ๋™์ž‘ | | --- | --- | | Trailers | ์š”์ฒญ์—์„œ ์„ ์–ธํ•œ trailer๋Š” ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ํ™•์ • ์ „์—๋Š” `501`์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ํ™•์ •๋œ HTTP/3 ์ŠคํŠธ๋ฆผ์€ resetํ•˜๋ฉฐ, ์—…์ŠคํŠธ๋ฆผ์ด ์‘๋‹ต trailer๋ฅผ ์•Œ๋ฆฌ๋ฉด `502`๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. | | CONNECT | HTTP/3์—์„œ ํ„ฐ๋„ ์ง€์›์ด ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ `CONNECT`์™€ extended `CONNECT`๋Š” `501`์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. | | FastCGI | `php_fastcgi`๋Š” HTTP/1.1๊ณผ HTTP/2์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. FastCGI๊ฐ€ ํ•„์š”ํ•œ ๋ผ์šฐํŠธ๋Š” ๊ทธ ๊ฒฝ๋กœ๊ฐ€ ์ž์ฒด FastCGI ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€ HTTP/3์—์„œ `501`์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. | ## โš ๏ธ ์•Œ๋ ค์ง„ ๊ฒฐํ•จ WebSocket ์—…๊ทธ๋ ˆ์ด๋“œ๋Š” ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด ๊ฐ„ํ—์ ์œผ๋กœ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์œ ๋จธ์‹ ์—์„œ ์•ฝ 10-15%๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์›์ธ์€ Pingclair ์ž์ฒด์˜ ์—…๊ทธ๋ ˆ์ด๋“œ ์ฒ˜๋ฆฌ ๊ฐ€ ์•„๋‹ˆ๋ผ ์—…์ŠคํŠธ๋ฆผ `pingora-proxy` crate์˜ ๊ฒฝ์Ÿ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ์œ ํœด ์ƒํƒœ์˜ ๊ฐœ๋ฐœ ๋จธ์‹ ์—์„œ๋Š” ์žฌํ˜„๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์ ์–ด ๋‘ก๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ ์ด์Šˆ: [cloudflare/pingora#946](https://github.com/cloudflare/pingora/issues/946).