upstream 与负载均衡算法
约 544 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Nginx › 负载均衡(在新窗口打开) › upstream 与负载均衡算法
upstream 基础
upstream 定义一组后端服务器,proxy_pass 将请求转发给它:
http {
upstream backend {
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend;
}
}
}server 指令参数
upstream backend {
# 权重(默认为 1)
server 10.0.0.1:3000 weight=5;
server 10.0.0.2:3000 weight=1;
# 最大失败次数和超时
server 10.0.0.3:3000 max_fails=3 fail_timeout=30s;
# 备用服务器(其他服务器都不可用时才启用)
server 10.0.0.4:3000 backup;
# 标记为已下线(不参与负载均衡)
server 10.0.0.5:3000 down;
# 连接池等高级选项
keepalive 32;
}负载均衡算法
# 默认:轮询
upstream backend {
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}
# 最少连接
upstream backend {
least_conn;
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}
# IP 哈希(会话保持)
upstream backend {
ip_hash;
server 10.0.0.1:3000;
server 10.0.0.2:3000;
}
# 通用哈希(基于自定义 key)
upstream backend {
hash $request_uri consistent;
server 10.0.0.1:3000;
server 10.0.0.2:3000;
}
# 随机
upstream backend {
random two least_conn;
server 10.0.0.1:3000;
server 10.0.0.2:3000;
server 10.0.0.3:3000;
}算法对比
| 算法 | 说明 | 适用场景 |
|---|---|---|
| 轮询(默认) | 按顺序轮流分发 | 通用场景,后端性能均衡 |
least_conn | 优先发给连接数最少的后端 | 后端请求处理时长差异大 |
ip_hash | 相同 IP 始终转发到同一后端 | 需要 Session 保持且无共享存储 |
hash key consistent | 基于 key 的一致性哈希 | 缓存服务、URL 路由 |
random | 随机选择,可选 two least_conn | 大集群,随机分散 |
完整示例
http {
upstream api_servers {
least_conn;
server api1.example.com:3000 weight=3;
server api2.example.com:3000 weight=2;
server api3.example.com:3000 max_fails=3 fail_timeout=30s;
keepalive 64;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_servers;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}小结
upstream定义后端服务器组,server指令添加成员,支持weight、backup、max_fails等参数。- 负载均衡算法:轮询(默认)、
least_conn、ip_hash、hash、random。 ip_hash可用于无共享 Session 时的会话保持。keepalive维持后端长连接,减少 TCP 握手开销。proxy_next_upstream控制失败时的重试策略。
