linux/macos用lsof -i :端口、windows用netstat -ano | findstr :端口查占用,再结合tasklist或ps确认进程;常见隐身占用者包括docker容器、nginx、ide调试服务及系统保留端口。

必须先确认端口是否真被占用,再决定是杀进程、换端口,还是改系统保留策略——Fiber 本身不占端口,app.Listen() 才会真正去 bind。
查端口谁在用:Linux/macOS 用 lsof,Windows 用 netstat
别跳过这步。很多“端口被占”其实是假象(比如 Docker 容器没删、Nginx 残留、或系统保留端口)。
- macOS/Linux:
lsof -i :3000(把3000换成你 Fiber 启动时报错的端口);如果提示 command not found,先装:brew install lsof - Windows:
netstat -ano | findstr :3000,输出里最后一列是 PID,再用tasklist | findstr <pid></pid>看进程名 - 常见“隐身占用者”:Docker 容器(
docker ps查)、Nginx(ps aux | grep nginx)、IDE 自带的调试服务(如 PyCharm 的 Flask Server)、甚至 Windows 的svchost.exe(系统保留端口,需额外释放)
app.Listen() 必须显式处理 error,否则静默失败
Fiber 不会帮你 recover 端口冲突错误。不检查 app.Listen() 返回的 error,程序就直接退出,连日志都不打。
- 错误信息典型是:
listen tcp :3000: bind: address already in use - 正确写法示例:
if err := app.Listen(":3000"); err != nil { log.Fatalf("Failed to start server: %v", err) } - 别用
log.Println(err)或忽略——它不会阻断执行,但你会以为服务起来了,实际什么都没监听
临时解决 vs 根治:换端口简单,但得知道为什么总撞上
开发阶段快速绕过,可以改端口;但反复遇到,说明没定位到根本原因。
- 改端口最直接:
app.Listen(":8080")或app.Listen(os.Getenv("PORT"))(配合环境变量) - 如果总是
:3000冲突,大概率是上次 Fiber 进程没退出干净,用kill -9 <pid></pid>或taskkill /F /PID <pid></pid>干掉 - Windows 上 80/443 等低号端口常被系统保留:
netsh interface ipv4 show excludedportrange protocol=tcp查范围;需管理员权限运行netsh interface ipv4 delete excludedportrange protocol=tcp startport=80 numberofports=1(慎用)
最容易被忽略的是:Docker 容器退出后,端口映射可能还在生效(尤其用 -d 后台跑过又没 docker stop);还有 IDE 的热重载机制有时会起多个实例,自己跟自己抢端口。











