# 轮询(默认)
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# 加权轮询
upstream backend {
server 192.168.1.10:8080 weight=3;
server 192.168.1.11:8080 weight=2;
server 192.168.1.12:8080 weight=1;
}
# IP哈希
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# 最少连接
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# URI哈希
upstream backend {
hash $request_uri consistent;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# fair(需安装第三方模块)
upstream backend {
fair;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
# url_hash(需安装hash包)
upstream backend {
hash $request_uri;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
三、服务器状态参数表
状态参数
作用
默认值
配置示例
说明
down
标记服务器永久下线
–
server 192.168.1.10:8080 down;
手动维护时使用,不参与负载均衡
backup
标记为备用服务器
–
server 192.168.1.10:8080 backup;
其他服务器都故障时才启用
weight
设置服务器权重
1
server 192.168.1.10:8080 weight=5;
值越大,分配请求越多
max_fails
允许的最大失败次数
1
server 192.168.1.10:8080 max_fails=3;
连续失败多少次后认为宕机
fail_timeout
失败后的暂停时间
10s
server 192.168.1.10:8080 fail_timeout=30s;
在fail_timeout内失败max_fails次,标记为宕机
四、状态参数配置示例
upstream backend {
# 主服务器组
server 192.168.1.10:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 weight=3 max_fails=3 fail_timeout=30s;
# 备用服务器(当主服务器都宕机时启用)
server 192.168.1.13:8080 backup;
# 临时下线的服务器(维护中)
server 192.168.1.14:8080 down;
}
五、算法与参数的兼容性表
算法
支持 weight
支持 backup
支持 down
支持 max_fails
支持 fail_timeout
说明
轮询
✅
✅
✅
✅
✅
所有参数都支持
加权轮询
✅
✅
✅
✅
✅
weight是核心参数
最少连接
✅
✅
✅
✅
✅
所有参数都支持
IP哈希
❌
❌
✅
✅
✅
不能设置weight和backup
URI哈希
❌
❌
✅
✅
✅
不能设置weight和backup
参数哈希
❌
❌
✅
✅
✅
不能设置weight和backup
fair
✅
✅
✅
✅
✅
需第三方模块
url_hash
❌
❌
✅
✅
✅
需安装hash包
六、常见问题及解决方案
问题
原因
解决方案
ip_hash 时某个服务器压力过大
某些IP段的客户端特别多
使用一致性哈希(hash $remote_addr consistent)
后端服务器响应慢但仍在服务
健康检查只检查端口,不检查响应时间
使用第三方模块如nginx_upstream_check_module
session丢失
轮询导致请求到不同服务器
改用ip_hash或使用集中式session存储(Redis)
备份服务器从未使用
主服务器一直正常
正常现象,backup就是备用的
max_fails设置太小
网络波动导致误判
适当调大max_fails和fail_timeout
七、完整配置示例
upstream backend {
# 调度算法:IP哈希(解决session问题)
ip_hash;
# 主服务器
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
# 注意:ip_hash 下不能使用 weight 和 backup
}
upstream api_backend {
# 最少连接(适合API服务)
least_conn;
# 加权轮询
server 192.168.1.20:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.21:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.22:8080 weight=3 max_fails=3 fail_timeout=30s;
# 备用
server 192.168.1.23:8080 backup;
}
upstream static_backend {
# URI哈希(提高缓存命中率)
hash $request_uri consistent;
server 192.168.1.30:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.31:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.32:8080 max_fails=3 fail_timeout=30s;
}
发表回复