# π ν΅μ€ννΈ
μ΄ νμ΄μ§λ μ€μΉκ° λλ νΈμ€νΈμμ μ§μ μ μ΄νλ μλ²κΉμ§ μ§νν©λλ€. λμ€ν¬ μμ
μ€μ , κ²μ¦λ μ»΄νμΌ, μμΒ·μ€μ§Β·κ°μν μ μλ μλ², κ·Έλ¦¬κ³ νμΌ μλ²κ° μλ΅νλ€λ
νμΈμ
λλ€. [μ€μΉ](/ko/start/install/)κ° λλ¬λ€κ³ κ°μ ν©λλ€.
## π§Ύ μμνκΈ° μ μ
μ€μΉ νλ‘κ·Έλ¨μ 80 ν¬νΈμμ μλΉμ€λ₯Ό λλ¦° μ±λ‘ λ¨κ²¨ λμκ³ , κ·Έ μλΉμ€κ°
`/etc/Pingclair/Pingclairfile` μ€μ μ μ₯κ³ μμ΅λλ€. μ€ννλ λμμλ μ€μ§ν΄μ
ν¬νΈλ₯Ό λΉμλλ€.
```bash
sudo pc service stop
```
```bash
mkdir -p ~/demo/public
cd ~/demo
echo '
hello from ~/demo/public
' > public/index.html
```
## 1. βοΈ μ€μ μμ±νκΈ°
`~/demo/Pingclairfile`μ λ§λλλ€.
```caddyfile
{
admin 127.0.0.1:2019
}
http://localhost:8080 {
file_server ./public
}
```
μΈ κ°μ§λ§ μ§μ΄ λ‘λλ€. 맨 μμ μ΄λ¦ μλ λΈλ‘μ μ μ μ΅μ
μ΄κ³ , `admin`μ΄ μμΌλ©΄
`pingclair start`, `stop`, `reload`κ° μ€ν μ€μΈ μλ²μ ν΅μ ν μ μμ΅λλ€.
μ¬μ΄νΈ μ£Όμμλ μ€ν΄μ΄ λ€μ΄κ°κ³ , `http://`κ° νλ¬Έμ κ°μ ν©λλ€. μ΄κ² μμΌλ©΄
Pingclairλ `localhost`λ₯Ό μ΄λ¦μΌλ‘ μ·¨κΈν΄ μ체 μΈμ¦ κΈ°κ΄μΌλ‘ HTTPSλ₯Ό μ 곡νλ©°,
νλ¬Έ HTTP ν΄λΌμ΄μΈνΈμκ²λ λΉ μλ΅μΌλ‘ 보μ
λλ€([HTTPS](/ko/start/https/)).
`file_server`μ 루νΈλ μμ
λλ ν°λ¦¬ κΈ°μ€ μλ κ²½λ‘μ
λλ€.
## 2. β
μ€ν μ μ κ²μ¦νκΈ°
```bash
pingclair validate
```
```text
β
Configuration 'Pingclairfile' is valid!
```
`validate`λ κΈ°λ³Έμ μΌλ‘ `./Pingclairfile`μ μ½κ³ `./Caddyfile`λ κ°μ§ν©λλ€.
μ€μ μ μ»΄νμΌνκ³ μΈμ¦μ κ²½λ‘ μ‘΄μ¬ μ¬λΆ κ°μ μλ―Έ κ²μ¬λ₯Ό μ μ©ν©λλ€. κ²μ¦μ
κΆκ³ κ° μλλλ€. μ€ν¨ν μ€μ μ μ€νλμ§ μκ³ , λ§μ§λ§ μ€μ μ΄μ κ° λμ΅λλ€.
## 3. π§ μ€μ μ΄ λ¬΄μμ΄ λλμ§ λ³΄κΈ°
```bash
pingclair adapt --pretty
```
```text
{
"debug": false,
"servers": [
{
"name": "localhost",
"names": [
"localhost"
],
"listen": [
"[::]:8080"
],
```
μ»΄νμΌλ JSONμ μλ²κ° μ€μ λ‘ μ€ννλ ννμ
λλ€. μ§μμ΄κ° λ¬Έμλλ‘ λμνμ§
μμ λ κ°μ₯ λ¨Όμ λ³Ό κ³³μ
λλ€. λμ `pingclair fmt`κ° νμΌμ κ°ν λ³κ²½μ λ³΄λ €λ©΄
λ€μκ³Ό κ°μ΄ ν©λλ€.
```bash
pingclair fmt --diff
```
```text
- file_server ./public
+ file_server ./public
```
`fmt`λ μ κ·νμ μΆλ ₯νλ©°, λ€μ¬μ°κΈ°λ λ μΉΈμ΄ λ©λλ€.
## 4. π μ€ννκΈ°
λ‘κ·Έκ° ν°λ―Έλμ λ¨λ ν¬κ·ΈλΌμ΄λλ‘ μ€νν©λλ€.
```bash
pingclair run Pingclairfile
```
```text
π Starting Pingclair with config: Pingclairfile
π Starting Pingclair v0.2.0-rc.3
π Loaded configuration from: Pingclairfile
π§ Configured 1 server(s)
π Auto HTTPS: enabled
```
`--watch`λ₯Ό λΆμ΄λ©΄ μ μ₯ν λλ§λ€ μ€μ μ΄ λ€μ μ½ν κ°λ° 루νκ° λ©λλ€.
```bash
pingclair run --watch Pingclairfile
```
```text
β»οΈ Configuration reloaded successfully
β
Configuration reloaded completed successfully in 2.478622ms
```
μ
Έμμ λΆλ¦¬ν΄ λ°±κ·ΈλΌμ΄λλ‘ λ릴 μλ μμ΅λλ€.
```bash
pingclair start -c Pingclairfile
```
```text
β
Pingclair started in the background (pid 4432)
```
`pingclair start`, `stop`, `reload`λ Admin APIλ₯Ό ν΅ν΄ μ€ν μ€μΈ μλ²μ
λλ¬ν©λλ€. μ μ€μ μ `admin`μ΄ μλ μ΄μ μ
λλ€. `pingclair run`μλ νμνμ§
μμ΅λλ€.
## 5. π νμΈνκΈ°
```bash
curl -i http://localhost:8080/
```
```text
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 34
Last-Modified: Tue, 22 Sep 2026 03:26:39 GMT
ETag: "22-6ab1f56f"
Vary: Accept-Encoding
Accept-Ranges: bytes
server: Pingclair
```
`ETag`μ `Last-Modified`λ νμΌ μλ²κ° λμ€ν¬μμ μ½μλ€λ μ¦κ±°μ
λλ€. λ³Έλ¬Έμ
`public/index.html`μ
λλ€. λ°±κ·ΈλΌμ΄λ μλ²λ₯Ό λ©μΆλ €λ©΄ λ€μκ³Ό κ°μ΄ ν©λλ€.
```bash
pingclair stop
```
```text
β
Pingclair stopped
```
## β‘ λͺ
λ Ή νλλ‘ λμ°λ μλ²
μΈ νμ λͺ
λ Ήμ μ€μ νμΌ μμ΄ μλΉμ€ν©λλ€. μνν΄ λ³΄κ±°λ μΌνμ± νΈμ€νΈμμ
μ μ©ν©λλ€.
```bash
pingclair file-server --listen :8081 --root ./public
pingclair reverse-proxy --from :8082 --to 127.0.0.1:8081
pingclair respond --listen :8083 -s 200 -b "hello from respond"
```
κ°κ° μμν λ 리μ€λλ₯Ό μΆλ ₯ν©λλ€.
```text
π Starting file server on :8081 serving ./public (browse: false)
π Starting reverse proxy: :8082 -> ["127.0.0.1:8081"]
Server address: [::]:8083
```
`:8082`λ‘ μ¨ μμ²μ `:8081`μ νμΌ μλ²λ‘ μ λ¬λκ³ , `:8083`μ λκΈ΄ λ³Έλ¬Έμ κ·Έλλ‘
λλ €μ€λλ€. `respond`λ κ°λ° μ μ©μ
λλ€.
## π μλΉμ€μ λ§‘κΈ°κΈ°
μλΉμ€λ `/etc/Pingclair/Pingclairfile`μ μ€ννλ―λ‘, κ·Έκ³³μ λμ΄μΌ μ¬λΆν
νμλ
μ΄μλ¨μ΅λλ€.
```bash
sudo cp Pingclairfile /etc/Pingclair/Pingclairfile
sudo pingclair validate /etc/Pingclair/Pingclairfile
sudo pc service reload
curl -i http://localhost/
```
`pc service reload`λ μ€ν μ€μΈ μλ²μ νμΌμ λ€μ μ½μΌλΌκ³ μμ²νλ©°, μ λμ
κ·Έκ²μ `SIGUSR1`λ‘ ν©λλ€. `pingclair reload`λ Admin APIλ₯Ό κ±°μ³ κ°μ μ½λμ
λλ¬νκ³ μλ²κ° κ·Έ νμΌμ μ΄λ»κ² λ΄€λμ§λ λ³΄κ³ ν©λλ€(μ μ μ΅μ
λΈλ‘μ `admin`μ΄
νμν©λλ€). `sudo kill -USR1 "$(systemctl show -p MainPID --value pingclair)"`λ
λ λ€ μμ΄ κ°μ μΌμ ν©λλ€.
μ΄λ μͺ½μ΄λ λ¨Όμ κ²μ¦νκ³ , κ·Έλ€μ λ΅μ μ½μΌμμμ€. `systemctl reload`κ° λ³΄κ³ ν μ
μλ κ²μ μ νΈκ° μ λ¬λμλ€λ μ¬μ€λΏμ΄λ―λ‘, μλ²μ νλ¨ β μ μ©λμλμ§, μ΄μ μ
ν¨κ» κ±°λΆλμλμ§ β μ μ λμ status lineκ³Ό μ λμ λ¨μ΅λλ€. κ±°λΆλ μ¬μ μ©μ
μ΄μ μ€μ μ κ³μ μλΉμ€ν©λλ€. κ·Έκ²μ΄ κ±°λΆμ λͺ©μ μ
λλ€.
[μλΉμ€λ‘ μ€ν](/ko/start/service/#-μ¬μ μ©μ-μλ―Έ)μ μμΈν μ€λͺ
μ΄ μμ΅λλ€.
## β οΈ μ λμ§ μμ λ
- **`Address already in use`.** μ€μΉ νλ‘κ·Έλ¨μ μλΉμ€κ° μμ§ `:80`μ μ‘κ³
μκ±°λ λ€λ₯Έ νλ‘μΈμ€κ° κ·Έ ν¬νΈλ₯Ό μ‘κ³ μμ΅λλ€. `sudo ss -ltnp | grep :80`μ΄
μ£ΌμΈμ λ³΄μ¬ μ£Όκ³ , `sudo pc service stop`μ΄ κΈ°λ³Έ μλΉμ€λ₯Ό νμ΄ μ€λλ€.
- **`http://localhost:8080`μμ `Empty reply from server`.** νλ¬ΈμΌλ‘ TLS
리μ€λμ λ§νκ³ μμ΅λλ€. μ¬μ΄νΈ μ£Όμμ `http://`λ₯Ό λΆμ΄κ±°λ, λ΄λΆ μΈμ¦μλ₯Ό
μ λ’°ν λ€ `https://`λ‘ ν΅μ νμμμ€.
- **`Cannot reach admin API at 127.0.0.1:2019`.** μ€μ μ `admin`μ΄ μμ΄
`pingclair stop`κ³Ό `pingclair reload`λ₯Ό λ°μ μ€ λμμ΄ μμ΅λλ€. μ μ μ΅μ
λΈλ‘μ μΆκ°νκ±°λ ν¬κ·ΈλΌμ΄λ νλ‘μΈμ€λ₯Ό Ctrl-Cλ‘ λ©μΆμμμ€.
- **`curl`μ΄ λ£¨νλ°±μμ λ©μΆ€.** μμ€ν
νλ‘μκ° μμ²μ κ°λ‘μ±κ³ μμ΅λλ€.
`curl --noproxy '*'`λ‘ λ€μ μ€ννμμμ€.
- **κ²μ¦μ΄ `Unsupported feature`λ‘ μ€ν¨.** μ§μμ΄λ μΈμλμ§λ§ ꡬνμ΄ μκ³ ,
λ©μμ§κ° λμμ μλ € μ€λλ€. `encode br`μ κ²½μ° νλ‘μ μλ΅μ Brotliκ°
ꡬνλμ΄ μμ§ μμ `encode zstd gzip`μ κ°λ¦¬ν΅λλ€.
## π§ λ€μ λ¨κ³
- [HTTPS](/ko/start/https/): κ³΅κ° μ΄λ¦μ μν μΈμ¦μλ₯Ό Let's Encrypt λλ λ΄λΆ
μΈμ¦ κΈ°κ΄μμ.
- [μλΉμ€λ‘ μ€ν](/ko/start/service/): μ λ, μ¬μ μ©μ μλ―Έ, λ‘κ·Έ.
- [Pingclairfile](/ko/reference/pingclairfile/): μΈμ΄ μ체. λ§€μ², μ€λν«,
μν¬νΈ.