Revel框架生产模式必须显式设置REVEL_RUNMODE=prod环境变量,配合revel run -a myapp -p 8089 -addr 127.0.0.1启动,否则即使编译为二进制仍按开发模式运行,模板缓存、Session加密、错误页等行为均依赖该变量运行时判定。

Revel 框架没有“一键开启生产模式”的开关,它靠环境变量 REVEL_RUNMODE 和启动参数共同生效;直接运行 revel run 默认就是开发模式,不设环境变量就永远进不了生产模式。
必须显式设置 REVEL_RUNMODE=prod 才算真正进入生产模式
Revel 不会自动检测 NODE_ENV 或当前目录是否含 build 字样——它只认 REVEL_RUNMODE。漏设这个变量,哪怕你用 systemd 启动、关掉 debug 日志、甚至把代码编译成二进制,框架内部仍按开发模式加载模板、校验路由、注入调试信息。
- 启动前必须导出:
export REVEL_RUNMODE=prod(Bash/Zsh)或set REVEL_RUNMODE=prod(Windows CMD) - 推荐在 systemd service 文件里写死:
Environment="REVEL_RUNMODE=prod" - 如果用 Docker,应在
Dockerfile中写ENV REVEL_RUNMODE=prod,而非仅靠docker run -e临时传入 - 注意大小写:
prod有效,production、PROD、PrOd全部无效
revel run 在生产环境不能直接用,必须配合 -a 和 -p 参数绑定私有地址
开发时 revel run myapp 默认监听 0.0.0.0:9000,这在生产中是严重安全隐患。生产部署必须强制限定监听范围,并禁用热重载等开发特性。
- 正确命令:
revel run -a myapp -p 8089 -addr 127.0.0.1—— 只允许本地回环访问 - 绝对不要省略
-addr 127.0.0.1;即使设置了REVEL_RUNMODE=prod,没加这个参数照样暴露在公网 -
revel run本质是开发工具,不适用于长期运行;上线后应改用go run main.go或编译后的二进制,再由 systemd / supervisor 管理进程 - 若用
go run main.go,需确保main.go中调用了revel.Init()且环境变量已就位,否则REVEL_RUNMODE不生效
模板、Session、日志行为全依赖 REVEL_RUNMODE 值
这个变量不只是开关,它直接改变 Revel 运行时的底层逻辑:
- 模板缓存:
prod下app/views/中的 .tpl 文件只读取一次,后续修改完全不生效;开发模式下每次请求都重新解析 - Session 加密:
prod强制启用 Cookie 加密和签名,dev下可能跳过验证,导致本地测试正常、线上登录失败 - 错误页面:
prod返回通用 500 页面,dev则输出完整堆栈和源码片段——后者绝不能出现在公网 - 日志级别:
prod默认关闭DEBUG级别日志,但INFO和ERROR仍输出;如需进一步精简,得手动改conf/app.conf中的log.level
最容易被忽略的是:Revel 的生产模式不是“构建时决定”,而是“运行时判定”。哪怕你用 go build 编译了二进制,只要启动时没设 REVEL_RUNMODE=prod,它就还是开发模式——连 conf/app.conf 里写的 run.mode = prod 都不会覆盖环境变量优先级。


















