Skip to content

第31章:部署与运维 ​

本章目标 ​

将 Gin 项目部署到生产环境并运维


31.1 配置管理(Viper) ​

go
import "github.com/spf13/viper"

type Config struct {
	ServerPort string `mapstructure:"SERVER_PORT"`
	DBDsn      string `mapstructure:"DB_DSN"`
	JWTSecret  string `mapstructure:"JWT_SECRET"`
}

func LoadConfig() *Config {
	viper.SetDefault("SERVER_PORT", "8080")
	viper.AutomaticEnv()
	var cfg Config
	viper.Unmarshal(&cfg)
	return &cfg
}

31.2 Docker 部署 ​

dockerfile
# Dockerfile
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o server .

FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/server .
COPY --from=builder /app/templates ./templates
EXPOSE 8080
CMD ["./server"]
bash
docker build -t gin-app .
docker run -d -p 8080:8080 --name gin-app gin-app

31.3 Nginx 反向代理 ​

nginx
server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

31.4 健康检查 ​

go
r.GET("/health", func(c *gin.Context) {
	c.JSON(200, gin.H{"status": "ok", "time": time.Now()})
})

31.5 生产环境检查清单 ​

  • [ ] 配置 ReadTimeout / WriteTimeout / IdleTimeout
  • [ ] 数据库连接池配置 MaxOpenConns / MaxIdleConns
  • [ ] 日志输出到文件(不用 DefaultWriter)
  • [ ] 日志级别设为 Warn(不打印所有请求)
  • [ ] CORS 精确限制 Origin,不用 *
  • [ ] JWT 密钥至少 32 字节,用环境变量传入
  • [ ] gin.SetMode(gin.ReleaseMode) 关闭调试模式
  • [ ] 添加健康检查 /health 接口
  • [ ] 优雅关闭 + 信号监听
  • [ ] Nginx 配置 X-Real-IP / X-Forwarded-For
  • [ ] 开启 HTTPS

本章小结 ​

  • Viper 管理环境变量配置
  • Docker 多阶段构建减小镜像体积
  • Nginx 反向代理 + 负载均衡
  • 生产环境检查清单逐项核对

练习题 ​

  1. 用 Viper 改造项目的配置管理。
  2. 写一个 Dockerfile 并构建镜像。
  3. 添加健康检查接口 /health。
  4. (思考题)为什么生产环境不推荐 gin.DefaultWriter = os.Stdout?

把零散知识,整理成可以反复走的路。