beego自身无内置负载均衡,必须依赖nginx反向代理实现;需启动多个监听不同端口的beego实例(如8889、8890),在nginx中通过upstream定义后端池并配置proxy_pass转发,配合weight、健康检查及正确header传递,方为稳定生产方案。

Beego 本身不内置负载均衡能力,必须靠 Nginx 做反向代理层来实现;直接让多个 Beego 实例监听不同端口,再由 Nginx 的 upstream 统一分发请求,这是唯一稳定、可控的生产方案。
启动多个 Beego 实例时端口不能冲突
Beego 默认启动在 8080,但负载均衡要求至少两个独立进程。必须显式指定不同监听端口,例如:
- 实例 A:
bee run -port=8889(或修改conf/app.conf中的httpport = 8889) - 实例 B:
bee run -port=8890 - 确保两个实例都能单独
curl http://127.0.0.1:8889/health返回 200 - 别用
bee run上线——它只是开发命令;上线要用./myapp(编译后二进制)+ systemd 或 supervisor 管理进程
nginx.conf 里必须用 upstream 定义后端池
不能把 proxy_pass 写死成单个地址,否则就不是负载均衡。正确写法是在 http 块内定义 upstream,再在 server 中引用:
http {
upstream beego_backend {
server 127.0.0.1:8889 weight=3;
server 127.0.0.1:8890 weight=2;
# 可加 backup:server 127.0.0.1:8891 backup;
}
<pre class="brush:php;toolbar:false;">server {
listen 80;
server_name example.com;
location / {
proxy_pass http://beego_backend;
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;
}
}}
-
weight不是必须,但建议设——避免新机器性能强却分不到流量 - 别漏掉
proxy_set_header X-Forwarded-For,否则 Beego 的ctx.Input.IP()拿到的是127.0.0.1 -
proxy_pass后面的 URL 末尾有无/影响路径重写逻辑,统一不加更安全
健康检查不能只靠轮询,要主动探测
Nginx 默认只做被动健康检查(连接失败才剔除),对 Beego 这类 Go HTTP 服务容易误判。建议加主动探测:
- 先确认你的 Nginx 编译时启用了
nginx_upstream_check_module(Ubuntu/Debian 默认没开,需重编译或换 OpenResty) - 配置示例(放在
upstream块内):check interval=3 rise=2 fall=3 timeout=1; check_http_send "HEAD /health HTTP/1.0\r\n\r\n"; check_http_expect_alive http_2xx;
- Beego 侧需暴露
/health接口,返回 200 即可,无需复杂逻辑 - 没模块?至少加
max_fails=2 fail_timeout=30s到每个server行,降低误剔风险
HTTPS 和静态资源要分开处理
Beego 能 serve 静态文件,但不推荐——Nginx 做这事更快更稳。同时 HTTPS 终止必须在 Nginx 层完成:
- SSL 证书放 Nginx,
listen 443 ssl,ssl_certificate和ssl_certificate_key指向 PEM 文件 - Beego 应用仍走 HTTP(
proxy_pass http://beego_backend),别让它自己处理 TLS - 前端静态资源(如
/static/)用location /static/直接由 Nginx serve,别转发给 Beego - 微信小程序等强制 HTTPS 场景下,Beego 的
AppUrl配置必须是https://example.com,否则生成的跳转链接仍是 http
真正难的不是配通,而是让每个 Beego 实例状态一致——session 共享、定时任务去重、数据库连接池隔离,这些不在 Nginx 范围内,得靠应用层设计补足。











