第 14 章 · 综合实战:Linux 部署 api-go-demo
本章目标:在 Linux 上完成 编写最小 API → go build → systemd 托管 →(可选)Nginx 反代 → curl 验收 → journalctl 查日志 全链路;会用 ch12 deploy-pre 做部署前检查;能口述与 gin-web / git-collab / ops-deploy 的分工。
学时建议:5~6 小时(含 3 小时跟练)
前置:linux-shell ch01~ch13;gin-web 建议已学基础;可在本机 WSL 或 ch08 SSH 到的云主机完成。
14.1 场景说明:开发机跑得好,一上 Linux 就挂
本地 WSL go run 正常,测试机 curl healthz 却 Connection refused。Leader 给的验收表:
| 项 | 要求 |
|---|---|
| 二进制 | /opt/api-go-demo/bin/api |
| 进程 | systemd active,非 root 运行 |
| 端口 | 8080 监听 |
| 健康 | curl /healthz 返回 ok |
| 日志 | journalctl -u api-go-demo 无致命错误 |
本章用最小 Go HTTP 服务走完流程;你换成 gin-web 真实项目时,步骤相同,只是二进制更大、环境变量更多。
14.2 目标架构
客户端 curl / 浏览器
│
▼(可选 ch14.6)
Nginx :8081 proxy_pass
│
▼
127.0.0.1:8080
│
▼
api-go-demo (systemd, User=www-data)
│
▼(后续 gin-web + go-database)
MySQL shop_db :3306
14.3 学完你能
| 能力 | 验收 |
|---|---|
| 编译 | go build -o bin/api 成功 |
| 安装 | 二进制在 /opt/api-go-demo/bin/ |
| systemd | enable + active |
| 健康检查 | curl 8080/healthz = ok |
| 反代 | curl 8081/healthz = ok(可选) |
| 排错 | status + journalctl + ss |
14.4 阶段一:准备代码并本地冒烟
步骤 1 — 目录与 main.go
cd ~/dev-workspace
mkdir -p shop-demo/cmd/api
cat > shop-demo/cmd/api/main.go << 'EOF'
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
port := os.Getenv("API_PORT")
if port == "" {
port = "8080"
}
http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "ok")
})
addr := ":" + port
log.Printf("listening on %s", addr)
log.Fatal(http.ListenAndServe(addr, nil))
}
EOF
步骤 2 — 模块与编译
cd ~/dev-workspace/shop-demo
go mod init example.com/shop-demo 2>/dev/null || true
go mod tidy
go build -o bin/api ./cmd/api
ls -lh bin/api
步骤 3 — 前台试跑(另开终端 curl)
终端 A:
cd ~/dev-workspace/shop-demo
export API_PORT=8080
./bin/api
终端 B:
curl -s http://127.0.0.1:8080/healthz
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/healthz
期望:body ok,状态码 200。
终端 A Ctrl+C 停掉。
为什么 先前台跑:排错比 systemd 直观;确认 OK 再托管。
14.5 阶段二:安装到 /opt 并写 systemd unit
步骤 1 — 部署前检查(ch12)
~/dev-workspace/shop-demo/scripts/deploy-pre.sh || echo "若 check_log 因 ERROR exit 2,可先修日志或暂时跳过"
步骤 2 — 复制二进制
sudo mkdir -p /opt/api-go-demo/bin
sudo cp ~/dev-workspace/shop-demo/bin/api /opt/api-go-demo/bin/api
sudo chmod 755 /opt/api-go-demo/bin/api
ls -l /opt/api-go-demo/bin/api
步骤 3 — 运行用户 www-data(ch03 复习)
id www-data 2>/dev/null || sudo useradd -r -s /usr/sbin/nologin www-data
sudo chown -R root:root /opt/api-go-demo
步骤 4 — unit 文件(逐段理解)
sudo tee /etc/systemd/system/api-go-demo.service << 'EOF'
[Unit]
Description=API Go Demo (linux-shell ch14)
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/api-go-demo
Environment=API_PORT=8080
ExecStart=/opt/api-go-demo/bin/api