本文目录导读:

- 场景一:在 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,就能用脚本自动化配置会话保持。请务必在测试环境验证后再推至生产。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播