会话保持(Sticky Session)是反向代理中确保用户请求被路由到同一后端服务器的重要机制。以下是Nginx实现会话保持的几种主要方法:
upstream backend {
# 使用cookie实现会话保持
sticky cookie srv_id expires=1h domain=.example.com path=/;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
upstream backend {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
server {
location / {
proxy_pass http://backend;
# 添加路由标识到cookie
proxy_set_header Cookie "ROUTEID=$upstream_addr; $http_cookie";
}
}
upstream backend {
ip_hash; # 基于客户端IP进行哈希分配
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
注意:当后端服务器数量变化时,IP哈希会重新分配,可能导致会话丢失。
upstream backend {
hash $request_uri consistent;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
Nginx Plus提供了更高级的会话保持功能:
upstream backend {
zone backend 64k;
sticky learn create=$upstream_cookie_routeid
lookup=$cookie_routeid
zone=client_sessions:1m;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
如果应用已经生成会话ID,可以基于该ID进行路由:
upstream backend {
hash $cookie_JSESSIONID consistent;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
需要哪种具体实现方式的更详细配置说明,可以进一步探讨。