本文目录导读:

- 场景一:在 Nginx 中自动配置会话保持(基于 IP Hash 或 Cookie)
- 场景二:在 HAProxy 中自动配置会话保持(基于 Cookie)
- 场景三:使用云厂商 CLI(AWS ELB / 阿里云 SLB)
- 场景四:Kubernetes Ingress(自动注入会话保持注解)
- 安全建议
- 完整示例:Ansible Playbook 配置 Nginx 会话保持
是的,实用脚本完全可以自动配置会话保持(Session Persistence/Session Affinity),通过脚本,你可以快速在负载均衡器(如Nginx、HAProxy、云服务商LB等)上设置基于Cookie或源IP的会话保持。
以下是几个常见场景的自动配置脚本示例,你可以根据实际环境选择使用。
在 Nginx 中自动配置会话保持(基于 IP Hash 或 Cookie)
需求:在 Nginx 配置文件中为特定上游服务器组添加会话保持。
脚本思路:使用 sed 或 awk 修改 Nginx 配置文件,然后重载。
脚本示例 (configure_nginx_session.sh):
#!/bin/bash
# 使用方法:./configure_nginx_session.sh <upstream_name> <method>
# method可选:ip_hash | cookie | sticky
# ./configure_nginx_session.sh my_backend ip_hash
UPSTREAM_NAME=$1
METHOD=$2
NGINX_CONF="/etc/nginx/nginx.conf" # 或使用 sites-enabled 下的具体文件
if [ -z "$UPSTREAM_NAME" ] || [ -z "$METHOD" ]; then
echo "Usage: $0 <upstream_name> <ip_hash|cookie|sticky>"
exit 1
fi
# 备份配置
cp $NGINX_CONF ${NGINX_CONF}.bak
case $METHOD in
ip_hash)
# 在 upstream 块内添加 ip_hash 指令(假设已有 server 定义)
sed -i "/upstream $UPSTREAM_NAME {/a\ ip_hash;" $NGINX_CONF
echo "已添加 ip_hash 到 upstream $UPSTREAM_NAME"
;;
cookie)
# 使用 sticky cookie 模块(需要 ngx_http_sticky_module)
sed -i "/upstream $UPSTREAM_NAME {/a\ sticky cookie srv_id expires=1h path=/;" $NGINX_CONF
echo "已添加 sticky cookie 到 upstream $UPSTREAM_NAME"
;;
*)
echo "不支持的方法: $METHOD"
exit 2
;;
esac
# 测试配置并重载
nginx -t && systemctl reload nginx
在 HAProxy 中自动配置会话保持(基于 Cookie)
需求:为 HAProxy 的后端服务器组自动添加 cookie 参数实现会话保持。
脚本示例 (configure_haproxy_session.sh):
#!/bin/bash
HAPROXY_CONF="/etc/haproxy/haproxy.cfg"
BACKEND_NAME=$1
if [ -z "$BACKEND_NAME" ]; then
echo "Usage: $0 <backend_name>"
exit 1
fi
# 检查是否已存在 cookie 设置
if grep -A5 "backend $BACKEND_NAME" $HAPROXY_CONF | grep -q "cookie "; then
echo "后端 $BACKEND_NAME 已配置 cookie,跳过。"
else
# 在 backend 段的第一个 server 行之前插入 cookie 指令
sed -i "/^backend $BACKEND_NAME/a\ cookie SERVERID insert indirect nocache" $HAPROXY_CONF
# 为所有 server 行添加 cookie 参数(使用 server 名称作为 cookie 值)
sed -i "/^ server.*$BACKEND_NAME/{s/$/ cookie \$HOSTNAME/}" $HAPROXY_CONF
# 更健壮的方法:用 awk 或 perl 处理(略,这里简化)
# 检查配置
haproxy -c -f $HAPROXY_CONF && systemctl reload haproxy
echo "已为后端 $BACKEND_NAME 配置 cookie 会话保持。"
fi
使用云厂商 CLI(AWS ELB / 阿里云 SLB)
需求:自动开启指定负载均衡器的会话保持(比如基于 Cookie 的粘性会话)。
脚本示例(阿里云 CLI):
#!/bin/bash
# 确保已安装并配置 aliyun CLI
LB_ID="lb-xxxxxxx"
LISTENER_PORT=80
# 开启会话保持(基于植入 Cookie)
aliyun slb CreateLoadBalancerHTTPListener \
--RegionId cn-hangzhou \
--LoadBalancerId $LB_ID \
--ListenerPort $LISTENER_PORT \
--StickySession on \
--StickySessionType insert \
--CookieTimeout 86400 \
--BackendServerPort 80 \
--HealthCheck on
# 或者更新现有监听器:
# aliyun slb SetLoadBalancerHTTPListenerAttribute .... (参数同上)
脚本示例(AWS CLI):
#!/bin/bash
LB_NAME="my-alb"
TARGET_GROUP_ARN="arn:aws:elasticloadbalancing:..."
# 为 ALB 的目标组开启基于源 IP 的会话保持
aws elbv2 modify-target-group-attributes \
--target-group-arn $TARGET_GROUP_ARN \
--attributes Key=stickiness.enabled,Value=true \
--attributes Key=stickiness.type,Value=source_ip
Kubernetes Ingress(自动注入会话保持注解)
需求:自动为 Nginx Ingress 资源添加 nginx.ingress.kubernetes.io/affinity 注解。
脚本示例 (k8s_session_affinity.sh):
#!/bin/bash
INGRESS_NAME=$1
if [ -z "$INGRESS_NAME" ]; then
echo "Usage: $0 <ingress_name>"
exit 1
fi
# 为 Ingress 添加会话保持注解(cookie mode)
kubectl annotate ingress $INGRESS_NAME \
nginx.ingress.kubernetes.io/affinity=cookie \
nginx.ingress.kubernetes.io/session-cookie-name=route \
nginx.ingress.kubernetes.io/session-cookie-expires=172800 \
nginx.ingress.kubernetes.io/session-cookie-max-age=172800
echo "已为 Ingress $INGRESS_NAME 添加会话保持注解。"
安全建议
- 验证输入:脚本中应校验传入参数(如
BACKEND_NAME或UPSTREAM_NAME)的合法性,避免注入攻击。 - 备份配置:修改前备份原始配置文件(如
haproxy.cfg.bak)。 - 重载前测试:使用命令如
nginx -t、haproxy -c -f验证语法正确性。 - 使用 Ansible/Puppet:生产环境推荐使用配置管理工具(Ansible Playbook、Chef、Puppet)而非裸脚本,它们自带幂等性、错误处理和回滚机制。
完整示例:Ansible Playbook 配置 Nginx 会话保持
# nginx_session_affinity.yml
- name: Configure Nginx session persistence
hosts: webservers
become: yes
tasks:
- name: Modify upstream block to add ip_hash
ansible.builtin.lineinfile:
path: /etc/nginx/nginx.conf
insertafter: 'upstream my_servers {'
line: ' ip_hash;'
backup: yes
notify: reload nginx
handlers:
- name: reload nginx
ansible.builtin.systemd:
name: nginx
state: reloaded
只要你能通过命令行修改配置文件或调用 API,就能用脚本自动化配置会话保持。请务必在测试环境验证后再推至生产。