Nginx负载均衡会话保持配置指南
目录1. 先明确整体架构2. 核心结论针对你的架构3. 如何让请求固定到同一台 Nginx 节点方式 1LVS Keepalived最常用的四层负载方式 2HAProxy Keepalived七层负载更灵活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」以下是两种最常见的实现方式方式 1LVS Keepalived最常用的四层负载LVS 本身支持会话保持修改 Keepalived 配置文件通常/etc/keepalived/keepalived.confvrrp_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 的会话保持超时时间可根据业务调整。方式 2HAProxy Keepalived七层负载更灵活如果前端是 HAProxy Keepalived修改 HAProxy 配置/etc/haproxy/haproxy.cfgfrontend 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 的记录用同一个客户端比如浏览器多次访问 VIP192.168.1.100查看日志如果所有请求都出现在同一台 Nginx 的日志里说明会话保持生效如果分散在两台说明没生效。总结Keepalived ≠ 负载均衡 ≠ 会话保持Keepalived 只负责高可用VIP 漂移真正的负载分发和会话保持由 LVS/HAProxy 实现默认不粘节点仅开启 Keepalive连接复用请求仍会被负载均衡到不同 Nginx 节点粘节点需配置LVS 加persistence_timeout、HAProxy 加cookie即可实现会话保持固定到同一台 Nginx。