Fiber 应用中启用 gzip 中间件需调用 app.Use(compress.New()),它自动检测 Accept-Encoding、动态压缩符合条件的响应(默认≥1024B、非204/304/404、MIME在白名单内),不需预压缩或手动调用;常见未压缩原因有显式设置Content-Length、MIME不在白名单、特殊状态码;压缩级别-2~9可调,默认6兼顾性能与压缩率;生产中若前置nginx,应禁用Fiber压缩而由nginx统一处理。

直接在 Fiber 应用中启用 gzip 中间件
Fiber 默认不开启响应压缩,但内置了 gzip.New() 中间件,几行代码就能启用。它会自动检查请求头中的 Accept-Encoding: gzip,对符合条件的响应体(如 text/html、application/json、text/css 等)执行动态压缩。
关键点是:不需要手动调用 gzip.compress(),也不需要预生成 .gz 文件——这是动态压缩,由 Fiber 运行时实时完成。
- 必须在
app.Use()中注册中间件,且应放在路由注册之前 - 默认只压缩大于 1024 字节的响应;小响应不压,避免越压越大
- 压缩级别默认为 6(
gzip.DefaultCompression),可传入gzip.Config{Level: 5}调整 - 不压缩已带
Content-Encoding头的响应,防止重复压缩
示例:
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/compress"
)
func main() {
app := fiber.New()
app.Use(compress.New()) // 启用默认 gzip
app.Get("/api/data", func(c *fiber.Ctx) error {
return c.JSON(map[string]string{"msg": "hello world"})
})
app.Listen(":3000")
}
为什么有些响应没被 gzip 压缩?
常见现象:浏览器发了 Accept-Encoding: gzip,但响应头里没有 Content-Encoding: gzip,体积也没变小。
最可能的原因有三个:
-
Content-Length已被显式设置(比如手动写了c.Set("Content-Length", "123")),Fiber 会跳过压缩——因为压缩后长度变了,硬设的值就错了 - 响应 MIME 类型不在默认白名单内(默认支持
text/.*、application/json、application/javascript等),比如你返回了application/vnd.api+json,就得自定义compress.Config{Enable: func(c *fiber.Ctx) bool { ... }} - 响应状态码是 204、304 或 404(部分场景下),Fiber 默认跳过这些无正文或协商响应的压缩
压缩级别和性能怎么权衡?
gzip.New(compress.Config{Level: N}) 中的 N 取值范围是 -2 到 9,含义如下:
-
-2:使用标准库gzip.BestSpeed(等价于 1),CPU 开销最小,压缩率最低 -
6:默认值,兼顾速度与压缩率,适合大多数 API 和 HTML 服务 -
9:gzip.BestCompression,压缩率最高,但 CPU 占用明显上升,P99 延迟可能升高 1–3ms(实测 M2 Mac 上单核压测)
注意:Level: 1 和 Level: 6 在 JSON/JS/CSS 上通常只差 5%–8% 体积,但 CPU 时间能省 40% 以上。除非出口带宽极其昂贵且服务器冗余充足,否则不建议调到 9。
要不要配合 nginx 的 gzip_static?
不用。Fiber 的 compress.New() 是动态压缩,而 gzip_static on 是 nginx 查找预构建的 .gz 文件并直接返回——两者机制冲突,同时启用会导致行为不可控(比如 nginx 拦截了请求,Fiber 根本没机会运行)。
真实部署中,推荐二选一:
- 纯 Fiber 服务(如 Docker 内直接暴露端口):用
compress.New()动态压 - Fiber 前挂 nginx(常见生产架构):关掉 Fiber 的压缩,把
gzip全交给 nginx 配置,更稳定、可缓存、支持gzip_vary等高级特性
nginx 配置片段示例(放在 location / 块内):
gzip on; gzip_types text/plain application/json application/javascript text/css text/xml; gzip_min_length 1024; gzip_comp_level 6;
这时候 Fiber 就该删掉 app.Use(compress.New()),否则多一层无意义的压缩开销。











