app.conf 是 revel 应用的强制配置中枢,必须位于 conf/app.conf,按 [default]、[dev]、[prod] 等 section 组织,依赖 revel_runmode 环境变量加载对应环境配置,且大小写敏感;需配对设置 http.port 与 http.addr,数据库连接应通过 ${db_url} || "fallback" 方式动态注入,命令行启动时 runmode 必须紧随应用名后。

app.conf 是 Revel 应用真正的配置中枢,改它不是“可选操作”,而是多环境部署的前提。硬编码端口、数据库地址或调试开关,等于把环境耦合进代码里——上线前手动替换?漏改一个就炸。
app.conf 文件位置和基础结构必须对得上
Revel 项目中 app.conf 固定位于 conf/app.conf(不是 config/,也不是 configs/)。它按 section 分块,每段以 [section name] 开头,比如 [dev]、[prod]、[test]。Revel 启动时会根据 REVEL_RUNMODE 环境变量自动加载对应 section,并向上合并 [default] 的值。
常见错误是:把配置写在 [dev] 下却没设 REVEL_RUNMODE=dev,结果读到的还是 [default] 里的旧值;或者误删了 [default],导致部分配置项缺失。
-
[default]必须存在,存放所有环境共用的基础项(如app.name、app.secret) - 每个环境 section 只覆盖差异项,不要重复写
app.name这类通用配置 - 注释用
#,不能用//或/* */,否则解析失败
http.port 和 addr 要配对改,否则监听失败
只改 http.port 不够,http.addr 决定绑定哪个网络接口。默认是 http.addr = 0.0.0.0,意味着监听所有 IPv4 地址——开发没问题,但生产环境直接暴露在公网,极不安全。
正确做法是按环境区分:
- 开发:
http.addr = 0.0.0.0+http.port = 9000(方便本机和局域网访问) - 生产:
http.addr = 127.0.0.1+http.port = 8089(仅限本地反向代理访问) - 测试:
http.addr = 127.0.0.1+http.port = 8088(避免和 prod 冲突)
如果只改 port 没改 addr,而系统防火墙或云服务器安全组又放行了 0.0.0.0:port,那等于把开发服务裸奔上线。
数据库连接字符串不能写死,要用环境变量兜底
Revel 支持在 app.conf 中引用环境变量,语法是 ${ENV_VAR_NAME}。这对数据库连接最实用:
db.url = ${DB_URL} || "user:pass@tcp(127.0.0.1:3306)/myapp_dev?parseTime=true"
这行配置的意思是:优先取环境变量 DB_URL 的值;如果没设,才 fallback 到后面的默认连接串。这样你可以在 CI/CD 流水线里注入生产数据库地址,本地开发仍走默认值,无需改任何配置文件。
注意点:
- 环境变量名必须全大写、下划线分隔(
DB_URL✅,dbUrl❌) -
||前后必须有空格,否则解析器会报错invalid syntax near "||" - 密码含特殊字符(如
@、/)时,务必 URL 编码,否则gorm.Open会解析失败
动态切换 runmode 时,别忘了检查 revel run 命令参数顺序
命令 revel run myapp dev 8888 中,dev 是 runmode,8888 是端口 —— 顺序不能颠倒。如果写成 revel run myapp 8888 dev,Revel 会把 8888 当作 runmode 名去查找 [8888] section,自然找不到,最终 fallback 到 [default],端口也还是配置文件里写的那个。
更稳妥的方式是用环境变量启动:
REVEL_RUNMODE=prod revel run myapp -p 8089 -addr 127.0.0.1
这时命令行参数 -p 和 -addr 会覆盖 app.conf 中的 http.port 和 http.addr,且不受 runmode section 顺序影响。适合自动化脚本或容器环境。
真正容易被忽略的是:runmode 的大小写敏感性。REVEL_RUNMODE=Dev 和 REVEL_RUNMODE=dev 是两个不同 section,而 Revel 默认只认小写形式的 dev、prod、test。写错大小写,等于白配。











