Beego生产环境必须设runmode = prod并禁用EnableStatic,由Nginx通过location ^~ /static/ + alias /data/www/static/托管静态资源,同时确保二进制工作目录、views/与conf/路径、Docker WORKDIR三者严格一致。

Beego 项目上线不能只靠 bee run 或 go run main.go,生产环境必须关闭开发模式、分离静态资源、固定工作目录,并由 Nginx 或 CDN 承担文件服务和反向代理职责。否则会遇到 404、缓存失效、路径错乱、权限暴露等实际问题。
如何设置 Beego 进入生产模式
开发时默认是 dev 模式,模板不缓存、错误堆栈直出、静态路由自动启用——这些在生产环境全是风险点。必须显式切换为 prod 模式:
- 在
conf/app.conf中写死:runmode = prod(推荐,避免环境变量误配) - 不要用代码动态设
beego.RunMode = "prod",它可能被后续配置覆盖 -
prod模式下,views/目录仍需随二进制一起部署,因为模板渲染是 Go 进程内行为,Nginx 无法接管 - 若用
beego.LoadAppConfig("ini", "conf/app.conf"),启动前确保当前工作目录是二进制所在路径;否则改用绝对路径加载,例如beego.LoadAppConfig("ini", "/opt/app/conf/app.conf")
Nginx 必须配对 location ^~ /static/ 而非 location /static/
很多人配了 location /static/ 却发现请求 /static/css/app.css 仍 fallback 到 Beego,最终 404。根本原因是正则 location(如 location ~ \.js$)优先级高于普通前缀匹配,而 ^~ 能强制终止匹配流程,确保静态路径最高优先。
- 必须用
alias /data/www/static/;(注意末尾斜杠),不是root;用root会导致路径拼成/data/www/static/static/css/app.css - Beego 中的
web.SetStaticPath("/static", "./static")必须禁用,否则与 Nginx 冲突;在conf/app.conf中设EnableStatic = false - 加缓存头:Beego 的
http.ServeFile不支持ETag和Last-Modified,Nginx 可原生支持:expires 1y;+add_header Cache-Control "public, immutable";
location ^~ /static/ {
alias /data/www/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
部署目录结构不能依赖相对路径
Beego 编译后是单个二进制,但 static/、views/、conf/ 三个目录必须按约定位置存在。常见翻车点是把 ./static 当作当前目录,结果二进制挪到 /opt/app/ 下运行时,./static 就变成 /opt/app/static,而实际文件却放在 /data/www/static。
- 静态资源统一放独立路径(如
/data/www/static),由 Nginx 的alias指向,不依赖 Beego 进程读取 -
views/和conf/必须和二进制放同一级或用绝对路径加载,否则模板找不到、配置项失效 - 打包脚本里别用
cp -r static ./,而是明确复制到目标部署路径:cp -r static /data/www/static - 如果用了构建工具(如
bee build),确认输出的二进制不含嵌入资源;Beego v2 默认不 embed,别误以为“打包即完成”
Docker 部署时工作目录和挂载点要严格对应
Dockerfile 里若用 COPY . /app,但没指定 WORKDIR /app,容器启动时 Go 进程的当前目录就是 /,导致 conf/app.conf 加载失败、views/ 找不到。
-
Dockerfile中必须显式声明:WORKDIR /app,且所有COPY操作基于该路径 - 若想把静态资源从镜像中剥离(更推荐),就不要
COPY static/,而是通过 volume 挂载:-v /data/www/static:/data/www/static,再让 Nginx 容器或宿主机 Nginx 代理 - Beego 的
beego.BConfig.WebConfig.StaticExtensions只在runmode = prod且EnableStatic = true时生效;但线上你应该关掉它,所以这个配置本质是“防误开”的兜底项
最易被忽略的是:Nginx 的 alias 末尾斜杠、Beego 的 EnableStatic = false、以及二进制启动时的工作目录三者必须咬合。漏掉任一环,静态资源就会突然 404 或返回 HTML 页面内容。











