Revel应用必须绑定127.0.0.1而非0.0.0.0,否则直接暴露公网;应使用systemd托管并设置REVEL_RUNMODE=prod,Nginx反向代理需透传Host头,且推荐用revel package打包部署。

Revel 应用必须绑定 127.0.0.1,不能监听 0.0.0.0
直接运行 revel run -a myapp -p 8089 默认会监听 0.0.0.0:8089,这在云服务器上等于把开发服务暴露在公网——没有 TLS、没有请求限流、没有头过滤,极易被扫描利用。生产环境第一道防线就是收窄监听范围。
正确做法是显式指定 -addr 127.0.0.1:
revel run -a myapp -p 8089 -addr 127.0.0.1
这样只有本机进程(比如 Nginx)能访问它。如果漏掉这步,Nginx 反向代理配置再规范也没用——漏洞已在上游暴露。
用 systemd 替代后台 & 或 nohup
很多人习惯用 nohup revel run ... & 启动,但这种方式缺乏进程生命周期管理:崩溃不自动拉起、日志无法统一归集、重启服务器后服务不会自启。
推荐用 systemd 托管,新建 /etc/systemd/system/revel-app.service:
[Unit] Description=Revel MyApp After=network.target [Service] Type=simple User=www-data WorkingDirectory=/opt/myapp ExecStart=/usr/local/bin/revel run -a myapp -p 8089 -addr 127.0.0.1 Restart=always RestartSec=10 Environment=REVEL_RUNMODE=prod [Install] WantedBy=multi-user.target
关键点:
-
Type=simple:适用于前台阻塞型进程(Revel 默认就是) -
Restart=always:进程退出即重启,避免“挂了没人知道” -
Environment=REVEL_RUNMODE=prod:强制关闭开发模式(如热重载、调试面板) - 不要用 root 运行,
User=www-data更安全
Nginx 反向代理配置里必须加 proxy_set_header Host
Revel 默认依赖 Host 请求头生成绝对 URL(比如邮件通知里的链接、重定向 Location)。如果 Nginx 不透传,应用可能生成 http://127.0.0.1:8089/... 这类错误地址。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
正确配置片段:
location / {
proxy_pass http://127.0.0.1:8089;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
漏掉 proxy_set_header Host $host 会导致:
- 登录后跳转回
http://127.0.0.1:8089/login(用户看到 404) - API 返回的资源链接指向本地地址
- 邮件模板里拼出的激活链接不可访问
部署前先用 revel package 打包,别直接传源码
在云服务器上装 Go、配置 GOPATH、拉依赖再编译,既慢又容易因版本不一致出错。Revel 提供的 revel package 命令会把整个应用编译成二进制 + 启动脚本,无需目标机装 Go 环境。
操作流程:
- 本地执行:
revel package import/path/to/myapp→ 得到myapp.zip - 解压到服务器:
unzip myapp.zip -d /opt/myapp - 确认
/opt/myapp/run.sh有执行权限:chmod +x /opt/myapp/run.sh - 在
systemd的ExecStart中调用它(而非revel run)
这个方式还能规避“本地开发用 macOS,服务器是 Linux”的交叉编译问题——revel package 默认按当前系统架构打包,你只需确保本地和目标系统架构一致(如都是 linux/amd64)。
真正麻烦的不是启动命令怎么写,而是当某天 revel run 在终端里跑着好好的,一换成 systemd 就报 open /dev/tty: no such device or address ——那八成是没关掉开发模式里的某个终端交互特性,或者日志路径权限不对。这些细节比配置本身更耗时间。










