beego 默认监听 0.0.0.0:8080,修改 conf/app.conf 中的 httpaddr="127.0.0.1" 和 httpport="9090" 可限定本地访问并变更端口,需重启服务生效,且必须加引号;若未创建该文件则使用硬编码默认值。

修改 conf/app.conf 中的 httpport 和 httpaddr
Beego 默认监听 0.0.0.0:8080(即所有网卡 + 8080 端口),但实际行为取决于配置文件中是否显式设置了 httpaddr 和 httpport。只要 conf/app.conf 存在且被正确加载,它就会覆盖代码中硬编码的默认值。
在 conf/app.conf 中添加或修改以下两行:
httpaddr = "127.0.0.1" httpport = 9090
注意:httpaddr 设为 "127.0.0.1" 表示只允许本地访问;设为空字符串 "" 或 "0.0.0.0" 才会监听所有接口。不写该配置项时,Beego 内部默认值为空字符串,等效于 0.0.0.0。
- 修改后必须重启服务才生效(
bee run或重新运行编译后的二进制) - 如果项目没建
conf/app.conf,Beego 仍会启动,但用的是硬编码默认值,不会读取任何配置 -
httpaddr和httpport是字符串类型,即使写数字也要加引号(如httpport = "9090"),否则解析失败后可能静默回退到 8080
代码中通过 beego.BConfig 覆盖配置
如果你不想依赖配置文件,或者需要根据运行环境动态决定监听地址,可以在 main.go 的 init() 或 main() 开头直接改 beego.BConfig:
beego.BConfig.Listen.HTTPAddr = "127.0.0.1" beego.BConfig.Listen.HTTPPort = 9090
这比配置文件优先级更高,会完全绕过 app.conf 解析逻辑。但要注意:必须在 beego.Run() 之前设置,否则无效。
- 常见错误是写成
beego.HttpPort = 9090—— 这个字段早已废弃,不起作用 -
beego.BConfig.Listen下还有HTTPSAddr/HTTPSPort等,别和 HTTP 配置混淆 - 若同时设了配置文件和代码赋值,以代码为准;但混合使用容易引发维护困惑,建议二选一
监听特权端口(如 80)时的 Permission Denied 错误
Linux 下普通用户进程无法绑定 1–1023 端口,所以把 httpport 改成 80 后运行会报错:ListenAndServe: permission denied。
强行用 sudo 启动 Beego 极其危险——一旦应用存在漏洞,攻击者可直接获得 root 权限。生产环境必须避免。
- 正确做法是让 Beego 监听非特权端口(如
8080),再用 Nginx/Apache 做反向代理,把80流量转给127.0.0.1:8080 - 不要尝试用
setcap 'cap_net_bind_service=+ep' ./myapp授权——Beego 不是纯 net/http,内部有多个监听点,授权后仍可能失败 - 容器部署时可通过
--cap-add=NET_BIND_SERVICE实现,但需确认基础镜像和运行用户权限模型是否支持
验证监听地址是否生效
改完配置后别急着测业务,先确认底层 socket 确实绑定了预期地址:
Linux 下执行:lsof -i :9090 或 ss -tuln | grep :9090,看输出中的 ADDR 列是不是你设的 127.0.0.1:9090 或 *:9090。
- 如果看到
127.0.0.1:9090却从外网 curl 不通,说明防火墙或云服务器安全组没放行——这不是 Beego 的问题 - 如果看到
*:9090但 curl127.0.0.1:9090返回 connection refused,大概率是服务根本没起来,检查日志里有没有 panic 或路由初始化失败 - Beego 启动日志里会打印类似
[INFO] http server Running on http://:9090,注意这里:9090表示0.0.0.0:9090,不是 bug
conf/app.conf 存在 → 显式写全 httpaddr 和 httpport → 用系统命令验证 socket 绑定结果 → 再测业务逻辑。











