# 🧠 μ„€μ • λͺ¨λΈ Pingclairfile은 λ‘œλ“œ μ‹œμ μ— ν•œ 번 μ»΄νŒŒμΌλ˜μ–΄ μ„œλ²„κ°€ μ‹€μ œλ‘œ μ‹€ν–‰ν•˜λŠ” μƒνƒœκ°€ λ©λ‹ˆλ‹€. μ—¬κΈ°μ„œ 두 κ°€μ§€ κ²°κ³Όκ°€ λ‚˜μ˜€λ©°, 이것이 이 ν”„λ‘œμ νŠΈμ˜ λŒ€λΆ€λΆ„μ˜ λ™μž‘μ„ μ„€λͺ…ν•©λ‹ˆλ‹€. 섀정이 κ²°μ •ν•  수 μžˆλŠ” 일은 첫 μš”μ²­ 전에 λλ‚˜κ³ , μΆ©μ‘±ν•  수 μ—†λŠ” 섀정은 μš”μ²­ μ‹œμ μ— νƒ€ν˜‘ν•˜λŠ” λŒ€μ‹  μ„œλ²„λ₯Ό 멈μΆ₯λ‹ˆλ‹€. ## πŸ—‚οΈ 파일 ꡬ쑰 νŒŒμΌμ€ 선택적인 global options 블둝과 κ·Έ λ’€λ₯Ό μž‡λŠ” ν•˜λ‚˜ μ΄μƒμ˜ site block으둜 κ΅¬μ„±λ©λ‹ˆλ‹€. ```caddyfile { email admin@example.com } example.com { encode zstd gzip reverse_proxy 10.0.0.10:8080 10.0.0.11:8080 } :8080 { file_server ./public } ``` - **Global options**λŠ” 파일 맨 μ•žμ˜ 이름 μ—†λŠ” 블둝에 μ“°λ©°, μ‚¬μ΄νŠΈ λ‹¨μœ„κ°€ μ•„λ‹Œ μƒνƒœλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. ACME 계정 이메일, Admin API, μžλ™ HTTPS λ™μž‘, trusted proxies, 호슀트 이름 μ—…μŠ€νŠΈλ¦Όμ˜ DNS μž¬ν•΄μ„ λ“±μž…λ‹ˆλ‹€. μ‚¬μš© κ°€λŠ₯ν•œ μ˜΅μ…˜μ€ [μ§€μ‹œμ–΄ λͺ©λ‘](/ko/reference/directives/#global-options)에 μžˆμŠ΅λ‹ˆλ‹€. - **Site block**은 μ£Όμ†Œλ‘œ 이름을 λΆ™μž…λ‹ˆλ‹€. 호슀트, 포트, λ˜λŠ” λ‘˜ λ‹€μž…λ‹ˆλ‹€. ν¬νŠΈλŠ” 별도 μ§€μ‹œμ–΄κ°€ μ•„λ‹ˆλΌ μ£Όμ†Œμ˜ μΌλΆ€μ΄λ―€λ‘œ 두 값을 μΌμΉ˜μ‹œμΌœμ•Ό ν•˜λŠ” 곳이 ν•œ κ³³λΏμž…λ‹ˆλ‹€. - **μ§€μ‹œμ–΄**λŠ” site block μ•ˆμ˜ λ¬Έμž₯μž…λ‹ˆλ‹€. 인수 λͺ©λ‘μ„ λ°›λŠ” 것, 쀑첩 블둝을 λ°›λŠ” 것, λ‘˜ λ‹€ λ°›λŠ” 것이 μžˆμŠ΅λ‹ˆλ‹€. - **주석**은 `#`λΆ€ν„° 쀄 λκΉŒμ§€μž…λ‹ˆλ‹€. - **곡백이 μžˆλŠ” 값은 λ”°μ˜΄ν‘œλ‘œ λ¬ΆμŠ΅λ‹ˆλ‹€.** μ‹œκ°„ κΈΈμ΄μ—λŠ” λ‹¨μœ„κ°€ ν•„μš”ν•©λ‹ˆλ‹€. `30s`λŠ” 30초이며, 길이가 ν•„μš”ν•œ μžλ¦¬μ— 맨 숫자 `30`을 μ“°λ©΄ κ±°λΆ€λ©λ‹ˆλ‹€. ## 🧭 맀처 λ§€μ²˜λŠ” μ–΄λ–€ μ§€μ‹œμ–΄κ°€ μ–΄λŠ μš”μ²­μ— μ μš©λ μ§€ μ„ νƒν•©λ‹ˆλ‹€. 이름 μžˆλŠ” λ§€μ²˜λŠ” `@name`으둜 μ„ μ–Έν•˜κ³  μ΄λ¦„μœΌλ‘œ μ°Έμ‘°ν•©λ‹ˆλ‹€. ```caddyfile example.com { @api path /api/* header @api Cache-Control "no-store" @assets path /assets/* header @assets Cache-Control "public, max-age=31536000, immutable" } ``` `handle` 블둝은 λΌμš°νŠΈλ³„λ‘œ λ™μž‘μ„ λ¬Άκ³ , λ§€μ²˜κ°€ μ—†λŠ” 폴백도 μ§€μ›ν•©λ‹ˆλ‹€. ```caddyfile example.com { handle /assets/* { file_server ./assets } handle { respond "Page Not Found" 404 } } ``` ## 🧩 μŠ€λ‹ˆνŽ«κ³Ό import μŠ€λ‹ˆνŽ«μ€ μž¬μ‚¬μš© κ°€λŠ₯ν•œ 쑰각이며 `(name) { ... }`둜 μ„ μ–Έν•˜κ³  `import name`으둜 κ°€μ Έμ˜΅λ‹ˆλ‹€. ν˜ΈμΆœν•˜λŠ” μͺ½μ—μ„œ 블둝을 λ°›μ•„ μŠ€λ‹ˆνŽ«μ΄ `{block}`을 μ“΄ μžλ¦¬μ— λΌμ›Œ 넣을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. ```caddyfile (site) { https://{args[0]} { {block} } } import site example.com { reverse_proxy 127.0.0.1:3000 } ``` import된 νŒŒμΌμ—μ„œ μ •μ˜ν•œ μŠ€λ‹ˆνŽ«μ€ κ·Έ λ’€μ˜ importμ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 인수 λͺ©λ‘ μ•ˆμ— 놓인 자리 ν‘œμ‹œμžλŠ” κ±°λΆ€λ©λ‹ˆλ‹€. μ§€μ‹œμ–΄ νŠΈλ¦¬λŠ” μ‚½μž… ν›„ κ·Έ 쀄을 토큰 κ³„μΈ΅μ²˜λŸΌ λ‹€μ‹œ νŒŒμ‹±ν•  수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. ## πŸ›‘οΈ 검증 `pingclair validate`λŠ” νŒŒμΌμ„ μ»΄νŒŒμΌν•˜κ³  의미 검사λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ§€μ‹œμ–΄ 인수, 맀처 문법, μΈμ¦μ„œμ™€ ν‚€ 경둜, 그리고 "μ–΄λ–€ λŒ€μ‘ 지점이 ν΄λΌμ΄μ–ΈνŠΈ 식별 헀더λ₯Ό μ£Όμž₯ν•  수 μžˆλŠ”κ°€" 같은 μ •μ±… μ œμ•½μž…λ‹ˆλ‹€. μ‹€νŒ¨λŠ” λͺ…μ‹œμ μ΄λ©° λ‹«νžŒ λ°©ν–₯으둜 μ²˜λ¦¬λ©λ‹ˆλ‹€. - **κ΅¬ν˜„λ˜μ§€ μ•Šμ€ 이름은 μ΄λ¦„μœΌλ‘œ κ±°λΆ€λ©λ‹ˆλ‹€.** ν˜•μ‹μ΄ μ •μ˜ν•œ 이름은 λͺ¨λ‘ μΈμ‹λ˜λ©°, μ„œλ²„κ°€ κ΅¬ν˜„ν•˜μ§€ μ•Šμ€ 것은 "κΈ°λŠ₯이 μ—†λ‹€"λŠ” λ©”μ‹œμ§€λ₯Ό λƒ…λ‹ˆλ‹€. μ˜€νƒ€λ‘œ μ²˜λ¦¬λ˜κ±°λ‚˜ λ¬΄μ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 그런 이름이 μžˆλŠ” 섀정은 μ‹œμž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. - **μΆ©μ‘±ν•  수 μ—†λŠ” μ˜΅μ…˜μ€ κ±°λΆ€λ˜κ³ , ν•˜ν–₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.** 예λ₯Ό λ“€μ–΄ `encode`에 Brotliλ₯Ό μ§€μ •ν•˜λ©΄ 컴파일 였λ₯˜μž…λ‹ˆλ‹€. ν”„λ‘μ‹œμ— 슀트리밍 Brotli 인코더가 μ—†κΈ° λ•Œλ¬Έμ΄λ©°, 쑰용히 gzip으둜 λŒ€μ²΄ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. - **문법이 λ§žμ•„λ„ μ—†λŠ” λŒ€μƒμ„ μ°Έμ‘°ν•˜λ©΄ κ±°λΆ€λ©λ‹ˆλ‹€.** μ €μž₯μ†Œμ˜ `examples/full_featured.pingclair`λŠ” μ˜¬λ°”λ₯Έ Caddyfile λ¬Έλ²•μ΄μ§€λ§Œ μ—¬μ „νžˆ κ±°λΆ€λ©λ‹ˆλ‹€. κ·Έ μ•ˆμ˜ μΈμ¦μ„œ κ²½λ‘œκ°€ 검사λ₯Ό μ‹€ν–‰ν•˜λŠ” 머신에 μ—†κΈ° λ•Œλ¬Έμ΄λ©°, κ±°λΆ€κ°€ μ˜³μŠ΅λ‹ˆλ‹€. 같은 검사가 λ‘œλ“œ μ‹œμ μ—λ„ μ‹€ν–‰λ˜λ―€λ‘œ, λ‹€μ‹œ λ‘œλ“œν•  λ•Œ 검증에 μ‹€νŒ¨ν•˜λ©΄ 직전 μƒνƒœκ°€ κ·ΈλŒ€λ‘œ μœ μ§€λ©λ‹ˆλ‹€. ## πŸ” λ‹€μ‹œ λ‘œλ“œ μž¬μ μš©μ€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μž¬μ‹œμž‘ν•˜μ§€ μ•Šκ³  섀정을 λ‹€μ‹œ μ½μŠ΅λ‹ˆλ‹€. μ‹ ν˜ΈλŠ” `SIGUSR1`μž…λ‹ˆλ‹€. ```bash sudo kill -USR1 "$(systemctl show -p MainPID --value pingclair)" ``` `pingclair reload`λŠ” Admin APIλ₯Ό 거쳐 같은 μ½”λ“œμ— λ„λ‹¬ν•˜λ©°, μ„œλ²„κ°€ κ·Έ νŒŒμΌμ„ μ–΄λ–»κ²Œ λ΄€λŠ”μ§€ λ³΄κ³ ν•©λ‹ˆλ‹€. μ „μ—­ μ˜΅μ…˜ λΈ”λ‘μ˜ `admin`이 ν•„μš”ν•©λ‹ˆλ‹€. `pc service reload`λŠ” μ„€μΉ˜λœ μœ λ‹›μ„ 톡해 이 μ‹ ν˜Έλ₯Ό λ³΄λ‚΄λ―€λ‘œ, λ‹Ήμ—°ν•΄ λ³΄μ΄λŠ” λͺ…령이 κ³§ λ™μž‘ν•˜λŠ” λͺ…λ Ήμž…λ‹ˆλ‹€. 닡은 μ’…λ£Œ μ½”λ“œμ— μ—†μŠ΅λ‹ˆλ‹€ β€” `systemctl reload`κ°€ 보고할 수 μžˆλŠ” 것은 μ‹ ν˜Έκ°€ μ „λ‹¬λ˜μ—ˆλ‹€λŠ” μ‚¬μ‹€λΏμž…λ‹ˆλ‹€ β€” μœ λ‹›μ˜ status lineκ³Ό 저널에 있으며, κ±°λΆ€λœ μž¬μ μš©μ€ 이전 섀정을 계속 μ‹€ν–‰ν•©λ‹ˆλ‹€([issue #66](https://github.com/dorianverlaine/pingclair/issues/66)은 κ·ΈλŸΌμ—λ„ 성곡을 λ³΄κ³ ν•˜λ˜ μœ λ‹› 버전을 기둝해 λ‘μ—ˆμŠ΅λ‹ˆλ‹€). `trusted_proxies`처럼 μ‹œμž‘ μ‹œμ μ— ν™•λ¦½λ˜λŠ” ν”„λ‘œμ„ΈμŠ€ μ „μ—­ 정책은 μž¬μ‹œμž‘ 후에 반영되며, λ¦¬μŠ€λ„ˆλ₯Ό λ°”κΎΈλŠ” 섀정도 μž¬μ‹œμž‘μ΄ ν•„μš”ν•©λ‹ˆλ‹€.