Revel 应用必须绑定 127.0.0.1 启动并由 Nginx 反向代理接管公网流量,配置需明确 http.addr = "127.0.0.1"、proxy_pass 带尾部 /、透传 WebSocket 头、静态资源由 Nginx 直接服务,并预先定义 upstream 块。

Revel 应用必须绑定 127.0.0.1 启动,Nginx 反向代理才能安全接管公网流量;否则直接暴露端口会绕过所有 Nginx 安全控制和日志审计。
确认 Revel 启动参数与监听地址
Revel 默认可能监听 0.0.0.0:8089,这在生产环境是危险的。你得强制它只接受本地回环请求:
- 检查
conf/app.conf中必须明确设置:http.port = 8089和http.addr = "127.0.0.1" - 启动命令推荐用编译后二进制:
./your-app-name run -p 8089 -c /path/to/conf,不加-d或-r参数(开发模式参数不应出现在生产) - 启动后验证:
netstat -tuln | grep :8089输出应为127.0.0.1:8089,而非*:8089
proxy_pass 路径末尾斜杠决定重写行为
proxy_pass 的结尾是否有 /,直接影响 URL 路径传递——这是最常导致 404 或静态资源加载失败的点:
- 若配置
location / { proxy_pass http://127.0.0.1:8089/; }:Nginx 会剥离/再拼接,例如请求/api/users→ 转发为http://127.0.0.1:8089/api/users - 若配置
location / { proxy_pass http://127.0.0.1:8089; }(无尾部/):整个原始 URI 原样转发,/api/users→http://127.0.0.1:8089/api/users,表面一样,但某些框架路由匹配逻辑会因 Host 头缺失而异常 - Revel 推荐统一用带尾部
/的写法,并确保proxy_set_header Host $host已启用,避免路由误判
WebSocket 支持必须显式透传 Upgrade 头
Revel 若含实时功能(如通知、在线状态),默认 Nginx 会 60 秒断连——因为没透传 WebSocket 升级协议头:
- 必须在
location /块中添加三行: proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";- 漏掉任意一行,浏览器控制台会出现
WebSocket connection to 'wss://...' failed,且 Nginx 错误日志里有upstream sent no valid HTTP/1.0 header类提示
静态资源不要全扔给 Revel 处理
Revel 的 public/ 目录本就适合由 Nginx 直接服务,省去 Go 进程解析和文件 IO 开销:
- 添加独立
location块,路径需精确匹配(正则开头用^/): location ~ ^/(css|js|images|fonts|favicon.ico)/ { root /path/to/your-app/public; expires 1h; add_header Cache-Control "public, immutable"; }-
root路径指向的是目录父级,不是public本身;比如应用根目录是/opt/myrevel,那public在/opt/myrevel/public,此处root就填/opt/myrevel - 别用
alias替代root,容易因末尾斜杠引发 403 ——alias要求路径严格对齐,root更容错
最容易被忽略的是 upstream 块的缺失:单实例时看似可省,但一旦未来要扩成集群或加健康检查,硬编码在 proxy_pass 里的地址会让配置维护成本陡增。哪怕现在只有一台后端,也建议提前定义 upstream revel_backend { server 127.0.0.1:8089; },把 proxy_pass 指向它。


















