Nginx 可以通过多种方式实现会话保持(Session Persistence),确保同一客户端的请求被定向到同一台后端服务器。以下是常见的实现方案:
原理:对客户端 IP 地址进行哈希计算,将同一 IP 的请求固定分配到同一后端服务器。
配置示例:
upstream backend {
ip_hash; # 启用IP哈希
server 10.0.0.1:80;
server 10.0.0.2:80;
}
特点: - 简单易用,无需额外模块。 - 缺点:局域网用户或 NAT 环境下多个客户端可能共享同一 IP,导致负载不均。
原理:通过 Cookie 标识客户端,Nginx 在首次响应时注入 Cookie,后续请求根据 Cookie 值路由。
配置示例(需安装 nginx-sticky-module
):
upstream backend {
sticky cookie srv_id expires=1h domain=.example.com path=/;
server 10.0.0.1:80;
server 10.0.0.2:80;
}
特点: - 更精准的会话保持(支持动态 IP 场景)。 - 缺点:依赖客户端 Cookie,可能被禁用。
sticky_route
原理:Nginx 商业版提供的会话保持功能,支持自定义路由标识(如请求参数、Header)。
配置示例:
upstream backend {
sticky_route $cookie_route $arg_route; # 从Cookie或URL参数获取标识
server 10.0.0.1:80 route=server1;
server 10.0.0.2:80 route=server2;
}
特点: - 灵活性高,但需付费版 Nginx Plus。
原理:对任意变量(如用户ID、SessionID)进行哈希计算。
配置示例:
upstream backend {
hash $http_session_id consistent; # 根据Header中的SessionID哈希
server 10.0.0.1:80;
server 10.0.0.2:80;
}
特点: - 需应用层传递唯一标识(如通过 Header 或 URL 参数)。
least_conn
+ 应用层 Session 共享原理:虽然 least_conn
本身不提供会话保持,但结合 Redis/Memcached 等共享 Session 存储,可间接实现。
配置示例:
upstream backend {
least_conn; # 最少连接数分配
server 10.0.0.1:80;
server 10.0.0.2:80;
}
特点: - 依赖应用层实现 Session 共享,适合分布式环境。
map
指令原理:通过 map
将特定条件(如 Cookie 值)映射到后端服务器。
配置示例:
map $cookie_session_id $backend_server {
default "backend_default";
"abc123" "10.0.0.1:80";
"def456" "10.0.0.2:80";
}
server {
location / {
proxy_pass http://$backend_server;
}
}
特点: - 灵活性高,但配置复杂,适合简单静态路由。
ip_hash
或第三方 sticky
模块。sticky_route
。least_conn
)。hash ... consistent
避免服务器增减导致大量会话失效。sticky
Cookie 的 Secure
和 HttpOnly
属性。根据实际需求选择最合适的方案即可。