核心:用 upstream {} 定义后端服务器集群,proxy_pass 转发到 upstream 组;Nginx 自带健康检查,后端宕机自动剔除,恢复后自动加回nginx。
模块:
ngx_http_upstream_module(开源版内置)
一、最简基础模板
http {
# 定义后端集群
upstream backend_server {
# 策略写在这里
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name lb.test.com;
location / {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
常用后端参数:
weight=5:权重max_fails=2:最大失败次数fail_timeout=10s:失败后隔离多久重试backup:备用机,只有其他全部挂了才启用down:标记永久下线
二、原生 5 种策略(开源版)
1. 轮询 round_robin(默认,不用写指令)
规则:请求按顺序轮流分发;故障自动剔除。 适合:后端机器性能接近、无会话绑定、无状态服务。
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
2. 加权轮询(weight)
规则:权重越大分到请求越多。适合机器配置不一致。
upstream backend {
server 127.0.0.1:8080 weight=3; # 3份流量
server 127.0.0.1:8081 weight=1; # 1份流量
}
3. least_conn 最少连接
指令:least_conn; 规则:新请求分给当前活跃连接数最少的后端。 适合:请求处理时长差异很大(上传、大查询、慢接口)。
upstream backend {
least_conn;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
4. ip_hash IP 哈希(会话保持)
指令:ip_hash; 规则:客户端 IP 做 hash,同一个 IP 永远打到同一台后端(后端宕机才切换),解决 session 粘滞问题nginx。
注意:Nginx 对 IPv4 只取前 3 段哈希;如果用户在 NAT 网关后(公司内网、手机运营商出口),大量用户会被分到同一台;扩容 / 减节点会大量重映射。
upstream backend {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
5. hash 通用哈希(一致性哈希 consistent)
指令:hash $key [consistent];,Nginx1.7.2 + 支持nginx
不加 consistent:普通 hash,增删节点大部分 key 会漂移
加
consistent:Ketama 一致性哈希,增删节点只有少量 key 迁移,缓存场景首选 典型:按 url 哈希(url_hash)、按 cookie 哈希、按参数哈希
# 按url一致性哈希,适合缓存服务
upstream backend {
hash $request_uri consistent;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
Nginx Plus 商业版额外支持:
least_time(最低响应时延)、random(二选一随机,power of two)
三、第三方模块策略(需要编译,面试常问)
fair(ngx_http_upstream_fair_module):按后端响应时间,响应快的优先分配,动态感知后端压力;开源 nginx 不带。
url_hash:老第三方模块,等价于上面
hash $request_uri consistent,现在原生 hash 已经替代它。
四、选型对比表
五、生产最佳实践提醒
尽量不要依赖 ip_hash 做会话保持,优先应用层 session 共享(Redis);
缓存集群一定用
hash $request_uri consistent;;加上健康检查参数
max_fails / fail_timeout;后端开启长连接:
keepalive 64;在 upstream 内,减少 tcp 握手开销;区分四层 stream 负载均衡(TCP/UDP)和七层 http 负载均衡,策略指令基本一致。
六、验证命令
nginx -t # 校验配置
nginx -s reload # 平滑加载本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢