一、web server session
server端session:
1、service向用户浏览器发送cookie,此cookie包含获取服务端session的标识。
2、向用户通过浏览器请求同一站点的页面时,相应的cookie信息会随之发送。
3、server从cookie信息中识别出与此浏览器相关的session标识,从而判别出当前server上此浏览器的session信息。
在用户浏览器不支持cookie的场景中,也可以基于URL重写实现session功能。简单来讲就是server端通过为任何一个响应给用户的URL附加上session id的方式来标识用户请求。
不过需要注意的是,每个浏览器进程都会各自管理各自跟服务端的会话ID,因此,在服务器端看来,同一个客户端上的多个浏览器进程会被识别成不同的客户端。
二、会话管理器:
标准会话管理器和持久会话管理器
标准会话管理器(StandardManager):
<Manager className="org.apache.catalina.session.StandardManager"
maxInactiveInterval="7200"/>
默认保存于$CATALINA_HOME/work/Catalina/<hostname>/<webapp-name>/下的SESSIONS.ser文件中。
maxActiveSessions:最多允许的活动会话数量,默认为-1,表示不限制;
maxInactiveInterval:非活动的会话超时时长,默认为60s;
pathname:会话文件的保存目录;
持久会话管理器(PersistentManager):
将会话数据保存至持久存储中,并且能在服务器意外中止后重新启动时重新加载这些会话信息。持久会话管理器支持将会话保存至文件存储(FileStore)或JDBC存储(JDBCStore)中。
保存至文件中的示例:
<code><Manager className=</code><code>"org.apache.catalina.session.PersistentManager"</code>
<code> </code><code>saveOnRestart=</code><code>"true"</code><code>></code>
<code> </code><code><Store className=</code><code>"org.apache.catalina.session.FileStore"</code>
<code> </code><code>directory=</code><code>"/data/tomcat-sessions"</code><code>/></code>
<code><</code><code>/Manager</code><code>></code>
每个用户的会话会被保存至directory指定的目录中的文件中,文件名为<session id>.session,并通过后台线程每隔一段时间(checkInterval参数定义,默认为60秒)检查一次超时会话。
保存至JDBCStore中的示例:
<code> </code><code><Store className=</code><code>"org.apache.catalina.session.JDBCStore"</code>
<code> </code><code>driverName=</code><code>"com.mysql.jdbc.Driver"</code>
<code> </code><code>connectionURL=</code><code>"jdbc:mysql://localhost:3306/mydb?user=jb;password=pw"</code><code>/></code>
三、配置基于mod_jk的负载均衡
1、为了避免用户直接访问后端Tomcat实例,影响负载均衡的效果,建议在Tomcat 7的各实例上禁用HTTP/1.1连接器。
2、为每一个Tomcat 7实例的引擎添加jvmRoute参数,并通过其为当前引擎设置全局惟一标识符。如下所示。需要注意的是,每一个实例的jvmRoute的值均不能相同。
<Engine name=”Standalone” defaultHost=”localhost” jvmRoute=” TomcatA ”>
3、修改虚拟主机配置
<code>[root@liang-study extra]</code><code># vim httpd-jk.conf </code>
<code># Load the mod_jk</code>
<code>LoadModule jk_module modules</code><code>/mod_jk</code><code>.so</code>
<code>JkWorkersFile </code><code>/usr/local/apache/conf/extra/workers</code><code>.properties</code>
<code>JkLogFile logs</code><code>/mod_jk</code><code>.log</code>
<code>JkLogLevel debug</code>
<code>JkMount /* lbcluster1</code>
<code>JkMount </code><code>/status/</code> <code>stat1</code>
<code>[root@liang-study extra]</code><code># vim workers.properties </code>
<code>worker.list = lbcluster1,stat1</code>
<code>worker.TomcatA.</code><code>type</code> <code>= ajp13</code>
<code>worker.TomcatA.host = 192.168.210.148</code>
<code>worker.TomcatA.port = 8009</code>
<code>worker.TomcatA.lbfactor = 5</code>
<code>worker.TomcatB.</code><code>type</code> <code>= ajp13</code>
<code>worker.TomcatB.host = 192.168.210.198</code>
<code>worker.TomcatB.port = 8009</code>
<code>worker.TomcatB.lbfactor = 5</code>
<code>worker.lbcluster1.</code><code>type</code> <code>= lb</code>
<code>worker.lbcluster1.sticky_session = 1</code>
<code>worker.lbcluster1.balance_workers = TomcatA, TomcatB</code>
<code>worker.stat1.</code><code>type</code> <code>= status</code>
4、重启httpd服务,验证访问结果。
四、配置基于mod_proxy的负载均衡
2、为每一个Tomcat 7实例的引擎添加jvmRoute参数,并通过其为当前引擎设置全局惟一标识符。如下所示。需要注意的是,修改server.xml每一个实例的jvmRoute的值均不能相同。
3、修改httpd.conf配置
<code>[root@liang-study conf]</code><code># vim httpd.conf</code>
<code>Include conf</code><code>/extra/tomcat-http</code><code>.conf</code>
4、添加虚拟主机配置
<code>[root@liang-study conf]</code><code># vim extra/tomcat-http.conf </code>
<code>ProxyRequests Off</code>
<code> </code><code><proxy balancer:</code><code>//liangcluster</code><code>></code>
<code> </code><code>BalancerMember ajp:</code><code>//192</code><code>.168.210.148:8009 loadfactor=1 route=tomcatA</code>
<code> </code><code>BalancerMember ajp:</code><code>//192</code><code>.168.210.198:8009 loadfactor=1 route=tomcatB</code>
<code> </code><code><</code><code>/proxy</code><code>></code>
<code><VirtualHost *:80></code>
<code> </code><code>ServerName www.liangstudy.com</code>
<code> </code><code>ProxyPass / balancer:</code><code>//liangcluster/</code> <code>stickysession=jsessionid nofailover=On</code>
<code> </code><code>ProxyPassReverse / balancer:</code><code>//liangcluster/</code>
<code> </code><code>ErrorLog </code><code>"logs/proxyTest-error.log"</code>
<code> </code><code>CustomLog </code><code>"logs/lbtest-access.log"</code> <code>common</code>
<code><</code><code>/VirtualHost</code><code>></code>
5、重新启动apache,即可
五、用于mod_proxy状态信息的输出
<Location /balancer-manager>
SetHandler balancer-manager
Order Deny,Allow
Allow from all
</Location>
如果使用虚拟主机实现反向代理,如何在对应的虚拟主机上完成状态信息输出:
ProxyRequests Off
<proxy balancer://lbcluster1>
BalancerMember ajp://192.168.10.8:8009 loadfactor=1
BalancerMember ajp://192.168.10.9:8009 loadfactor=1
ProxySet lbmethod=bytraffic
</proxy>
<VirtualHost *:80>
ServerName localhost
ProxyVia On
ProxyPass / balancer://lbcluster1/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse / balancer://lbcluster1/
<Location /balancer-manager>
SetHandler balancer-manager
Proxypass !
Require all granted
</Location>
<Proxy *>
</Proxy>
<Location / >
</VirtualHost>
五、基于mod_proxy实现共享集群
根据会话管理器的模式,我们选用org.apache.catalina.ha.session.DeltaManager的方法来实现共享,所有启用集群功能的web应用程序,其web.xml中都须添加<distributable/>才能实现集群功能。如果某web应用程序没有自己的web.xml,也可以通过复制默认的web.xml至其WEB-INF目录中实现。
1、修改web.xml
<code>[root@liang-study webapps]</code><code># cd /home/websites/webapps/</code>
<code>[root@liang-study webapps]</code><code># mkdir WEB-INF</code>
<code>[root@liang-study webapps]</code><code># cp /usr/local/tomcat/conf/web.xml WEB-INF/</code>
<code>[root@liang-study webapps]</code><code># ll</code>
<code>total 8</code>
<code>-rw-r--r-- 1 root root 434 Jan 17 17:57 index.jsp</code>
<code>drwxr-xr-x 2 root root 4096 Jan 18 20:20 WEB-INF</code>
<code>[root@liang-study webapps]</code><code># vim WEB-INF/web.xml </code>
<code>在web.xml中添加<distributable/>即可,记得在另外一台tomcat上也需要做这个操作</code>
<code>[root@liang-study webapps]</code><code># scp -r WEB-INF/ [email protected]:/home/websites/webapps/</code>
2、修改server.xml
<code>在<Engine name=</code><code>"Catalina"</code> <code>defaultHost=</code><code>"www.liangstudy.com"</code> <code>jvmRoute=</code><code>"tomcatA"</code><code>>下添加</code>
<code><Cluster className=</code><code>"org.apache.catalina.ha.tcp.SimpleTcpCluster"</code>
<code> </code><code>channelSendOptions=</code><code>"8"</code><code>></code>
<code> </code><code><Manager className=</code><code>"org.apache.catalina.ha.session.DeltaManager"</code>
<code> </code><code>expireSessionsOnShutdown=</code><code>"false"</code>
<code> </code><code>notifyListenersOnReplication=</code><code>"true"</code><code>/></code>
<code> </code><code><Channel className=</code><code>"org.apache.catalina.tribes.group.GroupChannel"</code><code>></code>
<code> </code><code><Membership className=</code><code>"org.apache.catalina.tribes.membership.McastService"</code>
<code> </code><code>address=</code><code>"228.90.90.1"</code> <code>bind=</code><code>"192.168.210.148"</code> <code>port=</code><code>"45564"</code>
<code> </code><code>frequency=</code><code>"500"</code> <code>dropTime=</code><code>"3000"</code><code>/></code>
<code> </code><code><Receiver className=</code><code>"org.apache.catalina.tribes.transport.nio.NioReceiver"</code>
<code> </code><code>address=</code><code>"192.168.210.148"</code> <code>port=</code><code>"4000"</code> <code>autoBind=</code><code>"100"</code>
<code> </code><code>selectorTimeout=</code><code>"5000"</code> <code>maxThreads=</code><code>"6"</code><code>/></code>
<code> </code><code><Sender className=</code><code>"org.apache.catalina.tribes.transport.ReplicationTransmitter"</code><code>></code>
<code> </code><code><Transport className=</code><code>"org.apache.catalina.tribes.transport.nio.PooledParallelSender"</code><code>/></code>
<code> </code><code><</code><code>/Sender</code><code>></code>
<code> </code><code><Interceptor className=</code><code>"org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"</code><code>/></code>
<code> </code><code><Interceptor className=</code><code>"org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"</code><code>/></code>
<code> </code><code><</code><code>/Channel</code><code>></code>
<code> </code><code><Valve className=</code><code>"org.apache.catalina.ha.tcp.ReplicationValve"</code>
<code> </code><code>filter=</code><code>".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"</code><code>/></code>
<code> </code><code><Valve className=</code><code>"org.apache.catalina.ha.session.JvmRouteBinderValve"</code><code>/></code>
<code> </code><code><Deployer className=</code><code>"org.apache.catalina.ha.deploy.FarmWarDeployer"</code>
<code> </code><code>tempDir=</code><code>"/tmp/war-temp/"</code> <code>deployDir=</code><code>"/tmp/war-deploy/"</code>
<code> </code><code>watchDir=</code><code>"/tmp/war-listen/"</code> <code>watchEnabled=</code><code>"false"</code><code>/></code>
<code> </code><code><ClusterListener className=</code><code>"org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"</code><code>/></code>
<code> </code><code><ClusterListener className=</code><code>"org.apache.catalina.ha.session.ClusterSessionListener"</code><code>/></code>
<code><</code><code>/Cluster</code><code>></code>
<code>注意根据tomcat主机不同修改配置文件中 bind=</code><code>"192.168.210.148"</code><code>和address=</code><code>"192.168.210.148"</code>
3、重启tomcat
本文转自 亮公子 51CTO博客,原文链接:http://blog.51cto.com/iyull/1892637