| 2025-03-16
Nginx 作为一款高性能的 HTTP 和反向代理服务器,在负载均衡领域应用广泛。其具备多种负载均衡算法,可根据不同业务场景和后端服务器状况,合理分配客户端请求,提升系统的可用性、可靠性与并发性能。
轮询是 Nginx 的默认负载均衡策略。该算法按请求顺序,依次将流量分配到后端服务器列表中的每一台服务器。例如,后端有三台服务器 A、B、C,当客户端发起第一个请求时,Nginx 将请求分配给服务器 A;第二个请求分配给服务器 B;第三个请求分配给服务器 C;第四个请求又重新分配给服务器 A,依此类推。这种方式实现简单,能均匀使用所有后端服务器,适用于后端服务器性能相近的场景。在配置文件中,只需简单定义后端服务器列表,Nginx 就会默认采用轮询算法进行负载均衡,如:
http {
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
加权轮询是在轮询基础上增加权重(weight)概念。不同后端服务器性能存在差异,通过设置权重,让性能更强的服务器处理更多请求。权重值越高,接收的请求数量越多。例如,后端有三台服务器,服务器 A 权重设为 3,服务器 B 权重设为 1,服务器 C 权重设为 2。在分配请求时,服务器 A 会在每 6 次请求中大约接收 3 次,服务器 B 接收 1 次,服务器 C 接收 2 次。在 Nginx 配置文件中,可如下设置权重:
http {
upstream backend {
server 192.168.1.101 weight=3;
server 192.168.1.102 weight=1;
server 192.168.1.103 weight=2;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
此算法适用于后端服务器性能不均的场景,可通过调整权重实现负载优化。
IP 哈希算法根据客户端 IP 地址计算哈希值,依据哈希值将请求分配到后端服务器。这能确保来自同一 IP 地址的请求始终被分配到同一台服务器,实现会话保持。比如,某用户在服务器 A 上进行了登录操作并生成会话,后续该用户的请求若始终由服务器 A 处理,就能保证会话的连续性,避免出现登录状态丢失等问题。在 Nginx 配置文件中,启用 IP 哈希算法的配置如下:
http {
upstream backend {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
不过,该算法存在一个问题,当后端服务器列表变更(如添加或移除服务器)时,哈希结果可能改变,导致同一 IP 地址的请求被分配到不同服务器,影响会话连续性。
最少连接数算法将请求分配给当前处理连接数最少的服务器。在某些长时间保持连接的场景中,如视频流服务、WebSocket 应用等,不同客户端与服务器建立的连接时长不同,采用最少连接数算法,可使新请求优先分配到负载较轻(连接数少)的服务器上,避免部分服务器连接数过多而负载过高,保证整体服务的高效运行。在 Nginx 配置文件中,配置最少连接数算法如下:
http {
upstream backend {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
这种算法能更合理地分配负载,提升系统性能。
1、 Nginx 负载均衡动态调整:借助 Nginx Plus 或第三方模块,可根据服务器实时负载、响应时间等动态调整负载均衡算法参数,实现更精准的负载分配。
2、 Nginx 负载均衡健康检查:通过配置健康检查机制,Nginx 可定期检测后端服务器状态,将故障服务器从负载均衡池中移除,保障服务可用性。
3、 Nginx 负载均衡会话粘性:除 IP 哈希实现会话粘性外,还可通过基于 cookie 的方式实现,在负载均衡配置中设置相关 cookie 参数,确保特定会话请求始终被转发到同一后端服务器。