fiber服务需监听0.0.0.0而非127.0.0.1,ngrok/frp端口须与fiber实际端口一致,路由应注册根路径或通配符,frp需配置正确proto和locations,注意大小写敏感及host头处理。

确认 Fiber 服务监听的是 0.0.0.0 而非 127.0.0.1
Fiber 默认用 app.Listen(":3000") 启动时,底层调用的是 http.ListenAndServe,它会绑定到 0.0.0.0:3000 —— 但如果你显式写了 app.Listen("127.0.0.1:3000"),那 ngrok 或 frp 就无法从外网穿透进来,因为连接被系统限制在本地回环。常见错误现象是:ngrok 显示隧道已建立,但 curl 公网地址返回 connection refused 或超时。
实操建议:
- 启动前加一句 netstat -an | grep :3000(Linux/macOS)或 netstat -ano | findstr :3000(Windows),确认监听地址是 *:3000 或 0.0.0.0:3000
- 若必须限定 IP,改用 app.Listener("0.0.0.0:3000") 配合自定义 net.Listener,避免硬写 127.0.0.1
ngrok http 8080 必须与 Fiber 实际端口一致
ngrok 不会自动探测你的服务端口,它只把流量转发到你指定的本地地址。比如你的 Fiber 服务跑在 :3000,但你执行了 ngrok http 8080,那所有请求都会被发往本机的 8080 端口——而那里什么都没监听,自然收不到。
实操建议:
- 查看 Fiber 启动日志,确认真实端口(如 Listening on :3000)
- 执行 ngrok http 3000,不是服务名、不是路径、就是那个数字端口
- 如果用 ngrok start --config ngrok.yml,确保 tunnels 下的 addr: 字段值是 3000,且 authtoken 在 tunnels 外层顶层
Fiber 路由必须注册根路径 / 或显式匹配 Host
ngrok 生成的域名(如 abc123.ngrok.io)会作为 Host 头发给 Fiber。如果你只注册了 app.Get("/api", ...) 却没注册任何 / 路由,Fiber 的默认行为是返回 404 或直接拒绝(尤其 Go 1.22+ 的 StrictContentLength 启用后更敏感)。
实操建议:
- 至少加一个兜底路由:app.Get("*", func(c *fiber.Ctx) error { return c.SendStatus(404) })
- 若依赖 Host 做多租户,别直接读 c.Hostname(),改用 c.Get("X-Forwarded-Host")(ngrok 会带这个头)
- 开发期可临时关掉严格校验:app.Server().StrictContentLength = false,避免 chunked 请求被拒
frp 客户端配置里 proto 必须设为 http 且匹配 Fiber 的 path
frp 的 [web] 类型隧道会做 HTTP 层解析,如果 Fiber 接口路径是 /v1/user,但 frpc.ini 里写的是 custom_domains = example.com 却没配 locations = /,那请求可能被 404 或路由错位。更隐蔽的问题是:frp 默认不透传 Content-Length,某些 Fiber 中间件(如 body parser)会因 header 缺失而 panic。
实操建议:
- 使用 proto = http 类型,并明确写 locations = /, /v1/(按实际前缀填)
- 加 host_header_rewrite = your-domain.com 避免 Fiber 因 Host 不匹配拒绝请求
- 若遇到 body 读取失败,检查 frpc 日志是否有 read body failed,尝试在服务端加 app.Use(func(c *fiber.Ctx) error { c.Request().Header.Set("Content-Length", fmt.Sprintf("%d", c.Request().BodyLength())) return c.Next() })
最易忽略的一点:Fiber 的 app.Config().CaseSensitive 和 StrictRouting 默认为 true,而 ngrok/frp 转发时大小写可能被代理层修改;若你写了 app.Get("/API", ...) 却用小写路径访问,会静默 404。别假设“路径看起来一样就一定匹配”。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











