必须用bee pack而非go build,因bee pack自动打包conf/static/views目录并保持层级结构,而go build仅生成单二进制文件,导致配置加载失败、静态资源缺失、监听地址回退至127.0.0.1,引发502或静默panic。

Beego 项目不能用 go build 直接编译上线,必须用 bee pack 打包,否则静态资源、配置文件、模板路径全丢失,启动后 502 或静默 panic。
为什么必须用 bee pack 而不是 go build
Beego 运行时依赖固定目录结构:conf/、static/、views/ 必须与可执行文件同级。而 go build 只输出单个二进制,不打包任何附属目录——哪怕你把 app.conf 放对位置,beego.LoadAppConfig("ini", "conf/app.conf") 仍会因相对路径失效而跳过加载,最终用默认值监听 127.0.0.1:8080,对外不可访问。
bee pack 会自动扫描项目结构,把 conf、static、views、main.go 所在目录下的全部内容打进 tar 包,并保证解压后层级正确。
- 执行前确认当前在项目根目录(含
main.go和conf/app.conf) - Linux 部署命令:
bee pack -be GOOS=linux GOARCH=amd64(ARM64 机器改GOARCH=arm64) - 输出如
myapp.tar.gz,解压后得到一个可执行文件(默认名app)和完整目录树
解压后三件事:权限、路径、监听地址
上传 .tar.gz 到服务器并解压只是第一步。90% 的线上失败都卡在这三个硬性条件上:
-
chmod +x ./app:没执行权限,nohup启动直接报Permission denied -
cd /path/to/project再运行:Beego 默认按工作目录找conf/app.conf,若在上级目录执行./app,它会去上级目录下找conf/,找不到就 fallback 到内置默认配置 - 检查
conf/app.conf中两行是否生效:httpport = 5000(平台通常只开放 5000)、httpaddr = "0.0.0.0"(别留空、别写"localhost",v2 空值默认 fallback 到127.0.0.1)
启动命令要带日志重定向,别信“跑起来了”
Beego 在非 dev 模式下默认不打印启动日志到终端,./app 看似执行了,其实可能秒退。必须用 nohup 或 systemd 并重定向输出,否则连失败原因都看不到。
- 基础命令:
nohup ./app >> app.log 2>&1 & - 启动后立刻检查:
tail -f app.log,确认有类似Start running ... listening on :5000日志 - 如果日志为空或只有 panic 堆栈,大概率是
conf/app.conf加载失败或 ORM 初始化出错(比如数据库地址写死在init()里却没配环境变量) - 临时排障可加
beego.BeeApp.RunMode = beego.PROD前置设为生产模式,避免某些 dev-only 行为干扰
最容易被忽略的是:Beego v2 的 import 路径已变,必须用 github.com/beego/beego/v2,旧项目升级后若没改 import,go mod tidy 会拉错版本,打包后 runtime panic 报 undefined: beego.BConfig —— 这种错误不会出现在日志里,只在首次 HTTP 请求时 500。











