# 🧾 μ§€μ‹œμ–΄ 각 ν•­λͺ©μ€ 문법, μ§€μ •ν•˜μ§€ μ•Šμ•˜μ„ λ•Œμ˜ κΈ°λ³Έκ°’, μ“Έ 수 μžˆλŠ” μœ„μΉ˜λ₯Ό 보여 μ€λ‹ˆλ‹€. 버전 ν‘œκΈ°(μ–΄λŠ λ²„μ „μ—μ„œ λ„μž…λ˜μ—ˆλŠ”μ§€ μ•Œλ € μ£ΌλŠ” `Since:` 쀄)λŠ” 아직 κ³΅κ°œν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. πŸ“– 이 νŽ˜μ΄μ§€λŠ” 좜발점이 λ˜λŠ” 일뢀λ₯Ό λ‹€λ£Ήλ‹ˆλ‹€. 여기에 없어도 λ°›μ•„λ“€μ—¬μ§€λŠ” μ§€μ‹œμ–΄λŠ” `pingclair validate`κ°€ κ²€μ¦ν•©λ‹ˆλ‹€. μ„œλ²„κ°€ κ΅¬ν˜„ν•˜μ§€ μ•Šμ€ μ§€μ‹œμ–΄λŠ” 쑰용히 받아듀이지 μ•Šκ³  이름을 λ“€μ–΄ κ±°λΆ€ν•©λ‹ˆλ‹€. ## encode ```text Syntax: encode [ ...] Default: no compression Context: site block ``` 응닡을 μ••μΆ•ν•©λ‹ˆλ‹€. μΈμˆ˜λŠ” μ„ ν˜Έ μˆœμ„œλŒ€λ‘œ λ‚˜μ—΄ν•˜λ©° ν΄λΌμ΄μ–ΈνŠΈκ°€ λ°›μ•„λ“€μ΄λŠ” 첫 ν˜•μ‹μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 지원 ν˜•μ‹μ€ `zstd`와 `gzip`μž…λ‹ˆλ‹€. Brotliλ₯Ό μ§€μ •ν•˜λ©΄ gzip으둜의 암묡적 ν•˜ν–₯이 μ•„λ‹ˆλΌ 컴파일 였λ₯˜κ°€ λ©λ‹ˆλ‹€. ν”„λ‘μ‹œμ— 슀트리밍 Brotli 인코더가 μ—†μ–΄ κ·Έ μ˜΅μ…˜μ„ μΆ©μ‘±ν•  수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. ```caddyfile example.com { encode zstd gzip file_server ./public } ``` ## file_server ```text Syntax: file_server [] Default: disabled Context: site block ``` λ””μŠ€ν¬μ—μ„œ νŒŒμΌμ„ μ œκ³΅ν•©λ‹ˆλ‹€. MIME νƒ€μž… νŒλ³„, λ²”μœ„ μš”μ²­, ETag와 `Last-Modified` 검증을 μ§€μ›ν•©λ‹ˆλ‹€. 인수λ₯Ό μ£Όλ©΄ 이 μ§€μ‹œμ–΄ 자체의 λ£¨νŠΈκ°€ 되고, μƒλž΅ν•˜λ©΄ `root`둜 μ„€μ •ν•œ μ‚¬μ΄νŠΈ 루트λ₯Ό μ”λ‹ˆλ‹€. ```caddyfile localhost:8080 { file_server ./public } ``` ## header ```text Syntax: header [] header [] { # set + # append - # remove set # set, spelled explicitly } Default: none Context: site block ``` 응닡 헀더λ₯Ό μΆ”κ°€, ꡐ체, μ œκ±°ν•©λ‹ˆλ‹€. ν•„λ“œ μ΄λ¦„λ§Œ μ“°λ©΄ μ„€μ •, `+`λ₯Ό μ•žμ— 두면 μΆ”κ°€, `-`λ₯Ό μ•žμ— 두면 μ œκ±°μž…λ‹ˆλ‹€. ```caddyfile example.com { header { X-Frame-Options "DENY" X-Content-Type-Options "nosniff" Strict-Transport-Security "max-age=31536000; includeSubDomains" -X-Powered-By } } ``` ## log ```text Syntax: log [] { } Default: no access sink Context: site block, global options ``` μ ‘κ·Ό 둜그 좜λ ₯ λŒ€μƒμ„ μ„€μ •ν•©λ‹ˆλ‹€. 단독 `log`λŠ” κ·Έ μ‚¬μ΄νŠΈμ˜ κΈ°λ³Έ 좜λ ₯을 켜고, `log { ... }`λŠ” 이름 μžˆλŠ” 둜거λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. 블둝이 μ—†λŠ” `log `은 global optionsμ—μ„œ μ„ μ–Έν•œ 채널을 μ°Έμ‘°ν•©λ‹ˆλ‹€. 블둝 μ˜΅μ…˜μ—λŠ” 좜λ ₯ λŒ€μƒκ³Ό ν˜•μ‹(`output`, `format`), `hostnames` μ„ νƒμž, `include`와 `exclude` ν•„ν„°, `sampling`, 그리고 파일 λ‘œν…Œμ΄μ…˜(`mode`, `dir_mode`, `roll_*`)이 μžˆμŠ΅λ‹ˆλ‹€. ```caddyfile example.com { log { output file /var/log/pingclair/access.log } } ``` λ ˆμ½”λ“œλŠ” μ“°κΈ° 전에 λͺ¨μ•„ 두며, 따라가지 λͺ»ν•˜λŠ” 좜λ ₯ λŒ€μƒμ€ λ ˆμ½”λ“œλ₯Ό 버리고 `pingclair_access_log_dropped_total`에 κ³„μ‚°ν•©λ‹ˆλ‹€. λͺ¨λ“  μš”μ²­μ„ μ‹œμŠ€ν…œ 저널에 μ“°λŠ” 경우 저널 μˆ˜μ‹  츑의 처리 λΉ„μš©λ„ λΆ€λ‹΄ν•©λ‹ˆλ‹€. ## reverse_proxy ```text Syntax: reverse_proxy [] [ ...] reverse_proxy [] { ... } Default: none Context: site block ``` μš”μ²­μ„ ν•˜λ‚˜ μ΄μƒμ˜ μ—…μŠ€νŠΈλ¦ΌμœΌλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€. κΈ°λ³Έ λΆ€ν•˜ λΆ„μ‚° 정책은 λΌμš΄λ“œ λ‘œλΉˆμž…λ‹ˆλ‹€. 호슀트 이름 μ—…μŠ€νŠΈλ¦Όμ€ `dns_refresh` κ°„κ²©μœΌλ‘œ λ‹€μ‹œ ν•΄μ„λ˜λ―€λ‘œ μƒˆ μ£Όμ†Œλ‘œ μž¬μ‹œμž‘ν•œ λ°±μ—”λ“œμ—λ„ κ°œμž… 없이 λ”°λΌκ°‘λ‹ˆλ‹€. 해석에 μ‹€νŒ¨ν•˜λ©΄ 직전 μ£Όμ†Œλ₯Ό λ‘œν…Œμ΄μ…˜μ— 남겨 λ‘‘λ‹ˆλ‹€. ```caddyfile :80 :8080 { reverse_proxy { lb_policy least_conn to 10.0.0.1:8080 { weight 3 } to 10.0.0.2:8080 to 10.0.0.3:8080 { backup } health_check { path /health interval 5s timeout 2s status 200 204 consecutive_failure 3 consecutive_success 2 } } } ``` λŠ₯동 μƒνƒœ 확인은 λŒ€μ—­ μ™Έμ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ μ‹€νŒ¨ν•œ λ°±μ—”λ“œλŠ” μ‚¬μš©μž μš”μ²­μ΄ λ„λ‹¬ν•˜κΈ° 전에 λ‘œν…Œμ΄μ…˜μ—μ„œ λΉ μ§€κ³ , μ„€μ •ν•œ 횟수만큼 μ„±κ³΅ν•˜λ©΄ λ³΅κ·€ν•©λ‹ˆλ‹€. `backup` μ—…μŠ€νŠΈλ¦Όμ€ λͺ¨λ“  μ£Ό μ—…μŠ€νŠΈλ¦Όμ„ μ“Έ 수 없을 λ•Œλ§Œ μ‚¬μš©ν•©λ‹ˆλ‹€. ## root ```text Syntax: root [] Default: none Context: site block ``` μ‚¬μ΄νŠΈ 루트λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. `file_server`λŠ” 자체 루트λ₯Ό κ°€μ§ˆ 수 μžˆμ§€λ§Œ, μ—¬κΈ°μ—μ„œ μ„€μ •ν•˜λ©΄ νŒŒμΌμ„ λ‹€λ£¨λŠ” λ‹€λ₯Έ μ§€μ‹œμ–΄μ™€ 파일 μ„œλ²„κ°€ 같은 μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€κ²Œ λ©λ‹ˆλ‹€. ```caddyfile example.com { root * /srv/public file_server } ``` ## tls ```text Syntax: tls tls { } Default: automatic HTTPS for public names Context: site block ``` μΈμ¦μ„œλ₯Ό μ–»λŠ” 방법을 μ œμ–΄ν•©λ‹ˆλ‹€. | λͺ¨λ“œ | λ™μž‘ | | --- | --- | | `tls auto` | ACME둜 곡개 μΈμ¦μ„œλ₯Ό λ°œκΈ‰λ°›κ³  μžλ™μœΌλ‘œ κ°±μ‹ ν•©λ‹ˆλ‹€. | | `tls internal` | μƒμ£Όν•˜λŠ” 둜컬 인증 κΈ°κ΄€μ—μ„œ λ°œκΈ‰ν•©λ‹ˆλ‹€. 루트 μΈμ¦μ„œλŠ” `$PINGCLAIR_TLS_STORE/internal/root.crt`에 있고 ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‹ λ’°ν•΄μ•Ό ν•©λ‹ˆλ‹€. | | `tls { cert ...; key ... }` | λΈ”λ‘μ—μ„œ μ§€μ •ν•œ μΈμ¦μ„œμ™€ ν‚€ νŒŒμΌμ„ μ‚¬μš©ν•©λ‹ˆλ‹€. | 블둝 ν˜•μ‹μ€ `http3`둜 HTTP/3을 켜고 `dns cloudflare `으둜 DNS-01 λ°œκΈ‰λ„ μ§€μ›ν•©λ‹ˆλ‹€. κ΅¬ν˜„λœ DNS κ³΅κΈ‰μžλŠ” μ΄κ²ƒλΏμž…λ‹ˆλ‹€. λ‹€λ₯Έ κ³΅κΈ‰μž 이름은 받아듀이고 λ¬΄μ‹œν•˜λŠ” λŒ€μ‹  기동 μ‹œ κ±°λΆ€λ©λ‹ˆλ‹€. DNS-01이 μ™€μΌλ“œμΉ΄λ“œ μΈμ¦μ„œλ₯Ό μ„±λ¦½μ‹œν‚€λŠ” μ „μ œμ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. ```caddyfile example.com { tls { cert /etc/pingclair/certs/example.com.pem key /etc/pingclair/certs/example.com.key http3 } reverse_proxy localhost:3000 } ``` ## 🌍 Global options Global optionsλŠ” 파일 맨 μ•žμ˜ 이름 μ—†λŠ” 블둝에 μ”λ‹ˆλ‹€. | μ˜΅μ…˜ | 문법 | λ‚΄μš© | | --- | --- | --- | | `admin` | `admin
[]` | Admin API λ¦¬μŠ€λ„ˆ. token이 μ—†μœΌλ©΄ 루프백 μ—°κ²°λ§Œ λ°›μŠ΅λ‹ˆλ‹€. | | `auto_https` | `auto_https on \| off \| disable_redirects` | μžλ™ HTTPS와 80번 포트 λ¦¬λ””λ ‰μ…˜μ„ μ œμ–΄ν•©λ‹ˆλ‹€. | | `dns_refresh` | `dns_refresh ` | 호슀트 이름 μ—…μŠ€νŠΈλ¦Όμ˜ μž¬ν•΄μ„ 간격. `off`λŠ” 기동 μ‹œ ν•΄μ„ν•œ μ£Όμ†Œλ‘œ κ³ μ •ν•©λ‹ˆλ‹€. | | `email` | `email
` | ACME λ°œκΈ‰μ— μ“°λŠ” 계정 이메일. | | `trusted_proxies` | `trusted_proxies [ ...]` | ν΄λΌμ΄μ–ΈνŠΈ 식별 헀더λ₯Ό μ£Όμž₯ν•  수 μžˆλŠ” λŒ€μ‘ 지점. 변경은 μž¬μ‹œμž‘μ΄ ν•„μš”ν•©λ‹ˆλ‹€. | ```caddyfile { email admin@example.com admin 127.0.0.1:2019 dns_refresh 30s } ```