Beego 项目应通过 Nginx 反向代理暴露公网,需正确配置 proxy_pass(带协议和尾部斜杠)、Host/X-Real-IP/X-Forwarded-Proto 头、静态资源由 Nginx 直出并设缓存与权限。

Beego 项目直接暴露 Go 自带的 HTTP 服务器到公网有风险,也不利于日志、限流、HTTPS 统一管理。用 Nginx 做反向代理是标准做法,但配置错一个字段就可能返回 502 Bad Gateway 或丢失客户端真实 IP。
proxy_pass 指向地址必须带尾部斜杠
Beego 默认监听 127.0.0.1:8080(或你自定义的端口),Nginx 的 proxy_pass 必须明确指定协议和端口,且结尾是否加 / 会影响路径重写行为:
- 写成
proxy_pass http://127.0.0.1:8080;:Nginx 会把原始请求路径(如/api/user)原样转发,Beego 能正常路由 - 写成
proxy_pass http://127.0.0.1:8080/;(带尾部/):Nginx 会剥离 location 前缀再拼接,适合做路径前缀代理(如location /v1/→proxy_pass http://.../) - 常见错误:漏写
http://,写成proxy_pass 127.0.0.1:8080;,Nginx 启动直接报错invalid URL prefix
必须设置 Host 和 X-Real-IP 头才能获取真实客户端信息
Beego 的 ctx.Input.IP() 和 ctx.Request.Host 默认读的是 Nginx 转发过来的连接信息,不设头就只能拿到 127.0.0.1 和 localhost:
-
proxy_set_header Host $host;:让 Beego 知道原始请求域名,对生成绝对 URL(如邮件链接、微信回调地址)至关重要 -
proxy_set_header X-Real-IP $remote_addr;:Beego 可通过ctx.Input.IP()获取真实 IP(需确保EnableXSRF关闭或信任该头) -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:兼容多层代理场景,但 Beego 默认不自动解析此头,如需深度透传要自己写中间件解析
HTTPS 场景下务必补全 X-Forwarded-Proto 头
如果你用 Let's Encrypt 或腾讯云证书配了 HTTPS,但 Beego 里 ctx.Input.IsHttps() 仍返回 false,大概率是漏了这个头:
-
proxy_set_header X-Forwarded-Proto $scheme;是关键,它告诉 Beego 当前请求是https还是http - Beego 的
AppConfig中若设置了EnableAdmin = true,后台管理页的跳转链接也会依赖这个头生成正确协议 - 没设时,所有重定向(如登录后跳转)都可能变成
http://,触发浏览器混合内容警告
静态资源别让 Beego 处理,交给 Nginx 直出
Beego 的 StaticDir 虽然能 serve 静态文件,但在生产环境效率低、不支持压缩、无法利用浏览器缓存策略:
- 在 Nginx 配置中显式拦截静态路径,例如:
location ~ ^/(static|assets|css|js|images)/ - 用
root /path/to/your/beego/app/static;直接由 Nginx 提供,比 Go 进程处理快 3–5 倍 - 记得加缓存头:
expires 1y;+add_header Cache-Control "public, immutable";,避免重复请求 - Beego 应该关掉静态服务:在
app.conf中设StaticDir = ""或注释掉相关配置
最容易被忽略的是 X-Forwarded-Proto 和静态资源路径的 root 路径权限——Nginx worker 进程用户(通常是 www-data 或 nginx)必须对静态目录有读取权限,否则返回 403 Forbidden,而错误日志里往往只写“directory index of ... is forbidden”,不会提示缺权限。


















