必须用fiber.New()而非fiber.Default(),因其默认挂载Logger、Recover等中间件,会导致敏感头泄露、TTFB增加0.3–0.8ms;生产环境应显式初始化并按需添加中间件。

直接用 fiber.New(),别碰 fiber.Default()
默认配置(fiber.Default())看似省事,实际绑定了大量中间件(如 logger、recover、static 等),对轻量场景是冗余负担。真正轻量的起点是显式初始化:app := fiber.New(&fiber.Config{CaseSensitive: true, StrictRouting: true})。这两项必须开——不是为了“严格”,而是避免路由歧义带来的隐性 bug(比如 /users 和 /users/ 被当成同一路径,导致参数丢失或 404 漂移)。
只注册必需中间件,app.Use() 前缀要带结尾斜杠
app.Use() 是挂载中间件的入口,但它的匹配逻辑容易误用:它只精确匹配前缀,或前缀后紧跟 /。例如 app.Use("/api", m) 能匹配 /api、/api/users,但不匹配 /apix 或 /api123。如果你只想保护 /api/v1 下的所有路由,写成 app.Use("/api/v1/", m) 才安全;漏掉结尾斜杠,/api/v123 也会被误捕获。
常见轻量组合:
- 仅日志:
app.Use(logger.New())(不用fiber.Logger()这种封装) - 仅 panic 恢复:
app.Use(recover.New()) - 静态文件(如前端 dist):
app.Static("/", "./dist"),不推荐用app.Use()包一层
c.Params()、c.QueryParam()、c.BodyParser() 必须分清来源
这是新手踩坑最密集的点:三个方法读取位置完全隔离,名字相同也不互通。
URL 是 /user/123?format=json 时:
-
c.Params("id")→ 空(路径没定义:id占位符);得写app.Get("/user/:id", h)才能拿到"123" -
c.QueryParam("format")→"json"(只从 query string 提取) -
c.BodyParser(&v)→ 只处理Content-Type: application/json的 body,query 和 path 都不影响它
混用会导致参数始终为空,但无报错,调试时极难定位。
Docker 构建务必用多阶段 + CGO_ENABLED=0
轻量不只是代码少,镜像也要小。Fiber 底层用 fasthttp,禁用 CGO 后可生成纯静态二进制,Alpine 镜像能压到 ~15MB。
关键两行不能少:
FROM golang:1.20-alpine AS builder RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-s -w' -o app .
-s -w 去除符号表和调试信息,进一步减重;运行阶段直接用 FROM alpine:3.17,别用 debian 或带 shell 的镜像。
上线前最后检查:所有 app.Get()、app.Post() 路径是否都带前导 /(如 "/users",不是 "users"),这是 Fiber 路由匹配的硬性要求,漏写会静默失败。











