一、前言
Nginx作为高性能的HTTP和反向代理服务器,其负载均衡功能可将客户端请求合理分发至后端多台服务器,有效分担单台服务器压力,提升系统可用性与并发处理能力。Nginx内置多种负载均衡算法,可根据业务场景(如会话保持、服务器性能差异、响应速度优先等)灵活选择。本文先厘清代理与反向代理基础概念,再逐一详解常用算法的配置、原理及适用场景。
二、负载均衡基础:代理与反向代理
Nginx负载均衡基于反向代理实现,需先明确代理、正向代理与反向代理的核心区别:
2.1 代理(Proxy)
客户端通过代理服务器发送请求,代理服务器转发请求至目标服务器,再将目标服务器的响应返回给客户端。本质是中间媒介,实现请求/响应的中转。
2.2 正向代理
核心作用:隐藏客户端身份,代理服务器代替客户端向目标服务器发起请求。
特点:客户端主动配置代理,感知代理服务器存在,但目标服务器仅识别代理IP,无法知晓真实客户端IP。
典型场景:突破网络限制(如访问外网资源)、客户端身份隐藏。
2.3 反向代理
核心作用:隐藏后端目标服务器集群,客户端以为直接请求代理服务器,代理服务器根据配置转发至后端服务器。
特点:客户端不感知后端服务器,仅与代理服务器交互;反向代理是负载均衡的核心基础,可实现负载分发、安全防护(隐藏后端IP)、SSL终结等。
典型场景:服务器集群负载均衡、后端服务隔离。
三、Nginx常用负载均衡算法配置
Nginx负载均衡通过 upstream 模块定义后端服务器集群,在 server 块中通过 proxy_pass 指向该集群实现请求转发。以下是7种常用算法的详细配置与说明:
3.1 轮询算法(Round Robin,默认)
原理:将客户端请求按顺序轮流分发至后端服务器,默认算法,无需额外配置。
适用场景:后端所有服务器性能均等、无会话保持需求(如静态资源服务、API接口服务)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| upstream myserver { server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
server { listen 80; server_name myapp.com; location / { proxy_pass http://myserver; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
|
3.2 IP哈希算法(IP Hash)
原理:根据客户端IP地址进行哈希计算,将同一IP的所有请求固定分发至同一台后端服务器。
适用场景:需会话保持(如用户登录状态),避免同一用户请求被分发至不同服务器导致会话失效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| upstream myserver { ip_hash; server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
server { listen 80; server_name myapp.com; location / { proxy_pass http://myserver; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
|
3.3 最小连接数算法(Least Connections)
原理:实时统计后端各服务器的活跃连接数,将新请求分发至连接数最少的服务器。
适用场景:后端服务器性能不均、请求处理时间差异较大(如动态业务,部分请求耗时较长)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| upstream myserver { least_conn; server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
server { listen 80; server_name myapp.com; location / { proxy_pass http://myserver; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
|
3.4 加权轮询算法(Weighted Round Robin)
原理:为后端服务器配置权重(weight),权重值越高,分配到的请求越多(权重默认值为1)。
适用场景:后端服务器性能差异明显(如高性能服务器承担更多请求)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| upstream myserver { server 192.168.1.100:8080 weight=3; server 192.168.1.101:8080 weight=2; server 192.168.1.102:8080 weight=1; }
server { listen 80; server_name myapp.com; location / { proxy_pass http://myserver; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
|
3.5 随机算法(Random)
原理:将新请求随机分发至后端任意一台服务器(Nginx 1.15.7+版本支持)。
适用场景:后端服务器性能均等,希望请求均匀分布,无特殊需求。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| http { upstream backend { random; server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }
|
3.6 公平算法(Fair,按响应时间分配)
原理:根据后端服务器的响应时间动态分配请求,响应时间越短(处理速度越快)的服务器,分配到的请求越多。
注意:需额外安装 ngx_http_upstream_fair_module 模块(Nginx默认不集成)。
适用场景:对响应速度敏感的业务(如电商订单、用户交互类接口)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| http { upstream backend { fair; server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }
|
3.7 粘性算法(Sticky,基于Cookie的粘性会话)
原理:通过Cookie标记客户端,将同一客户端的所有请求固定分发至首次处理该请求的后端服务器,实现会话粘性。
注意:需安装 ngx_http_upstream_sticky_module 模块(Nginx默认不集成);也可通过proxy_cookie_path 自定义Cookie实现类似效果。
适用场景:强会话依赖的业务(如后台管理系统、需持续登录的应用)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| http { upstream backend { sticky cookie srv_id expires=1h domain=.example.com path=/; server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080; }
server { listen 80; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }
|
四、算法组合使用(示例:加权最小连接数)
Nginx支持多种算法组合,满足更复杂的业务需求。例如“加权最小连接数算法”,结合最小连接数(优先分发至连接少的服务器)与权重(性能好的服务器权重更高),适配后端服务器性能不均且请求耗时差异大的场景。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| upstream myserver { least_conn; server 192.168.1.100:8080 weight=3; server 192.168.1.101:8080 weight=2; server 192.168.1.102:8080 weight=1; }
server { listen 80; server_name myapp.com; location / { proxy_pass http://myserver; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
|
五、参考文档