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

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

解決方案:html

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

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

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

1、2臺Tomcat配置java環境及發佈目錄
一、jdk安裝
rpm -ivh jdk-8u151-linux-x64.rpm
如圖:
nginx+Tomcat反向代理實現session會話保持
二、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
三、配置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
四、建立測試網頁的發佈目錄
mkdir /usr/local/tomcat/webapps/test/
五、建立測試頁面(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>
六、分別啓動tomcat
catalina.sh start #可也用全路徑/usr/local/tomcat/bin/startup.sh
七、訪問192.168.2.197,測試以下,查看session ID
nginx+Tomcat反向代理實現session會話保持
訪問192.168.2.199,測試以下,查看session ID
nginx+Tomcat反向代理實現session會話保持linux

至此,2臺tomcat部署成功。

2、基於tomcat羣集配置session會話保持
一、編輯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

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

將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 ens33redis

3、配置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
}
}算法

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

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

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

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

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

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

在全部的tomcat節點上(咱們這裏只有兩臺主機)既作tomcat也作memcached

下載五個jar包,將jar包放在/usr/local/tomcat/lib:
一、下載如下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

二、在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 stopcatalina.sh start三、下載memcached,啓動服務yum install memcached -ysystemctl start memcached四、測試頁面及測試效果同上

相關文章
相關標籤/搜索