revel run 的 -p 和 -addr 参数必须配对使用,单独指定 -addr 无效;-p 控制端口,-addr 限定绑定地址(如 127.0.0.1),二者缺一不可,否则仍默认监听 0.0.0.0:9000。

revel run 命令的 -p 和 -addr 参数必须配对使用
Revel 默认监听 9000 端口且绑定到 0.0.0.0,这在生产环境是危险的。直接运行 revel run myapp 会暴露服务到所有网卡,容易被扫描或攻击。
正确做法是显式指定监听地址和端口:
-
-p 8089控制端口号,不能省略 -
-addr 127.0.0.1强制只监听本地回环,防止外部直连 - 两者必须同时出现,否则
-addr不生效(Revel 会忽略它)
例如:revel run -a myapp -p 8089 -addr 127.0.0.1
config/app.conf 中的 http.port 和 run.mode 决定默认行为
配置文件比命令行参数更稳定,尤其适合部署脚本或容器环境。修改 config/app.conf 后,revel run 会自动读取这些值。
关键配置项:
-
http.port = 8089:覆盖默认9000,注意不要写成port.http或其他变体 -
run.mode = prod:启用生产模式,关闭热重载、模板自动编译等开发特性 -
app.name = myapp必须与revel run -a后的名称一致,否则找不到应用
如果命令行没传 -p 或 -addr,Revel 就完全依赖 app.conf 里的 http.port 和隐含的绑定逻辑(仍会默认绑 0.0.0.0,这点容易被忽略)。
REVEL_RUNMODE 环境变量优先级高于 config/app.conf
当需要快速切换环境(比如 CI/CD 流水线中复用同一份代码),用环境变量比改配置文件更安全可靠。
设置方式:
REVEL_RUNMODE=prod revel run -a myapp -p 8089 -addr 127.0.0.1- 或在 systemd service 文件里写
Environment=REVEL_RUNMODE=prod
注意:REVEL_RUNMODE 只影响运行模式(dev/prod),不控制端口;端口仍由 -p 或 http.port 决定。
常见陷阱:设了 REVEL_RUNMODE=prod 却没关掉 revel run 的热重载——其实只要没在命令行加 -r(watch mode),prod 模式下就不会监听文件变化。
端口冲突时,lsof -n -i4TCP:PORT 是最快诊断手段
启动报错 address already in use 时,别急着换端口,先确认谁在占。
Linux/macOS 下执行:
sudo lsof -n -i4TCP:8089 | grep LISTEN
输出类似:
nginx 1234 root 6u IPv4 0x... 0t0 TCP *:8089 (LISTEN)
说明 nginx 已抢了这个端口。这时候要么停掉 nginx,要么给 Revel 换个端口——但别选 80、443 这类特权端口,Revel 没有 root 权限,bind 会失败。
Windows 用户可用:netstat -ano | findstr :8089,再用 tasklist | findstr 1234 查进程名。
端口和运行模式本身不难配,真正容易出问题的是组合逻辑:命令行参数、配置文件、环境变量三者之间有明确的覆盖顺序,而 Revel 文档里没把这点写透。尤其是 -addr 必须跟 -p 一起用,单独写 -addr 127.0.0.1 完全无效——这个细节线上踩过坑的人才懂。


















