# 🏃 快速開始 完成[安裝](/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` 會開啟 Admin API,`pingclair start`、`stop` 與 `reload` 都透過它連到執行中的伺服器。 - 網站位址中的 `http://` scheme 會強制使用明文。少了它,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 ``` `fmt` 輸出標準格式,每層以一個定位字元縮排。 ## 4. 🚀 執行 在前景執行,日誌會一直顯示在你的終端機上: ```bash pingclair run Pingclairfile ``` 加上 `--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/ ``` `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 的狀態列與 journal。被拒絕的重載會讓舊設定繼續提供服務,這正是拒絕的用意。完整說明請見[以服務方式執行](/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://` scheme,或改用 `https://` 連線並信任內部憑證。 - **`Cannot reach admin API at 127.0.0.1:2019`。** 設定裡沒有 `admin` 選項,所以沒有東西在等 `pingclair stop` 與 `pingclair reload`。請把它加進全域選項區塊,或在前景行程按 Ctrl-C 停止。 - **`curl` 連 loopback 位址時卡住。** 有系統代理攔截了請求。請改用 `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/):語言本身,包括匹配器、片段與匯入。