RHEL9.3 HAProxy 高级功能配置实战(Cookie 会话保持、状态监控页、四层 / 七层真实 IP 透传)

发布时间:2026/7/2 2:01:56
RHEL9.3 HAProxy 高级功能配置实战(Cookie 会话保持、状态监控页、四层 / 七层真实 IP 透传) 前言前面章节我们完成了 HAProxy 基础安装、socat 热运维、负载均衡调度算法配置本章聚焦生产环境高频必备三大高级功能Cookie 基于 Cookie 精准会话保持粒度优于源 IP 哈希解决会话粘滞需求Web 状态监控页面可视化查看集群运行、节点健康、流量连接统计四层 / 七层真实客户端 IP 透传后端 Web 服务器获取真实访客 IP用于日志统计、安全风控、访问分析实验环境沿用前文架构HAProxy 调度器eth0172.25.254.100eth1192.168.0.100RS1192.168.0.10RS2192.168.0.20客户端测试机172.25.254.99一、基于 Cookie 的会话保持七层 HTTP 专用1.1 原理说明cookie会话黏性是 HAProxy 七层模式专属会话保持方案粒度比source源IP哈希更精准 HAProxy 给不同后端服务器分配唯一 Cookie 标识首次访问插入 Set-Cookie后续客户端携带 Cookie 访问时直接固定调度至对应后端节点。限制仅支持mode http七层模式TCP 四层模式无法使用对比源 IP 哈希会存在局域网多用户同 IP 绑定同一节点弊端Cookie 基于浏览器标识用户粒度隔离更精细现状大规模集群更多采用后端Session共享替代会话保持但小集群、老旧业务仍广泛使用 Cookie 黏滞1.2 cookie 完整配置参数解析cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [ preserve ][ httponly ] [ secure ][ domain ]* [ maxidle idle ][ maxlife ]参数作用解释nameCookie 键名自定义名称用于识别会话insert客户端首次访问时自动向响应头插入 Set-Cookie 写入节点标识indirect客户端已有 Cookie 时HAProxy 不再重复下发 Set-Cookie减少头部冗余nocache防止 CDN、反向代理缓存 Cookie避免大量客户端被固定分发同一后端rewrite/prefix重写 Cookie / 前缀式 Cookie两种进阶模式insert 最常用httponly/secure安全属性防止 JS 窃取 Cookie、仅 HTTPS 传输1.3 完整配置示例修改 HAProxy 配置/etc/haproxy/haproxy.cfg新增 cookie 会话保持listen webserver-cluster-80 bind 172.25.254.100:80 balance roundrobin mode http option forwardfor # 定义Cookie配置键名WEBCOOKIE插入模式、防缓存、已有cookie不再重复下发 cookie WEBCOOKIE insert nocache indirect # 给两台后端分别设置唯一cookie标识 web1 / web2 server webserver1 192.168.0.10:80 cookie web1 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 cookie web2 check inter 3s fall 3 rise 5 weight 1校验配置语法并重启生效haproxy -c -f /etc/haproxy/haproxy.cfg systemctl restart haproxy1.4 效果验证1. 首次访问自动下发 Set-Cookie[rootclient ~]# curl -i 172.25.254.100 HTTP/1.1 200 OK date: Mon, 16 Mar 2026 11:15:37 GMT server: Apache/2.4.57 (Red Hat Enterprise Linux) last-modified: Thu, 29 Jan 2026 03:27:51 GMT etag: 18-6497e710faf2b accept-ranges: bytes content-length: 24 content-type: text/html; charsetUTF-8 set-cookie: WEBCOOKIEweb1; path/ cache-control: private webserver1-192.168.0.10响应头自动携带Set-Cookie: WEBCOOKIEweb1代表本次绑定 webserver1 节点。2. 携带 Cookie 固定访问对应后端# 携带web2标识永远访问RS2 [rootclient ~]# curl -b WEBCOOKIEweb2 172.25.254.100 Webserver2-192.168.0.20 [rootclient ~]# curl -b WEBCOOKIEweb2 172.25.254.100 Webserver2-192.168.0.20 # 携带web1标识永远访问RS1 [rootclient ~]# curl -b WEBCOOKIEweb1 172.25.254.100 webserver1-192.168.0.10 [rootclient ~]# curl -b WEBCOOKIEweb1 172.25.254.100 webserver1-192.168.0.10会话黏滞生效同一个 Cookie 请求始终调度至绑定服务器。二、HAProxy Web 状态监控页面运维可视化必备2.1 功能介绍HAProxy 内置 Web 可视化状态页无需额外部署监控组件浏览器即可访问查看进程运行时长、CPU / 连接上限、当前并发连接、吞吐速率后端节点健康状态UP/DOWN/ 维护下线 / 故障检测中总会话量、每秒会话速率、流量进出、错误统计、拒绝请求统计支持账号密码登录鉴权支持在线手动上下线后端节点管理权限2.2 状态页核心配置参数配置指令功能说明stats enable开启状态页面总开关stats uri /status自定义访问路径默认访问地址/haproxy?statsstats hide-version隐藏 HAProxy 版本号规避安全扫描漏洞暴露stats refresh 5s页面自动刷新间隔 5 秒默认关闭自动刷新stats auth user:pass登录账号密码可多行配置多组管理员账号stats admin if TRUE开启页面管理权限支持页面上下线后端服务器2.3 独立状态页配置推荐配置在配置文件末尾新增独立listen段单独监听 8888 端口做监控入口不与业务端口混杂listen stats mode http bind 0.0.0.0:8888 stats enable log global stats uri /status stats hide-version stats refresh 5s stats auth dragon:dragon stats admin if TRUE重载配置并放行防火墙端口haproxy -c -f /etc/haproxy/haproxy.cfg systemctl restart haproxy # 放行8888端口 firewall-cmd --add-port8888/tcp --permanent firewall-cmd --reload2.4 浏览器访问方式访问地址http://172.25.254.100:8888/status弹窗输入账号dragon密码dragon即可进入监控面板。2.5 页面关键字段释义全局运行信息pid 27134 (process #1, nbproc 1, nbthread 1) uptime 0d 0h00m04s system limits: memmax unlimited; ulimit-n 200029 maxsock 200029; maxconn 100000; maxpipes 0 current conns 2; conn rate 2/secpid进程 ID、进程 / 线程数量uptime服务运行时长current conns当前活跃总连接数后端节点状态分类状态标识含义active UP节点健康在线正常承接流量active DOWN, going up故障节点检测恢复中active or backup DOWN节点健康检查失败已下线MAINT管理员手动维护下线SOFT STOPPED权重置 0 软下线不再接收新连接流量与会话统计sessions cur/max/total当前会话、峰值会话、总请求量In/Out Bytes入站、出站总流量Errors Req/Conn/Resp请求错误、连接错误、响应错误统计三、四层 TCP 七层 HTTP 真实客户端 IP 透传业务背景HAProxy 作为反向代理后端 Web 服务器默认只能获取 HAProxy 内网 IP无法拿到真实访客 IP无法完成访问日志统计、IP 黑名单拦截、地域分析、风控限流等业务。 HAProxy 提供两套方案实现 IP 透传七层 HTTP 模式X-Forwarded-For 请求头透传最常用四层 TCP 模式Proxy Protocol 代理协议透传3.1 四层 TCP 模式Proxy Protocolsend-proxyIP 透传1、HAProxy 四层配置mode tcp场景后端服务器开启proxy_protocol协议接收原始客户端 IPlisten webserver-cluster-80 bind 172.25.254.100:80 balance roundrobin mode tcp # send-proxy 开启代理协议向前端传递原始五元组信息 server webserver1 192.168.0.10:80 send-proxy check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 send-proxy check inter 3s fall 3 rise 5 weight 1校验重启服务haproxy -c -f /etc/haproxy/haproxy.cfg systemctl restart haproxy2、后端 Nginx 配置接收 Proxy ProtocolRS2192.168.0.20开启代理协议监听日志打印真实 IPhttp { log_format main $remote_addr - $remote_user [$time_local] $request $proxy_protocol_addr $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; server { listen 80 proxy_protocol; listen [::]:80 proxy_protocol; server_name _; root /usr/share/nginx/html; } }重载 Nginxsystemctl reload nginxRS1192.168.0.10不开启 Proxy Protocol 作为对比默认日志只能看到 HAProxy 内网地址http { log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; }3、访问测试 日志对比客户端批量访问[rootclient ~]# for i in {1..10};do curl 172.25.254.100;doneRS1 日志未开启 Proxy Protocol192.168.0.100 - - [16/Mar/2026:20:51:08 0800] GET / HTTP/1.1 200 18 - curl/7.76.1 -只能看到 HAProxy 内网 IP192.168.0.100RS2 日志开启 Proxy Protocol 成功获取真实 IP192.168.0.100 - - [16/Mar/2026:20:51:08 0800] GET / HTTP/1.1 172.25.254.99200 18 - curl/7.76.1 -成功打印客户端真实源 IP172.25.254.993.2 七层 HTTP 模式X-Forwarded-For 头部透传生产主流原理option forwardfor指令让 HAProxy 在转发 HTTP 请求时自动新增X-Forwarded-For请求头填入客户端真实 IP后端 Apache/Nginx 修改日志格式读取该头部记录真实访客地址。1、HAProxy 全局配置 forwardfor推荐在defaults段全局开启所有后端代理自动生效defaults mode http log global option httplog option dontlognull option http-server-close # 排除本地回环网段不对自身IP插入头部 option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen webserver-cluster-80 bind 172.25.254.100:80 balance roundrobin mode http option forwardfor server webserver1 192.168.0.10:80 check inter 3s fall 3 rise 5 weight 1 server webserver2 192.168.0.20:80 check inter 3s fall 3 rise 5 weight 1重启 HAProxy 生效。2、后端 Apache httpd 日志配置读取 X-Forwarded-ForRS1开启读取 XFF 头部编辑/etc/httpd/conf/httpd.conf修改日志格式行LogFormat %h %l %u %t \%r\ %s %b \%{X-Forwarded-For}i\ \%{Referer}i\ \%{User-Agent}i\ combined重启 httpdsystemctl restart httpdRS2默认原生日志不读取 XFF保持默认日志格式LogFormat %h %l %u %t \%r\ %s %b \%{Referer}i\ \%{User-Agent}i\ combined3、后端 Nginx 日志配置读取 X-Forwarded-Forhttp { log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; }4、访问日志验证客户端循环访问后查看RS1 httpd 日志成功获取真实 IP192.168.0.100 - - [16/Mar/2026:21:21:17 0800] GET / HTTP/1.1 200 24 172.25.254.99 - curl/7.76.1RS2 httpd 日志仅看到代理 IP192.168.0.100 - - [16/Mar/2026:21:23:38 0800] GET / HTTP/1.1 200 24 - curl/7.76.13.3 两种透传方案选型总结方案适用模式优点缺点X-Forwarded-For仅七层 HTTP配置简单、兼容性极强主流方案四层 TCP 无法使用Proxy Protocol(send-proxy)四层 TCP / 七层 HTTP 通用四层场景唯一透传方案协议标准化前后端必须成对开启配置配置繁琐