tomcat构建及session保持

Tomcat是开放源码的web应用服务器。可以处理像asp,php,cgi,jsp等Apache不能处理的动态页面,但在处理静态资源能力不如Apache服务器,所以通常与Apache在同一台服务器上集成,形成一个可以同时高效处理动静资源的web服务器。

Tomcat组件:

顶级组件:Server

服务类:Service

连接器:http,https,ajp

容器类:Engine,Host,Context

被嵌套的组件:valve(访问控制),logger(日志),realm(用户认证),loader(加载                器),manager(管理器)

集群类组件:listener(侦听器)



Tomcat安装

(1)系统自带的openjdk+tomcat

[[email protected] ~]# yum install -y java-1.7.0-openjdk.x86_64 java-1.7.0-openjdk-devel.x86_64

修改环境变量,使其被系统应用:

[[email protected] ~]# vim /etc/profile.d/java.sh

[[email protected] ~]# exec bash                #重读bash,取代之前的bash
[[email protected] ~]# yum -y install tomcat.noarch tomcat-webapps.noarch tomcat-admin-webapps.noarch tomcat-lib.noarch               #安装tomcat及相应组件

这时可以通过systemctl start tomcat.service开启tomcat服务

(2)使用Oracle JDK和tomcat主站提供的编译完成的程序包

[[email protected] ~]# rpm -ivh jdk-8u25-linux-x64.rpm

修改环境变量,使其被系统应用:

[[email protected] ~]# vim /etc/profile.d/java.sh

[[email protected] ~]#   exec bash                #重读bash,取代之前的bash 
[[email protected] ~]#  tar xf apache-tomcat-8.0.23.tar.gz -C /usr/local
[[email protected] ~]#  cd /usr/local
[[email protected] ~]#  ln -sv apache-tomcat-8.0.23 tomcat  #创建tomcat软链接
[[email protected] ~]#  vim /etc/profile.d/tomcat.sh      #修改环境变量

添加tomcat脚本

#!/bin/bash
#
JAVA_HOME=/usr/java/latest
CATALINA_BASE=/usr/local/tomcat
PATH=$JAVA_HOME/bin:$CATALINA_BASE/bin:$PATH
export JAVA_HOME CATALINA_BASE PATH

case $1 in
start)
  exec $CATALINA_BASE/bin/catalina.sh start
  ;;
stop)
  exec $CATALINA_BASE/bin/catalina.sh stop
  ;;
restart)
  $CATALINA_BASE/bin/catalina.sh stop
  sleep 2
  exec $CATALINA_BASE/bin/catalina.sh start
  ;;
*)
  echo "Usage: `basename $0` (start|stop|restart)"
  exit 1
  ;;
esac

这时可以通过systemctl start tomcat.service开启tomcat服务



Tomcat目录结构

bin:存放各种平台下启动和关闭Tomcat的脚本文件

lib:存放Tomcat服务器和所有web应用需要的jar包

conf:Tomcat的各种配置文件,最重要的是server.xml

logs:存放Tomcat的日志文件

webapps:web应用的默认部署目录

temp:临时文件目录

Tomcat配置文件

server.xml:主配置文件

context.xml:每个webapp都可以专门的配置文件,这些配置文件通常位于webapp程序目录下的     WEB-INF目录中,用于定义会话管理,JDBC等;conf/context.xml是为各webapp提供             默认配置

web.xml:每个webapp只在部署之后才能被访问;此文件则用于为各webapp定义默认的部署操作方     式

tomcat-users.xml:用户认证的账号和密码配置文件

catalina.policy:当使用-security选项来启动tomcat实例时会读取此配置文件来实现基于安全     策略的运行方式

catalina。properties:java属性的定义文件,用于设定类加载器路径等,以及一些与JVM性能相     关的调优参数

logging-properties:日志系统相关的配置



手动添加一个测试应用程序

(1)创建webapp特有的目录结构

[[email protected] ~]#  mkdir -pv myapp/{classes,lib,WEB-INF,META-INF}

(2)提供webapp的测试页面

[[email protected] ~]#  vim myapp/index.jsp



构建LNMT

Client --> http --> Nginx --> reverse_proxy (http) --> tomcat (http connector)

location /  {
    proxy_pass                  #nginx反向代理
}
location ~* \.(jsp|do)$ {
    proxy_pass                  #nginx动静分离
}

构建LAMT

Client --> http --> httpd --> reverse_proxy_module (http) --> tomcat (http connector)

Client --> http --> httpd --> reverse_proxy_module (ajp) --> tomcat (ajp connector)

第一种方式:proxy_module, proxy_http_module

第二种方式:proxy_module, proxy_ajp_module

(1) 第一种方式的配置机制,使用虚拟主机

<VirtualHost *:80>
    ServerName tc1.yl.com
    ProxyRequests Off
    ProxyVia On
    ProxyPreserveHost On
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
    <Location />
        Require all granted
    </Location>
</VirtualHost>

(2)

<VirtualHost *:80>
    ServerName tc1.yl.com
    ProxyRequests Off
    ProxyVia On
    ProxyPreserveHost On
    <Proxy *>
        Require all granted
    </Proxy>
    ProxyPass / ajp://localhost:8080/
    ProxyPassReverse / ajp://localhost:8080/
    <Location />
        Require all granted
    </Location>
</VirtualHost>


Tomcat会话保持

(1)session sticky

①source ip

②cookie

(2)session cluster

(3)session server

①kv:memcached,redis

方法一:(1)apache通过mod_proxy,mod_proxy_http,mod_proxy_balancer;

tomcat通过http connector

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
    BalancerMember http://172.16.50.100:8080 loadfactor=10 route=TomcatA
    BalancerMember http://172.16.50.103:8080 loadfactor=10 route=TomcatB
    ProxySet stickysession=ROUTEID
</proxy>

<VirtualHost *:80>
    ServerName web1.magedu.com
    ProxyVia On
    ProxyRequests Off
    ProxyPreserveHost On
        <Proxy *>
            Require all granted
        </Proxy>
    ProxyPass / balancer://lbcluster1/
    ProxyPassReverse / balancer://lbcluster1/
        <Location />
            Require all granted
        </Location>
</VirtualHost>

(2)apache通过mod_proxy,mod_proxy_ajp,mod_proxy_balancer;

tomcat通过ajp connector

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://lbcluster1>
    BalancerMember ajp://172.16.50.100:8080 loadfactor=10 route=TomcatA
    BalancerMember ajp://172.16.50.103:8080 loadfactor=10 route=TomcatB
    ProxySet stickysession=ROUTEID
</proxy>

<VirtualHost *:80>
    ServerName web1.magedu.com
    ProxyVia On
    ProxyRequests Off
    ProxyPreserveHost On
        <Proxy *>
            Require all granted
        </Proxy>
    ProxyPass / balancer://lbcluster1/
    ProxyPassReverse / balancer://lbcluster1/
        <Location />
            Require all granted
        </Location>
</VirtualHost>

(3)apache通过mod_jk

tomcat通过ajp connector

①反向代理

模块配置文件:mod_jk.conf

LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /etc/httpd/conf.d/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  debug
JkMount  /*  TomcatA
JkMount  /status/  stat1

workers配置文件:worker.properties

worker.list=TomcatA,stat1
worker.TomcatA.port=8009
worker.TomcatA.host=172.16.50.100
worker.TomcatA.type=ajp13
worker.TomcatA.lbfactor=1
worker.stat1.type = status

②负载均衡

模块配置文件:mod_jk.conf

LoadModule  jk_module  modules/mod_jk.so
JkWorkersFile  /etc/httpd/conf.d/workers.properties
JkLogFile  logs/mod_jk.log
JkLogLevel  debug
JkMount  /*  lbcluster1
JkMount  /status/  stat1

workers配置文件:workers.properties

worker.list = lbcluster1,stat1
worker.TomcatA.type = ajp13
worker.TomcatA.host = 172.16.50.100
worker.TomcatA.port = 8009
worker.TomcatA.lbfactor = 1
worker.TomcatB.type = ajp13
worker.TomcatB.host = 172.16.50.103
worker.TomcatB.port = 8009
worker.TomcatB.lbfactor = 1
worker.lbcluster1.type = lb
worker.lbcluster1.sticky_session = 0
worker.lbcluster1.balance_workers = TomcatA, TomcatB
worker.stat1.type = status

方法二:Session Cluster

构建步骤:

(1)各节点配置使用deltamanager

<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.0.1.7"
                  port="45564"
                  frequency="500"
                  dropTime="3000"/>
      <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                  address="auto"
                  port="4000"
                  autoBind="100"
                  selectorTimeout="5000"
                  maxThreads="6"/>

       <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"/>

       <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                 tempDir="/tmp/war-temp/"
                 deployDir="/tmp/war-deploy/"
                 watchDir="/tmp/war-listen/"
                 watchEnabled="false"/>

       <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
       </Cluster>

(2)为需要使用session cluster的webapps开启session distribution的功能

WEB-INF/web.xml中添加:<distributable/>

方法三:构建session server(通过memcached)

下载如下jar文件至各tomcat节点的tomcat安装目录下的lib目录中,其中的${version}要换成你所 需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。

memcached-session-manager-${version}.jar

memcached-session-manager-tc${6,7,8}-${version}.jar

spymemcached-${version}.jar

msm-javolution-serializer-${version}.jar

javolution-${version}.jar

分别在两个tomcat上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器,如下所示

<Context path="/test" docBase="/usr/local/tomcat/webapps/test" reloadable="true">
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
        memcachedNodes="n1:172.16.50.101:11211,n2:172.16.50.102:11211"
        failoverNodes="n1"
        requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
        transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
     />
</Context>

在172.16.50.104上配置反向代理的负载均衡内容,类似如下所示:

<Proxy balancer://tomcat>
    BalancerMember  http://172.16.50.100:8080 loadfactor=1
    BalancerMember  http://172.16.50.103:8080 loadfactor=1
    ProxySet  lbmethod=byrequests
</Proxy>

ProxyVia Off
ProxyRequests Off
ProxyPass / balancer://tomcat/
ProxyPassReverse / balancer://tomcat/
<Proxy *>
    Request all granted
</Proxy>

<Location />
    Request all granted
</Location>

分别为两个context提供测试页面

tomcatA

<%@ 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>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

tomcatB

<%@ page language="java" %>
<html>
  <head><title>TomcatB</title></head>
  <body>
    <h1><font color="blue">TomcatB.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>
      <tr>
        <td>Created on</td>
        <td><%= session.getCreationTime() %></td>
     </tr>
    </table>
  </body>
</html>

测试结果,在浏览器中访问http://172.16.50.104/test,结果如下所示,其session ID在负载均衡环境中保持不变。

时间: 2024-10-20 04:36:41

tomcat构建及session保持的相关文章

基于Tomcat构建LNMT架构的网站并实现Session保持

简介 LNMT=Linux+Nginx+MySQL+Tomcat: Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器: 在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选: 架构需求 Tomcat实现JSP动态请求解析的基本架构 说明:由后端Tomcat负责解析动态jsp请求,但为了提高响应性能,在同一主机内配置Nginx做反向代理,转发所有请求至tomcat即可: 完整的LNMT架构设计 说明:本篇博客主要讲解单台Hapro

Apache/Nginx+Tomcat+Memcahced实现session管理

一.memcached简介 Memcached是一个免费开源.高性能.分布式的内存对象缓存系统.Memcached是在内存中,为特定数据(字符串或对象)构建key-value的小块数据存储. Memcached项目地址: http://www.memcached.org/ 现在最新版本为1.4.22,时间点:2015.01.26 二.实验环境介绍 第一个实验:我们在node3节点实现一个LNMP架构,测试memcached的基本的使用和web gui界面管理: 第二个实验:我们将node3节点当

Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster 大纲

Apache Httpd负载均衡Tomcat并实现Session Sticky和Session Cluster 大纲 前言 实验拓扑 实验步骤 安装配置tomcat 安装配置Apache Httpd并测试 实现session sticky 实现Session Cluster 总结 前言 上篇文章我们介绍如何构建一个LANMT平台并搭建一个jspxcms, 这次我们介绍使用apache httpd负载均衡Tomcat并实现Session Sticky和Session Cluster 实验拓扑 实验

Httpd+Tomcat+memcached实现session server

何为会话保持 会话保持是负载均衡最常见的问题之一,也是一个相对比较复杂的问题.会话保持有时候又叫做粘滞会话(Sticky Sessions).会话保持是指在负载均衡器上的一种机制,可以识别客户端与服务器之间交互过程的关连性,在作负载均衡的同时还保证一系列相关连的访问请求会保持分配到一台服务器上 何时需要会话保持 在讨论这个问题前,我们必须先花点时间弄清楚一些概念:什么是连接(Connection).什么是会话(Session),以及这二者之间的区别.需要特别强调的是,如果我们仅仅是谈论负载均衡,

使用spring+hibernate+atomikos+tomcat构建分布式事务

本文通过一个demo,介绍如何使用spring+hibernate+atomikos+tomcat构建在一个事务中涉及两个数据源的web应用. demo功能:实现一个能成功提交和回滚的涉及两个数据库数据源的XA事务. demo将实现: 1.一次性在两个数据库的两张表中各插入一条数据并提交. 2.一次性在两个数据库的两张表中各插入一条数据并回滚. 测试方式:restful web api 使用工具: spring 4.1.1.RELEASE hibernate 4.2.4.Final atomik

[转]Tomcat中的Session小结

阅读目录 什么是Session Session的目的 实现机制 Tomcat中的session实现 session存在的问题 什么是Session 对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap: Session的目的 Http协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录: Session的主要目的就是为了弥补Http的无状态特性.简单的说,就是服务器可以利用sess

eclipse+maven+tomcat构建web工程

我们要利用Maven构建一个web应用,开发环境为eclipse+tomcat.构建过程如下: 1.工具准备 eclipse:版本为eclipse 4.2(Juno Service),maven插件的安装与配置参见"m2eclipse安装与配置" tomcat:版本为apache-tomcat-6.0.37(即tomcat6.x系列,本文安装在D:\work\tomcat6\apache-tomcat-6.0.37-maven) 2.建立web应用 我们使用eclipse建立maven

tomcat实现session集群及tomcat+memcached共享session存储(四)

接博客nginx或httpd实现负载均衡tomcat(三) tomcat实现会话管理原理及实现: tomcat管理会话使用的专用的会话管理组件,tomcat的会话管理器有4种: 1.标准会话管理器(StanderdManager) 2.持久会话管理器(PersistentManager可以基于文件存储(FileStore)或JDBC存储(JDBCStore)) 基于JDBC的话就可以实现高可用tomcat的session集群. 1.DeltaManager会话管理器 2.BackupManage

Apache 如何反响代理tomcat并且实现Session保持

简介 LAMT=Linux+Apache+MySQL+Tomcat: Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器: 在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选: 架构需求 Tomcat实现JSP动态请求解析的基本架构 说明:由后端Tomcat负责解析动态jsp请求,但为了提高响应性能,在同一主机内配置Apache做反向代理,转发所有请求至tomcat即可: 完整的LNMT架构设计 说明:本篇博客主要讲解单台Hap