Fiber端口必须显式传给app.Listen(),如":8081";报“address already in use”是系统端口被占,非Fiber错误;需用log.Fatal捕获监听失败,不支持自动fallback。

直接改 app.Listen() 的参数就行,别碰配置文件——Fiber 没有全局配置文件,所有端口控制都在代码里。
为什么改了端口还是报“address already in use”
错误不是 Fiber 报的,是 Go 标准库底层 net.Listen 返回的,说明系统层面该端口真被占了。常见原因:
-
app.Listen(":3000")启动后没正常退出,进程残留(尤其 Ctrl+C 中断不干净) - 其他 Go 程序、Node 服务、Python Flask 默认的 5000、Spring Boot 默认的 8080 都可能撞上你选的端口
- macOS 上 AirPlay 或控制中心会悄悄占用 5000 端口,Flask 用户常踩,Fiber 用 5000 同样中招
修改端口的唯一正确写法
Fiber 不读 config/app.conf、不认 server.port、不解析环境变量——端口必须显式传给 app.Listen()。示例:
package main
import (
"log"
"github.com/gofiber/fiber/v2"
)
func main() {
app := fiber.New()
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello World")
})
// ✅ 正确:直接改这里
log.Fatal(app.Listen(":8081"))
}
注意三点:
- 端口字符串必须带冒号,写成
":8081",不能只写8081 -
app.Listen()必须用log.Fatal()或类似方式捕获 error,否则失败静默,你以为跑起来了其实没监听 - 别在
app.Get()前加任何中间件或配置来“间接改端口”,没这回事
想自动 fallback 到可用端口?得自己写逻辑
Fiber 不提供 strictPort: false 这类选项(Vite 有,它没有)。如果想避免手动换端口,得自己封装尝试逻辑:
func listenOnAvailablePort(app *fiber.App, basePort int) error {
for port := basePort; port < basePort+100; port++ {
addr := fmt.Sprintf(":%d", port)
err := app.Listen(addr)
if err == nil {
log.Printf("Server started on %s", addr)
return nil
}
if strings.Contains(err.Error(), "address already in use") {
continue
}
return err
}
return errors.New("no available port found")
}
调用时:listenOnAvailablePort(app, 3000)。但生产环境不建议这么干——端口不确定会导致反向代理、防火墙规则、CI/CD 部署全乱套。
最易被忽略的一点:Fiber 启动失败时不会打印任何提示,app.Listen() 返回 error 就完事了。很多人删掉 log.Fatal() 改成空 if err != nil { },结果服务根本没起来,还傻等浏览器响应。


















