nginx+Tomcat反向代理實現session會話保持

概述:企業應用中nginx+tomcat是當前主流架構之一,當網站訪問量很大的時候一臺nginx代理多臺tomcat來實現負載均衡是一個比較理想的解決方案,那如何保持會話呢?(也就是當一個鏈接訪問A服務器時,刷新瀏覽器鏈接跳轉到B服務器,而不會使頁面失效呢?)

解決方案:

    1、會話粘性(session sticky),又分爲基於源ip和cookie 2種方式
                基於源ip(source_ip)在不同的調度器上又不同的實現方式:
                                    nginx : ip_hash
                                    lvs : sh算法
                                    haproxy:source

                cookie:
                                    nginx : hash
                                    haproxy:cookie
    2、會話羣集(session cluster)tomcat自帶的session manager
    3、會話服務 (session server) 第三方redis(store),memcached(cache)

環境:
nginx+tomcat
一臺nginx :192.168.2.198
一臺tomcat1+mem:192.168.2.197
一臺tomcat2+mem:192.168.2.199

一、2臺Tomcat配置java環境及發佈目錄
1、jdk安裝
rpm -ivh jdk-8u151-linux-x64.rpm
如圖:
nginx+Tomcat反向代理實現session會話保持
2、tomcat下載、解壓
tomcat 下載地址:http://tomcat.apache.org/
tar xf apache-tomcat-7.0.78.tar.gz -C /usr/local/
ln -s apache-tomcat-7.0.78 tomcat
3、配置path環境變量
vi /etc/profile.d/tomcat.sh
export CATALINA_BASE=/usr/local/tomcat
export PATH=$CATALINA_BASE/bin:$PATH
chmod +x /etc/profile.d/tomcat.sh # 賦予可執行權限
source /etc/profile.d/tomcat.sh
4、創建測試網頁的發佈目錄
mkdir /usr/local/tomcat/webapps/test/
5、創建測試頁面(197上創建tomcatA ,199上創建tomcatB)
[root@localhost conf]#vi /usr/local/tomcat_a/webapps/test/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.linuxinfo.top</font></h1>
<tablealign="centre" border="1">
<tr>
<td>SessionID</td>
<% session.setAttribute("linuxinfo.top","linuxinfo.top");%>
<td><%=session.getId() %></td>
</tr>
<tr>
<td>Createdon</td>
<td><%=session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
6、分別啓動tomcat
catalina.sh start #可也用全路徑/usr/local/tomcat/bin/startup.sh
7、訪問192.168.2.197,測試如下,查看session ID
nginx+Tomcat反向代理實現session會話保持
訪問192.168.2.199,測試如下,查看session ID
nginx+Tomcat反向代理實現session會話保持

至此,2臺tomcat部署成功。

二、基於tomcat羣集配置session會話保持
1、編輯vi server.xml ,在Engine字段中添加如下代碼,開啓羣集服務
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1"> #jvmRoute表示唯一表示本機,所以不同主機的是不同的。這個參數非必須
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.10.0.4" port="45564" frequency="500" dropTime="3000"/> #多播地址應該是224~239,同一組裏的多播地址相同
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="192.168.2.197" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> #address爲本機能夠向外通信的地址
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter="/"/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

如圖:
nginx+Tomcat反向代理實現session會話保持
2、編輯web.xml
vim /usr/local/tomcat/conf/web.xml 給應用程序加<distributable/>標籤,使其能夠實現複製。在web-app字段加 <distributable/>。
如下圖:
nginx+Tomcat反向代理實現session會話保持

將web.xml放在對應的項目目錄下:
mkdir /usr/local/tomcat/webapps/test/WEB-INF
cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/test/WEB-INF/
重啓服務:catalina.sh stop
catalina.sh start
如果不能啓動,查看日誌logs/catalina.out信息如下(不能加入到組播) :blob.png
那麼添加到達組播的路由即可:route add -host 228.10.0.4 dev ens33

三、配置nginx負載均衡
vi /usr/local/nginx/conf/nginx.conf
upstream tomcat{
server 192.168.2.197:8080;
server 192.168.2.199:8080;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat
}
}

四、測試訪問代理服務192.168.2.198,查看session ID 保持不變,實現會話保持。

nginx+Tomcat反向代理實現session會話保持

強制刷新頁面
nginx+Tomcat反向代理實現session會話保持

可以看到session ID,保持不變,基於tomcat羣集實現了會話保持。

五、基於memcache來實現session會話保持

0、還原配置文件
cp server.xml server.xml.cluster #備份羣集複製的配置文件
cp server.xml.bak server.xml #還原配置文件

在所有的tomcat節點上(我們這裏只有兩臺主機)既做tomcat也做memcached

下載五個jar包,將jar包放在/usr/local/tomcat/lib:
1、下載以下JAR包到tomcat庫目錄;cd /usr/share/tomcat/lib
wget http://www.java2s.com/Code/JarDownload/javolution/javolution-5.5.1.jar.zip
#需要解壓 unzip javolution-5.5.1.jar.zip
wget http://repo1.maven.org/maven2/net/spy/spymemcached/1.8.0/spymemcached-1.8.0.jar
wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/1.8.0/msm-javolution-serializer-1.8.0.jar
wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/1.8.0/memcached-session-manager-tc7-1.8.0.jar
wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.1.1/memcached-session-manager-1.8.0.jar

mget javolution-5.4.3.1.jar
memcached-session-manager-1.8.0jar
memcached-session-manager-tc7-1.8.0.jar
msm-javolution-serializer-1.8.0.jar
spymemcached-1.8.0.jar

2、在contest.xml段定義一個用於測試的context容器,並在其中創建一個會話管理器。
vim contest.xml ,添加如下信息
<Context
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:192.168.2.197:11211,m2:192.168.2.199:11211" failoverNodes="m1"
requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"/>
</Context>
重啓服務:
catalina.sh stop
catalina.sh start
3、下載memcached,啓動服務
yum install memcached -y
systemctl start memcached
4、測試頁面及測試效果同上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章