Revel生产部署必须绑定127.0.0.1并经Nginx反向代理,否则存在安全与功能风险;Nginx需正确配置proxy_pass尾部斜杠、WebSocket头、静态资源路由及X-Forwarded-*头透传。

Revel 应用必须走反向代理才能上线,直接监听 0.0.0.0 或暴露默认端口(如 9000)是生产环境的硬伤,不是“可选优化”,而是安全与功能底线。
Revel 必须绑定 127.0.0.1,不能监听 0.0.0.0
Revel 默认启动时监听 0.0.0.0:9000,这会让它直接接收公网请求,绕过 Nginx 的 SSL 终止、限流、日志和会话保护。所有生产部署第一步就是堵死这个口。
- 改
conf/app.conf:设置http.addr = "127.0.0.1",并指定非特权端口,例如http.port = 8089 - 或启动时强制指定:
revel run -a myapp -p 8089 -c ./conf(-p仅改端口,不改地址;地址仍由app.conf控制) - 验证是否生效:
ss -tln | grep :8089输出里必须只出现127.0.0.1:8089,绝不能有*:8089
Nginx proxy_pass 末尾斜杠决定路径重写逻辑
Revel 路由是全路径匹配的(比如 /api/users),Nginx 的 proxy_pass 尾部是否有 /,直接决定请求路径怎么拼——错配会导致 404 或重复前缀。
- 正确写法(推荐):
proxy_pass http://127.0.0.1:8089/;(注意末尾/)
此时location /api/ { ... }会把/api/users转发为http://127.0.0.1:8089/api/users - 错误写法:
proxy_pass http://127.0.0.1:8089;(无尾部/)
同上 location 会转发为http://127.0.0.1:8089/api//users(多一个/),Revel 路由匹配失败 - 如果 Revel 已托管全部路由(含 SPA fallback),就用最简配置:
location / { proxy_pass http://127.0.0.1:8089/; }
WebSocket 连接断开?缺这三个 header 就必挂
Revel 若用 WebSocket(如实时日志、通知),Nginx 默认不透传升级协议头,连接会在 60 秒后静默关闭,前端表现为“反复重连”或“连接已关闭”。
- 必须在
location块中显式添加:proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade"; -
$http_upgrade是 Nginx 内置变量,不能写成字面量"Upgrade",否则无效 - 这几个指令顺序无关,但缺一不可;漏掉
Connection "upgrade"是最常见疏忽
静态资源别交给 Revel,Nginx 托管才对
Revel 的 public/ 目录(CSS/JS/images)由 Go HTTP 服务动态响应,既慢又占 goroutine。Nginx 静态服务性能高两个数量级,还能加缓存。
- 加独立
location块,例如:location ~ ^/(css|js|images|fonts|favicon.ico)/ {root /var/www/myapp;expires 1h;} -
root指向的是项目根目录(如/var/www/myapp),不是public子目录本身;否则/js/app.js会去找/var/www/myapp/js/app.js,而实际文件在/var/www/myapp/public/js/app.js - 不要在 Revel 层做 Gzip 压缩 —— Nginx 已压缩一次,Go 层再压可能损坏响应或增大体积
最易被忽略的一点:Revel 的会话加密、Flash 消息、重定向跳转都依赖原始请求中的 X-Forwarded-For 和协议头(X-Forwarded-Proto)。Nginx 配置里如果乱加一堆 proxy_set_header 覆盖了这些,Revel 就会误判客户端 IP 或 HTTPS 状态,导致登录失效、跳转回 HTTP 等诡异问题。保持最小化 header 透传,比堆参数更关键。











