Nginx负载均衡会话保持配置指南

目录

[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. 验证方法(确认是否固定到同一台)

  1. 在两台 Nginx 节点的日志里(比如 /var/log/nginx/access.log),添加客户端 IP 和服务器 IP 的记录;
  2. 用同一个客户端(比如浏览器)多次访问 VIP(192.168.1.100);
  3. 查看日志:如果所有请求都出现在同一台 Nginx 的日志里,说明会话保持生效;如果分散在两台,说明没生效。

总结

  1. Keepalived ≠ 负载均衡 ≠ 会话保持:Keepalived 只负责高可用(VIP 漂移),真正的负载分发和会话保持由 LVS/HAProxy 实现;
  2. 默认不粘节点:仅开启 Keepalive(连接复用),请求仍会被负载均衡到不同 Nginx 节点;
  3. 粘节点需配置 :LVS 加 persistence_timeout、HAProxy 加 cookie 即可实现会话保持,固定到同一台 Nginx。
相关推荐
ping某6 小时前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉2 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦2 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj2 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes