# 🏃 快速开始 本页从一台装好的主机走到你完全掌握的服务器:磁盘上的配置、经过校验的编译、可以 启动、停止和监视的服务进程,以及一个证明文件服务器确实应答了的验证步骤。前提是 [安装](/zh-CN/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-CN/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-CN/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-CN/start/https/):为公开域名签发证书,走 Let's Encrypt 或内部 证书颁发机构。 - [以服务方式运行](/zh-CN/start/service/):unit、重载语义和日志。 - [Pingclairfile](/zh-CN/reference/pingclairfile/):语言本身,包括 matcher、 snippet 和 import。