下载工作台
Linux 与 Shell 入门

综合实战:Linux 部署 api-go-demo

试读上半部分 · 解锁后可读全文

第 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~ch13gin-web 建议已学基础;可在本机 WSL 或 ch08 SSH 到的云主机完成。


14.1 场景说明:开发机跑得好,一上 Linux 就挂

本地 WSL go run 正常,测试机 curl healthzConnection 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/
systemdenable + 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

以下内容需解锁后阅读

试读已结束。解锁本章 ¥5.00,或开通年度会员畅读全部教程。
年度会员 ¥199.00/年; 小紫 AI 工作台有效会员 ¥99.00/年

正文仅在服务端鉴权后下发,未付费无法获取下半部分内容。