使用Tengine实现会话保持
一般情况下,nginx实现会话保持的机制是$ip_hash,即根据请求的源地址实现代理请求至特定的后端服务器上。
但这样的模式有限制:
第一,nginx必须是在请求入口的第一层,一旦nginx之前有F5或者squid之类的入口设备,那nginx获取的永远是F5和squid的ip,即无法根据源IP代理至特定的后端上。
第二,即使使用MAP函数以其他header为源数据hash,对于类似企业公共出口IP的请求,也只能认为它们是同一个请求人,这样的划分是比较粗狂的。
通用解决方案:
Cookie插入模式:
在Cookie插入模式下,负载均衡设备将负责插入cookie,后端服务器无需作出任何修改。
Cookie插入模式原理:
- 当客户进行第一次请求时,客户HTTP请求(不带cookie)进入负载均衡设备, 负载均衡设备根据负载平衡算法策略选择后端一台服务器,并将请求发送至该服务器。
- 后端服务器进行HTTP回复(不带cookie)被发回负载均衡设备,然后负载均衡设备插入cookie,将HTTP回复返回到客户端。
- 当客户请求再次发生时,客户HTTP请求(带有上次负载均衡设备插入的cookie)进入负载均衡设备,然后负载均衡设备读出cookie里的会话保持数值,将HTTP请求(带有与上面同样的cookie)发到指定的服务器。
- 后端服务器进行请求回复,由于服务器并不写入cookie,HTTP回复将不带有cookie,恢复流量再次经过进入负载均衡设备时,负载均衡设备再次写入更新后的会话保持cookie。
tegine配置:
upstream apps {
keepalive 8;
server 10.30.1.1:80;
server 10.30.1.2:80;
# 开启会话保持
session_sticky cookie=apps_uid domain=apps.test.com fallback=on path=/ mode=insert option=indirect;
check interval=3000 fall=5 rise=2 timeout=1000 default_down=true type=tcp;
}
server {
listen 80;
server_name apps.test.com.cn;
session_sticky_hide_cookie upstream=apps;
access_log /opt/Apps/nginx/logs/apps_access.log main;
error_log /opt/Apps/nginx/logs/apps_error.log error;
location / {
root html;
index index.html index.htm;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
proxy_pass http://apps;
}
}
tegine配置参考:
http://tengine.taobao.org/document_cn/http_upstream_session_sticky_cn.html