第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-app31.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 反向代理 + 负载均衡
- 生产环境检查清单逐项核对
练习题
- 用 Viper 改造项目的配置管理。
- 写一个 Dockerfile 并构建镜像。
- 添加健康检查接口
/health。 - (思考题)为什么生产环境不推荐
gin.DefaultWriter = os.Stdout?