tomcat-8898、tomcat-8899conf/server.xml:<Connector port="8898"/> / 8899<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm8898"/>(標識實例)webapps/ROOT/index.jsp 寫入測試代碼:session.setAttribute("userSession", username) 並顯示當前 Tomcat 端口與 Session 值conf/nginx.conf 核心片段:
upstream tomcat_cluster {
# ip_hash; # 測試時關閉,否則會粘滯同一實例
server localhost:8898 weight=1;
server localhost:8899 weight=1;
}
server {
listen 8888;
server_name localhost;
location / {
proxy_pass https://tomcat_cluster;
proxy_connect_timeout 3s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
}
nginx.exe(停止 nginx -s stop)https://localhost:8888 驗證輪詢切換兩個 Tomcatport 6379,雙擊 redis-server.exe 啟動redis-cli shutdownhttps://github.com/jcoleman/tomcat-redis-session-managermvn clean package 生成 JARjedis-2.7.2.jar、commons-pool2-2.4.1.jar 到兩個 Tomcat 的 lib/ 目錄conf/context.xml
<?xml version='1.0' encoding='utf-8'?>
<Context>
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost" port="6379" database="0" maxInactiveInterval="60" />
</Context>
https://localhost:8888spring:session:sessions:* 鍵值持續更新| 組件 | 關鍵配置 |
|---|---|
| Tomcat | jvmRoute 不同、context.xml 掛載 RedisSessionManager、lib 放三個 JAR |
| Nginx | upstream 定義多 server、關閉 ip_hash 測試輪詢 |
| Redis | 單實例即可,生產建議 Sentinel/Cluster 高可用 |
| Session Manager | Valve 攔截請求、Manager 持久化到 Redis、maxInactiveInterval 控制過期 |