Fiber 的“快”很吸引人,但生产上更重要的是“车别撞”。
#1. 反向代理是常态,不是例外
官方 Reverse Proxy 文档明确把这当常见生产模式。
典型架构:
客户端
│
▼
Nginx / Traefik / Caddy / HAProxy
│
├── TLS 终止
├── HTTP/2 / HTTP/3
├── 负载均衡
├── WAF / 限流
└── 转发头设置
│
▼
Fiber App很多现代能力,尤其是:
- HTTPS/TLS
- HTTP/2
- HTTP/3
- 反代级安全能力
都更适合放在 Fiber 前面那层总闸口上解决。
#2. 真实客户端 IP 别乱信
官方文档对这一点写得很重:
如果你在反代后面直接信 X-Forwarded-For,而没配信任代理范围,攻击者可以伪造头。
正确思路是:
app := fiber.New(fiber.Config{
TrustProxy: true,
ProxyHeader: fiber.HeaderXForwardedFor,
TrustProxyConfig: fiber.TrustProxyConfig{
Loopback: true,
},
})也就是说:
不是“有人在头里写了自己的 IP 你就信”,而是“只有我认可的城门代理写来的头,我才信”。
#3. 优雅停服比“秒关机”重要
Fiber 官方 API 文档提供了:
app.Shutdown()app.ShutdownWithTimeout(...)app.ShutdownWithContext(...)
真实项目至少要做到:
- 收到退出信号时不再接新请求
- 给在途请求一点时间办完
- 再安全关机
一个简化示例:
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/gofiber/fiber/v3"
)
func main() {
app := fiber.New()
app.Get("/health", func(c fiber.Ctx) error {
return c.SendString("ok")
})
go func() {
if err := app.Listen(":3000"); err != nil {
log.Printf("listen error: %v", err)
}
}()
quit := make(chan os.Signal, 1)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := app.ShutdownWithContext(ctx); err != nil {
log.Printf("shutdown error: %v", err)
}
}