Nginx + Tomcat7 + redis session一致性問題
Nginx 作負載均衡時,由於是每次都需要把請求分發到不同的機器,同一個使用者在一臺機器上建立了 session,下一次的請求很有可能會轉發到另外一臺機器,會造成 session 丟失。我們可以使用 Redis 來儲存 session。具體步驟如下:
1. https://files.cnblogs.com/files/langfanyun/redislib.7z 下載解壓後,把 jar 包都放在Tomcat 的 lib 目錄下;
2. 編輯 Tomcat下的 conf/context.xml 檔案,加入如下配置:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.137.47"
port="6379"
database="0"
maxInactiveInterval="60" />
其中 host 為 Redis 的伺服器地址。
3. 修改 Tomcat 下的 conf/server.xml 檔案,在 <Engine>節點新增 jvmRoute 屬性,不同機器上的Tomcat 設定不同的值:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm2">
4. 修改 Tomcat 下的 webapps/ROOT/ 下的 index.jsp 檔案,把<body>裡的內容改成如下。不同機器上的此檔案,新增一些不同的值,以區分不同的機器。
<body>
SessionID: <%=session.getId()%><br/>
SessionIP: <%=request.getServerName()%><br>
tomcat1
</body>
5. 啟動 Redis 伺服器和各個 Tomcat,訪問時,多重新整理幾次,可以看到 sessionID 的值一樣,但是其它內容不一樣。說明實際上是訪問了不同的 Tomcat 下的應用 。