# 🏃 快速開始 本頁從一台裝好的主機走到你完全掌握的伺服器:磁碟上的設定、經過驗證的編譯、可以 啟動、停止與監看的服務行程,以及一個證明檔案伺服器確實回應了的驗證步驟。前提是 [安裝](/zh-TW/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` 能跟正在執行的伺服器對話。站台位址帶 scheme,`http://` 強制 明文;不寫它的話,Pingclair 會把 `localhost` 當成名字,用自帶的憑證授權單位 提供 HTTPS,明文 HTTP 用戶端看到的只會是空回應([HTTPS](/zh-TW/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 ``` 也可以放到背景,讓它不受 shell 影響: ```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` 讓執行中的伺服器重新讀取檔案,unit 藉由送出 `SIGUSR1` 做到 這件事。`pingclair reload` 透過 Admin API 走到同一段程式碼,還會回報伺服器對檔案 的判斷,需要在全域選項區塊裡寫 `admin`;`sudo kill -USR1 "$(systemctl show -p MainPID --value pingclair)"` 則兩者都不需要。 兩條路都要先驗證,然後讀回答案:`systemctl reload` 只能回報訊號已經送達,伺服器 的判斷——已套用,還是帶著原因被拒絕——在 unit 的 status line 與日誌裡。被拒絕的 重載會讓舊設定繼續服務,這正是拒絕的意義。 [以服務方式執行](/zh-TW/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](/zh-TW/start/https/):為公開網域簽發憑證,走 Let's Encrypt 或內部 憑證授權單位。 - [以服務方式執行](/zh-TW/start/service/):unit、重載語意與日誌。 - [Pingclairfile](/zh-TW/reference/pingclairfile/):語言本身,包括 matcher、 snippet 與 import。