目录
[1. 先明确整体架构](#1. 先明确整体架构)
[2. 核心结论(针对你的架构)](#2. 核心结论(针对你的架构))
[3. 如何让请求固定到同一台 Nginx 节点?](#3. 如何让请求固定到同一台 Nginx 节点?)
[方式 1:LVS + Keepalived(最常用的四层负载)](#方式 1:LVS + Keepalived(最常用的四层负载))
[方式 2:HAProxy + Keepalived(七层负载,更灵活)](#方式 2:HAProxy + Keepalived(七层负载,更灵活))
[4. 验证方法(确认是否固定到同一台)](#4. 验证方法(确认是否固定到同一台))
结合你补充的 "nginx 前面添加了一个 keepalive 负载均衡" 这个场景,我先把逻辑理清楚,再给你可落地的配置和验证方法:
1. 先明确整体架构
你现在的架构应该是:客户端 → Keepalived+负载均衡器(比如LVS/HAProxy/Nginx) → Nginx集群 → 后端业务服务器
这里要先纠正一个关键认知:Keepalived 本身不是负载均衡器 ------ 它的核心是「高可用(VIP 漂移)」,通常和 LVS/HAProxy/Nginx 配合使用:
- Keepalived:负责监控负载均衡器的存活,挂了就把 VIP 切到备用节点,保证入口不宕机;
- 真正做「请求分发」的是 LVS/HAProxy/Nginx(我们统称「前端负载均衡器」);
- 你说的「keepalive」,大概率是指前端负载均衡器开启了 TCP/HTTP Keepalive 连接复用。
2. 核心结论(针对你的架构)
即使前端负载均衡器开启了 Keepalive,默认情况下,同一个客户端的多次请求仍然可能被分发到不同的 Nginx 节点 ------ 原因和之前一致:Keepalive 只是「复用连接」,解决的是 "频繁建连 / 断连的性能问题",但不负责 "把请求固定到同一台服务器"。
3. 如何让请求固定到同一台 Nginx 节点?
需要在前端负载均衡器上配置「会话保持(Sticky Session)」,以下是两种最常见的实现方式:
方式 1:LVS + Keepalived(最常用的四层负载)
LVS 本身支持会话保持,修改 Keepalived 配置文件(通常 /etc/keepalived/keepalived.conf):
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 # VIP,客户端访问的IP
}
}
# 配置LVS + 会话保持
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo wrr # 负载算法(加权轮询)
lb_kind DR # LVS DR模式(常用)
persistence_timeout 600 # 会话保持超时时间(秒),同一IP 10分钟内固定到同一台Nginx
protocol TCP
# 后端Nginx节点
real_server 192.168.1.11 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.1.12 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
关键配置:persistence_timeout 600 ------ 开启基于客户端 IP 的会话保持,超时时间可根据业务调整。
方式 2:HAProxy + Keepalived(七层负载,更灵活)
如果前端是 HAProxy + Keepalived,修改 HAProxy 配置(/etc/haproxy/haproxy.cfg):
frontend http_front
bind *:80
bind 192.168.1.100:80 # VIP
mode http
default_backend nginx_backend
backend nginx_backend
mode http
balance roundrobin # 负载算法
cookie SRV_ID insert indirect nocache # 插入cookie做会话保持
server nginx1 192.168.1.11:80 check cookie nginx1 # 绑定cookie到节点
server nginx2 192.168.1.12:80 check cookie nginx2
关键配置:cookie SRV_ID insert ------ 基于 Cookie 的会话保持,同一客户端会被固定到分配的 Nginx 节点。
4. 验证方法(确认是否固定到同一台)
- 在两台 Nginx 节点的日志里(比如
/var/log/nginx/access.log),添加客户端 IP 和服务器 IP 的记录; - 用同一个客户端(比如浏览器)多次访问 VIP(192.168.1.100);
- 查看日志:如果所有请求都出现在同一台 Nginx 的日志里,说明会话保持生效;如果分散在两台,说明没生效。
总结
- Keepalived ≠ 负载均衡 ≠ 会话保持:Keepalived 只负责高可用(VIP 漂移),真正的负载分发和会话保持由 LVS/HAProxy 实现;
- 默认不粘节点:仅开启 Keepalive(连接复用),请求仍会被负载均衡到不同 Nginx 节点;
- 粘节点需配置 :LVS 加
persistence_timeout、HAProxy 加cookie即可实现会话保持,固定到同一台 Nginx。