首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Nginx + 多 Tomcat 叢集 Session 一致性問題:跨機器部署登入失效排查

     編輯:程式設計綜合問答

單機多 Tomcat 正常,跨機器部署後「啟動兩個 Tomcat 就登入失敗、被攔截到登入頁」,典型的 Session 不共享 導致。

現象分析

  • Nginx 輪詢/權重分發請求到 Tomcat-A / Tomcat-B。
  • 用戶登入請求落在 Tomcat-A,Session 建立於 Tomcat-A 記憶體。
  • 後續請求被 Nginx 分發到 Tomcat-B,Tomcat-B 找不到 Session → 視為未登入 → 重導登入頁。

解決方案 (按推薦順序)

1. Spring Session + Redis (最主流、生產就緒)

<dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
</dependency>
# application.yml
spring:
  session:
    store-type: redis
  redis:
    host: redis-host
    port: 6379
  • Session 序列化存入 Redis,所有 Tomcat 共享。
  • 支援 Session 失效監聽、多應用共享、WebSocket Session。

2. Sticky Session (IP Hash / Cookie 型黏性)

# nginx.conf
upstream tomcat_cluster {
    ip_hash; # 同一 IP 永遠分發到同一台
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}
  • 優點:零代碼改動、無額外基建。
  • 缺點:節點掛掉 Session 丟失、擴縮容不均、不利於高可用。

3. Tomcat 原生 Session 複製 (DeltaManager / BackupManager)

  • server.xml 配置 <Cluster>、<Manager className="org.apache.catalina.ha.session.DeltaManager"/>。
  • 組播/靜態成員發現,Session 異步複製。
  • 缺點:大叢集網路風暴、序列化效能差、維護複雜,**不推薦新專案**。

4. JWT / Token 無狀態認證 (架構層面徹底解決)

  • 登入簽發 JWT,攜帶在 Header,服務端無 Session 狀態。
  • 需處理 Token 刷新、撤銷、權限載荷體積。

排查清單

  • 確認兩台 Tomcat jvmRoute 不同 (如 tomcatA, tomcatB)。
  • 檢查 Nginx proxy_set_header 傳遞 X-Forwarded-For、Host。
  • 驗證 SESSIONID Cookie Domain/Path 設定正確。
  • 日誌追蹤:登入後 Session ID、後續請求攜帶的 Cookie、落在哪台 Tomcat。

核心結論:跨機器叢集必須解決 Session 共享,Redis 方案最穩健;Sticky Session 只作過渡或輔助。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved