當用戶端通路Tomcat叢集時,所有的請求将被Nginx攔截,由Nginx做負載均衡後轉發給背景真實Tomcat。按照這個流程就可能出現一個問題,當使用者進行頁面重新整理或跳轉時,每次請求将被轉發給不同的Tomcat處理,這樣就會造成Session的不同步。舉個簡單的栗子,例如當使用者往購物車添加商品時,興高采烈地準備買單了,當他跳轉到付款頁面卻發現購物車被清空了,這就是Session丢失的典型栗子。是以,我們需要為叢集環境做Session同步。
在伺服器叢集的環境下,共享Session的方案主要分為4類:
1.使用者端本地儲存Cookie
在這種方式下,Web應用會将使用者狀态寫到Cookie并儲存到使用者本地。但是,如果使用者使用的浏覽器不支援Cookie或者禁用Cookie,該方案将會失效。并且Cookie能儲存的資料是有大小限制的,而且資料暴露給使用者本地浏覽器,存在安全性問題。
2.采用資料庫方式儲存Session
相對本地Cookie方式,将使用者資訊儲存到服務端資料庫解決了資料安全性問題。然而,這麼做是有代價的,應用中所有對Session的通路都必須經過資料庫,加大資料庫負擔,導緻系統整體性能降低。
3.代理伺服器
通過代理伺服器實作Session共享的思路非常簡單,就是Session資料在哪台Tomcat,之後的請求都轉發到這台Tomcat。例如Nginx,具體實作隻需要修改轉發規則為<code>ip_hash</code>即可。但這時候可能存在某一時間段大量使用者始終通路某台Tomcat的負載很大,也就失去了負載均衡的意義。
4.搭建緩存伺服器
這種方案也是應用最普遍的方案,通過搭建緩存伺服器,并使用第三方工具接管Tomcat對Session的管理。
進
行Session管理,使用的緩存伺服器是Memcached,并使用memcached-session-manager管理Session。memcached-session-manager(以下簡稱msm)的使用方法很簡單,隻需要根據Tomcat版本和序列化方式下載下傳相應jar包,拷貝至Tomcat的lib目錄下,最後修改Tomcat配置檔案,更換Session管理子產品即可。
Nginx+Tomcat+Memcached實作tomcat叢集和session共享
過程:clients—>172.16.253.11-->(tomcatA,tomcatB)
負載均衡節點:172.16.253.11,192.168.159.11
tomcatA節點:172.16.253.13
tomcatB節點:172.16.253.14
memcache節點:172.16.253.12
如圖所示:
一、Tomcat配置:
Tomcat作為應用程式伺服器,主要作用是處理jsp檔案,是以需要提供一個用于測試的檔案index.jsp以及對應版本的.jar包。主要是memcached-session-manager相關的jar包,和用于将前端的使用者的cookie資訊序列化成”鍵-值”格式的工具。
①下載下傳:jar檔案至各tomcat節點的tomcat安裝目錄下的lib目錄中
ls /usr/share/tomcat/lib/
memcached-session-manager- 1.8.2.jar
memcached-session-manager-tc7- 1.8.2.jar
spymemcached- 2.10.2 .jar
msm-javolution-serializer- 1.8.2.jar
javolution- 5.5.1.jar
如下:
②安裝tomcat及相關的服務包
yum install java-1.7.0-openjdk-devel.x86_64 # 安裝jdk
yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
③分别在兩個tomcat上的某host上定義一個用于測試的context容器,并在其中建立一個會話管理器,如下所示:
vim /etc/tomcat/server.xml
<Host name="node1.com" appBase="/data/webapps" autoDeploy="true">
<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.16.253.12:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
/>
</Context>
</Host>
④分别為兩個context提供測試頁面:
TomcatA:
mkdir -pv /usr/local/tomcat/webapps/test/WEB-INF/{classes,lib}
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.magedu.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("magedu.com","magedu.com"); %>
<td><%= session.getId() %></td>
</tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
TomcatB:
<head><title>TomcatB</title></head>
<h1><font color="blue">TomcatB.magedu.com</font></h1>
測試目錄的結構如下:
二、Nginx配置:
對于nginx來說,這本實驗中隻是起了排程的作用,即反向代理的作用,并沒有實作動靜分離,路徑重寫等操作,這裡主要是将用戶端的請求排程至後端應用程式伺服器Tomcat。集體配置如下:
vim /etc/nginx/nginx.conf
<code>http {</code>
<code> </code><code>upstream centos { </code><code># 定義伺服器叢集</code>
<code> </code><code>server 172.16.253.13:8080;</code>
<code> </code><code>server 172.16.253.14:8080;</code>
<code> </code><code>}</code>
<code> </code><code>server {</code>
<code> </code><code>listen 80 ;</code>
<code> </code><code>listen [::]:80 default_server;</code>
<code> </code><code>server_name _;</code>
<code> </code><code>root </code><code>/usr/share/nginx/html</code><code>;</code>
<code> </code><code>include </code><code>/etc/nginx/default</code><code>.d/*.conf;</code>
<code> </code><code>location / {</code>
<code> </code><code>proxy_pass http://172.16.253.11; </code><code># 将請求代理至後端Tomcat伺服器</code>
<code> </code><code>}</code>
<code> </code><code>...</code>
<code>}</code>
systemctl start nginx
<code></code>
三、Memcached配置
對于memcached伺服器的配置其實很簡單,由于memcached自身不能夠主動存儲cookie資訊,隻需要在memcached伺服器上安裝memcached服務就行,至于對資料進行序列化則是由前面的伺服器來實作的。
yum install memcached
systemctl start memcached # 啟動服務
ss -tnl | grep 1121 # 檢查服務是否正常啟動
四、測試
http://172.16.253.11/test
我們在用戶端進行測試。在浏覽器中輸入nginx的位址:重新整理你會看到,通路的内容發生了改變,但是cookie值并沒有發生改變。
本文轉自 優果馥思 51CTO部落格,原文連結:http://blog.51cto.com/youguofusi/2053919