全书目录

第三十三篇:Fiber 完全指南 —— 极简高压快线城区宇宙

第十六章:生产部署 —— 真正上路时别只盯着“快”

1 分钟 450 字 第 627 / 962 个阅读单元

Fiber 的“快”很吸引人,但生产上更重要的是“车别撞”。


#1. 反向代理是常态,不是例外

官方 Reverse Proxy 文档明确把这当常见生产模式。

典型架构:

text
客户端
  │
  ▼
Nginx / Traefik / Caddy / HAProxy
  │
  ├── TLS 终止
  ├── HTTP/2 / HTTP/3
  ├── 负载均衡
  ├── WAF / 限流
  └── 转发头设置
  │
  ▼
Fiber App

很多现代能力,尤其是:

  • HTTPS/TLS
  • HTTP/2
  • HTTP/3
  • 反代级安全能力

都更适合放在 Fiber 前面那层总闸口上解决。


#2. 真实客户端 IP 别乱信

官方文档对这一点写得很重:

如果你在反代后面直接信 X-Forwarded-For,而没配信任代理范围,攻击者可以伪造头。

正确思路是:

go
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(...)

真实项目至少要做到:

  • 收到退出信号时不再接新请求
  • 给在途请求一点时间办完
  • 再安全关机

一个简化示例:

go
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)
    }
}