Tomcat

Tomcat相关概念

官网:http://tomcat.apache.org/

Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP(Java Server Pages动态页面设计) 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,运行jsp和servlet,使用HTTP与客户端(通常是浏览器)进行通信。Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选,因为Tomcat 技术先进、性能稳定,成为目前比较流行的Web 应用服务器。Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展,但它是独立运行的。

JDK:java工具箱
JRE:java运行时环境
JVM:C语言研发,java虚拟机
ajp:AJP13是定向包协议,httpd支持此协议,nginx不支持
jsp:java server page
jasper:负责将.jsp 转换为 .java
applet:Applet或Java小应用程序是一种在Web环境下,运行于客户端的Java程序组件
servlet:全称Java Servlet, 是用Java编写的服务器端程序,其主要功能在于交互式地浏览和修改数据,
生成动态Web内容,将.java转换成字节码

tomcat和apache的区别

apache:侧重于http server 
tomcat:侧重于servlet引擎,如果以standalone方式运行,功能上与apache等效 , 支持JSP,但对静态网页不太理想; 
apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。 
换句话说,apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),而这个桶也可以不放在卡车上。

编程语言:

硬件级:微码编程,汇编语言
系统级:C,C++,…
应用级:Java, PHP, Python, Ruby, Perl, C#, …

程序:指令+数据
过程式编程:以指令为中心,数据服务于代码;
对象式编程:以数据为中心,指令服务于数据;
对象,方法(method)

Tomcat的安装

Tomcat是使用Java语言编写的程序,其运行的代码也是Java编写的,所以实现tomcat的应用需要在Java的虚拟机上运行。所以需要安装另一个软件:JDK

安装的方式分为两种:yum直接安装。下载最新版的rmp包来安装。

1 .yum安装的详细 步骤:

#yum install java-1.8.0-openjdk-devel  #安装jdk.;openjdk是开源的软件,不是oracle公司的jdk;类似于MySQL和mariad之间的关系。
# yum install tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp #安装tomcat及相关应用
#systemctl start tomcat  #开启tomcat服务
在浏览器上访问:http://192.168.130.11:8080/ #服务起来后就会看到tomcat的文档页面,因为安装时安装了文档tomcat-docs-webapp
# java -version  #查看java版本信息
# tomcat version  #查看tomcat版本信息

启动服务:

# systemctl start tomcat
# ss -tnl
LISTEN      0      1        ::ffff:127.0.0.1:8005  #管理端口,建议关闭
LISTEN      0      100        :::8009              #AJP协议默认监听端口
LISTEN      0      100        :::8080              #HTTP协议默认监听端口

tomcat的目录结构:

配置文件目录:/etc/tomcat/
主配置文件:server.xml
webapps存放位置:/var/lib/tomcat/webapps/
环境配置文件:/etc/sysconfig/tomcat

2 .官网下载包安装:

JDK下载的官网
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/
# rpm -ivh jdk-8u25-linux-x64.rpm  #解包
# ll /usr/java/  #默认安装路径
lrwxrwxrwx 1 root root  16 Jul 17 19:46 default -> /usr/java/latest 
drwxr-xr-x 9 root root 268 Jul 17 19:46 jdk1.8.0_25
lrwxrwxrwx 1 root root  21 Jul 17 19:46 latest -> /usr/java/jdk1.8.0_25
# vim /etc/profile.d/java.sh  #将java环境变量加入系统环境变量
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
# . /etc/profile.d/java.sh  让配置文件生效
安装tomcat:
官方下载地址:
#wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz 局域网下载
# yum install lftp # lftp
172.20.0.1/pub #共享资源里下载 cd ok, cwd=/pub lftp 172.20.0.1:/pub> cd Sources/7.x86_64/tomcat/ cd ok, cwd=/pub/Sources/7.x86_64/tomcat lftp 172.20.0.1:/pub/Sources/7.x86_64/tomcat> ls -rw-r--r-- 1 0 0 8968516 Nov 10 2017 apache-tomcat-7.0.78.tar.gz -rw-r--r-- 1 0 0 9584807 Jun 20 20:26 apache-tomcat-8.5.32.tar.gz -rw-r--r-- 1 0 0 64283906 Nov 10 2017 javaee-bbs-1.3.zip -rw-r--r-- 1 0 0 21588975 Nov 10 2017 solo-2.2.0.war lftp 172.20.0.1:/pub/Sources/7.x86_64/tomcat> mget apache-tomcat-8.5.32.tar.gz 9584807 bytes transferred lftp 172.20.0.1:/pub/Sources/7.x86_64/tomcat> bye # ls anaconda-ks.cfg hellodb_innodb.sql original-ks.cfg test ansible mariadb.sh Pictures vcl.load apache-tomcat-8.5.32.tar.gz media Public Videos Desktop Music Python-2.7.8.tgz Documents ~None seq.sh Downloads numgen.sh Templates # tar xf apache-tomcat-8.5.32.tar.gz -C /usr/local/ # cd /usr/local/ # ls apache-tomcat-8.5.32 etc include lib64 sbin src bin games lib libexec share # ln -sv apache-tomcat-8.5.32 tomcat #创建同名的软连接 ‘tomcat’ -> ‘apache-tomcat-8.5.32’ # ll total 0 lrwxrwxrwx 1 root root 20 Jul 18 14:19 tomcat -> apache-tomcat-8.5.32 # cd tomcat/ # pwd /usr/local/tomcat #useradd tomcat #创建tomcat用户作为运行tomcat程序的用户 #chown -R :tomcat ./* #改变tomcat文件夹下的文件属组 #chown -R tomcat logs/ temp/ work/ #将这三个文件的所有者改为tomcat所有 #chmod g+rw logs/ #chmod g+rw logs/* #给tomcat的 日志文件添加组的读和执行的权限,当在切换到tomcat用户时可以开启tomcat服务 #chmod g+rx conf/ #chmod g+rx conf/* #给tomcat的配置文件添加组的读和执行的权限,当在切换到tomcat用户时可以开启tomcat服务 #vim /etc/profile.d/tomcat.sh #创建文件将tomcat的程序加入到环境变量当中去,环境变量不用写绝对路径 export CATALINA_BASE=/usr/local/tomcat export PATH=$CATALINA_BASE/bin/:$PATH #. /etc/profile.d/tomcat.sh #让此配置文件生效 /usr/local/tomcat/bin下有个启动tomcat的脚本:catalina.sh #catalina.sh start #启动tomcat服务 #catalina.sh stop #停止服务 #catalina.sh –help #可以查看其他的命令 或者切换到tomcat用户 在开启服务,这样比较安全。 #su -tomcat #catalina.sh start (启动服务)
# ls -1 /usr/local/tomcat/
bin:脚本及启动时用到的类
conf:配置文件目录
lib:库文件,Java类库,jar
logs:日志文件目录
temp:临时文件目录
webapps:webapp的默认目录
work:工作目录
# catalina.sh --help
commands:
  debug             #调试模式启动
  jpda start        #jpda的debug模式启动
  run               #前台启动
  start             #后台启动
  stop              #关闭
  stop n            #n秒后关闭
  stop -force       #强制关闭
  stop n -force     #n秒后强制关闭
  configtest        #测试配置文件语法
  version           #查看相关版本信息
# catalina.sh version
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/latest
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.32
Server built:   Jun 20 2018 19:50:35 UTC
Server number:  8.5.32.0
OS Name:        Linux
OS Version:     3.10.0-862.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_25-b17
JVM Vendor:     Oracle Corporation

manager、host-manager和docs

依赖包:

  • tomcat-webapps
  • tomcat-admin-webapps
  • tomcat-docs-webapp

1、配置:manager管理webapps应用程序

# vim /etc/tomcat/tomcat-users.xml #添加
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui"/>
# systemctl restart tomcat
访问:http://192.168.130.8:8080/manager/进入管理页面

2、配置:host-manager管理虚拟主机

# vim /etc/tomcat/tomcat-users.xml  #添加
<role rolename="admin-gui"/> 
<role rolename="manager-gui"/>
<user username="admin" password="admin" roles="manager-gui,admin-gui"/>
 # systemctl restart tomcat
访问:http://192.168.130.8:8080/host-manager/进入管理页面

3、docs获取离线文档

访问:http://192.168.130.8:8080/docs/

Tomcat的配置参数

  • server.xml:主配置文件
  • web.xml:每个webapp只有“部署”后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置
  • context.xml:每个webapp都可以专用的配置文件,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认配置
  • tomcat-users.xml:用户认证的账号和密码文件
  • catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策略
  • catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与JVM调优相关参数
  • logging.properties:日志系统相关的配置

1、tomcat的核心组件:server.xml

配置文件框架:

<Server>
    <Service>
        <connector/>
        <Engine>
            <Host>
                <Context>
                    <Valve/>
                </Context/>
            </Host>
        </Engine>
    </Service>
</Server>

每一个组件都由一个Java“类”实现,这些组件大体可分为以下几个类型:

顶级组件:Server
服务类组件:Service
连接器组件:http, https, ajp(apache jserv protocol)
容器类:Engine, Host, Context
被嵌套类:valve, logger, realm, loader, manager, ...
集群类组件:listener, cluster, ...

2、Tomcat的常用组件配置:

  • Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收“SHUTDOWN”。各server监听的端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口;
  • Service:用于实现将一个或多个connector组件关联至一个engine组件;
  • Connector组件:负责接收请求,常见的有三类http/https/ajp;
port="8080" 监听的端口
protocol="HTTP/1.1" 协议
connectionTimeout="20000" 连接超时时间,单位ms,2秒
address:监听的IP地址;默认为本机所有可用地址;
maxThreads:最大并发连接数,默认为200;
enableLookups:是否启用DNS查询功能;
acceptCount:等待队列的最大长度;
secure:安全相关;
sslProtocol:加密传输相关;

  Engine组件:Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost属性来定义默认的虚拟主机;

name=
defaultHost="localhost"
jvmRoute=

  Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">
</Host>
appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以使用基于$CATALINA_BASE变量所定义的路径的相对路径;
autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至tomcat;

  Context组件:相当于nginx中的alias的功能

<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" reloadable=""/>
path:url路径
docBase:网页文件目录路径
  Valve组件:
定义访问日志:org.apache.catalina.valves.AccessLogValve
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
       prefix="localhost_access_log." suffix=".txt"
       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
定义访问控制:org.apache.catalina.valves.RemoteAddrValve
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172.16.100.67"/>

3、组件配置示例:

  配置示例:Host组件

[root@node1 ~]# vim /etc/tomcat/server.xml
<Host>
  ...
  <Host name="www.a.com" appBase="/web/apps" 
unpackWARs="true" autoDeploy="true"/> </Engine># mkdir -pv /web/apps/ROOT/# vim /web/apps/ROOT/index.jsp <%@ page language="java" %> <html> <head><title>TomcatA</title></head> <body> <h1><font color="red">TomcatA.a.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("a.com","a.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html># systemctl restart tomcat 测试访问:在centos图形界面上
#vim /etc/hosts
192.168.130.11   www.a.com
在图形界面的浏览器上:http:
//www.a.com:8080/

  配置示例:Context组件(相当于apache的别名作用)

# vim /etc/tomcat/server.xml
<Engine>
  ...
    <Host name="www.a.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
      <Context path="/testapp" docBase="/web/testapp" reloadable=""/>
    </Host>
</Engine># systemctl restart tomcat
# mkdir -pv /web/testapp/ROOT
# vim /web/testapp/index.jsp
...
测试访问:在centos图形界面上
#vim /etc/hosts
192.168.130.11   www.a.com
在图形界面的浏览器上:http://www.a.com:8080/testapp/

  配置示例:Valve组件

# vim /etc/tomcat/server.xml
<Host name="www.a.com" appBase="/web/apps" unpackWARs="true" autoDeploy="true">
  <Context path="/testapp" docBase="/web/testapp" reloadable="">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
      prefix="a_test_access_" suffix=".log"
      pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  </Context>
</Host>
[root@node1 ~]# systemctl restart tomcat
[root@node1 ~]# tail /var/log/tomcat/www_test_access_2018-07-19.log
192.168.130.8 - - [17/Jul/2018:22:59:30 +0800] "GET /testapp/ HTTP/1.1" 200 334

4、JSP WebAPP的组织结构:

index.jsp:主页;
WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
META-INF/:类似于WEB-INF/;
classes/:类文件,当前webapp所提供的类;
lib/:类文件,当前webapp所提供的类,被打包为jar格式;

5、webapp归档格式:

.war:webapp
.jar:EJB的类打包文件;
.rar:资源适配器类打包文件;
.ear:企业级webapp;

部署(deploy)webapp

deploy:将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能够基于web.xml和
context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的类通过class loader装载至JVM; undeploy:反部署,停止webapp,并从tomcat实例上卸载webapp; start:启动处于停止状态的webapp; stop:停止webapp,不再向用户提供服务;其类依然在jvm上; redeploy:重新部署; 部署可分为自动部署和手动部署;手动部署又有冷部署和热部署: 冷部署:把webapp复制到指定的位置,而后才启动tomcat; 热部署:在不停止tomcat的前提下进行部署;部署工具有manager、ant脚本、tcd(tomcat client
deployer)等;

示例:手动提供测试类应用,并冷部署

[root@node1 ~]# mkdir -pv /var/lib/tomcat/webapps/test/{classes,lib,WEB-INF}
[root@node1 ~]# vim /var/lib/tomcat/webapps/test/index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head>
        <title>Test Page</title>
    </head>
    <body>
        <% out.println("hello world");
        %>
    </body>
</html>
访问:http://192.168.130.11:8080/test/
hello world % %

实验:用nginx将服务反代到后台tomcat的服务器上去

将所有服务都反代到后台tomcat服务器

1 、 在调度器nginx上的配置:

#yum install nginx   #安装服务
#vim /etc/nginx/conf.d/test.conf   #配置代理服务器的配置文件
server {
  listen 80 default_server;
  server_name www.a.com;
  root /usr/share/nginx/html;
  location / {
  proxy_pass http://192.168.130.11:8080;
  }
}
#nginx #启动服务

2、在后台服务器tomcat上配置

#yum install java-1.8.0-openjdk-devel  #安装jdk
# yum install tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp #安装to
mcat及相关应用 #systemctl start tomcat #启动服务 #ss
-ntl #查看对应端口

3 、在测试的机器上:

#vim/etc/hosts
192.168.130.11 www.aa.com  #此IP地址为nginx反代服务器tomcat的地址
访问:在此机器上图形界面览器上打开网页:http://www.a.com:8080

实验:实现tomcat的负载均衡(使用nginx作为反代服务器)

1 .在nginx服务器上

#yum install nginx   #安装服务包
#vim /etc/nginx/nginx.conf
upstream www {
server 192.168.60.20:8080;
server 192.168.60.21:8080;
}   #添加后端tomcat服务器的IP地址
#vim /etc/nginx/conf.d/test.conf
server {
  listen 80 default_server;
  server_name www.aa.com;
  root /usr/share/nginx/html;
  location / {
  proxy_pass http://www;
   }
}        #默认的是轮询的调度算法
#nginx -s reload   #重新加载配置文件
#nginx   #开启服务

2 、在后台tomcatA服务器上

#yum install java-1.8.0-openjdk-devel
#yum install java-1.8.0-openjdk tomacat tomcat-docs-webapp tomcat-webapps
#cd   /usr/share/tomcat/webapps/ROOT/
删除原有的index.jsp的文件
#vim insex.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>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>
#systemctl restart tomcat

3、在后台tomcatB服务器上

#yum install java-1.8.0-openjdk-devel
#yum install java-1.8.0-openjdk tomacat tomcat-docs-webapp tomcat-webapps
#cd   /usr/share/tomcat/webapps/ROOT/
删除原有的index.jsp的文件
#vim insex.jsp   #新建测试文件
<%@ page language="java" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="red">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>
#systemctl restart tomcat

4、访问:http://192.168.130.10(nginx的IP)

实验:单个主机的调度(使用httpd作反代服务器)

[root@tomcat ~]# httpd -M |grep proxy
 proxy_module (shared) #代理模块
 proxy_ajp_module (shared) #适配ajp协议客户端
 proxy_balancer_module (shared)
 proxy_connect_module (shared)
 proxy_express_module (shared)
 proxy_fcgi_module (shared)
 proxy_fdpass_module (shared)
 proxy_ftp_module (shared)
 proxy_http_module (shared) #适配http协议客户端
 proxy_scgi_module (shared)
 proxy_wstunnel_module (shared)

配置Tomcat:

#yum install java-1.8.0-openjdk-devel
#yum install java-1.8.0-openjdk tomacat tomcat-docs-webapp tomcat-webapps
#cd /usr/share/tomcat/webapps/ROOT/
删除原有的index.jsp的文件
#vim insex.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>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>
#systemctl restart tomcat

配置httpd:

# vim /etc/httpd/conf.d/http-tomcat.conf
<VirtualHost *:80>
    ServerName www.a.com
    ProxyRequests Off  #关闭正向代理
    ProxyVia On
    ProxyPreserveHost On  #将请求头HOST发送给后端主机
    <Proxy *>
        Require all granted
    </Proxy>
     ProxyPass / http://192.168.130.11:8080/
    <Location />
        Require all granted
    </Location>
</VirtualHost>
[root@tomcat ~]# systemctl start httpd

访问:   

http://192.168.130.10

Tomcat的会话集群  

Session:

  在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

  在现今的互联网架构中会话保持越来越重要,但是会话的保持却在一定程度上依赖于提供服务的服务器上,随着并发量的不断提升,服务器最终会由于负载过高而宕机,因此引入了负载均衡机制,但是负载均衡的调度会使得同一用户的请求被调度到不同的主机之上,会严重的影响到session的保存。   

session cluster:delta session manager;会话集群,对带宽消耗较大,集群规模建议3-5台

  1. 默认多播地址:228.0.0.4
  2. 多播通信使用的端口:45564
  3. IP广播的方式来实现获取主机名,主机IP地址等,不能是监听在127.0.0.1
  4. 侦听复制消息的TCP端口是范围:4000-4100
  5. 必须配置集群会话监听器
  6. 各集群时间必须同步

前端nginx配置:

upstream tcsrvs {
        server 192.168.130.10:80;
        server 192.168.130.11:80;
}
server {
        listen 80;
        server_name a.com;
        location / {
                proxy_pass http://tcsrvs;
        }
}

tomcat-A:

# vim /data/webapp/ROOT/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>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>
# vim /etc/tomcat/server.xml
      <Host name="node1.dongfei.tech" appBase="/data/webapp" unpackWARs="true" autoDeploy="true">
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">
#channelSendOptions:发送消息的信道选项,0-15
          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>
#Manager:定义新的会话管理器DeltaManager
#expireSessionsOnShutdown:一旦把当前Tomcat节点关闭,是否将这节点的Tomcat会话失效,false表示不失效
#notifyListenersOnReplication:现在如果要发送资源同步给其他节点,是否通知侦听器资源变动,必须打开
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
             #McastService:多播通信
             #address:多播通信地址
             #port:端口
             #frequency:每隔多长时间发送一次自己的心跳信息,单位ms
             #dropTime:在3000ms内没有收到对方的心跳信息表示已经不是集群成员了
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.130.10"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>
             #NioReceiver:异步IO
             #address:监听地址,需要修改为集群成员通信的网卡
             #port:端口,如果不指定则自动选择4000-4100内从4000开始选择一个没有被占用的端口
             #autoBind:自动绑定
             #selectorTimeout:挑选器的超时时长
             #maxThreads:最大线程数,集群成员节点数 - 1
            <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>
#Channel:定义多播集群通信信道
#Membership:定义成员关系
#Receiver:接受器
#Sender:将自己的会话资源变动同步给其他节点
          <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.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
      prefix="localhost_access_log." suffix=".txt"
      pattern="%h %l %u %t &quot;%r&quot; %s %b" />

          </Host>
# mkdir /data/webapp/ROOT/WEB-INF
# cp /etc/tomcat/web.xml /data/webapp/ROOT/WEB-INF/
# vim /data/webapp/ROOT/WEB-INF/web.xml
    <distributable/>  #添加到web-app内
# systemctl restart tomcat

tomcat-B:

# vim /data/webapp/ROOT/index.jsp  #建测试页面
<%@ page language="java" %>
<html>
    <head><title>TomcatB</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>
# vim /etc/tomcat/server.xml
      <Host name="node2.dongfei.tech" appBase="/data/webapp" unpackWARs="true" autoDeploy="true">
        <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.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.0.11"
                      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.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
      prefix="localhost_access_log." suffix=".txt"
      pattern="%h %l %u %t &quot;%r&quot; %s %b" />

          </Host>
# mkdir /data/webapp/ROOT/WEB-INF
# cp /etc/tomcat/web.xml /data/webapp/ROOT/WEB-INF
# vim /data/webapp/ROOT/WEB-INF/web.xml
    <distributable/>  #添加到web-app内
# systemctl restart tomcat

访问:

http://192.168.130.8

使用mencached保存Tomcat会话信息

memcached:

  Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。这里主要是做为tomcat的session存储设备。

  session server:redis(store), memcached(cache);利用会话服务器保存会话信息

mencached配置:

# yum install memcached -y
# systemctl start memcached
# ss -tnl |grep 11211
LISTEN     0      128          *:11211                    *:*
LISTEN     0      128         :::11211                   :::*

msm配置:在tomcat服务器中配置

项目地址:

https://github.com/magro/memcached-session-manager
# mkdir msm
# cd msm
# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.0/memcached-session-manager-2.3.0.jar
# wget http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc7/2.3.0/memcached-session-manager-tc7-2.3.0.jar
# wget http://repo1.maven.org/maven2/net/spy/spymemcached/2.12.3/spymemcached-2.12.3.jar
# mkdir kryo
# cd kryo/
# wget http://repo1.maven.org/maven2/de/javakaffee/msm/msm-kryo-serializer/2.3.0/msm-kryo-serializer-2.3.0.jar
# wget http://repo1.maven.org/maven2/de/javakaffee/kryo-serializers/0.42/kryo-serializers-0.42.jar
# wget http://repo1.maven.org/maven2/com/esotericsoftware/kryo/4.0.2/kryo-4.0.2.jar
# wget http://repo1.maven.org/maven2/com/esotericsoftware/minlog/1.3.0/minlog-1.3.0.jar
# wget http://repo1.maven.org/maven2/com/esotericsoftware/reflectasm/1.11.7/reflectasm-1.11.7.jar
# wget http://repo1.maven.org/maven2/org/ow2/asm/asm/6.2/asm-6.2.jar
# wget http://repo1.maven.org/maven2/org/objenesis/objenesis/2.6/objenesis-2.6.jar
# tree msm/
msm/
├── kryo
│   ├── asm-6.2.jar
│   ├── kryo-4.0.2.jar
│   ├── kryo-serializers-0.42.jar
│   ├── minlog-1.3.0.jar
│   ├── msm-kryo-serializer-2.3.0.jar
│   ├── objenesis-2.6.jar
│   └── reflectasm-1.11.7.jar
├── memcached-session-manager-2.3.0.jar
├── memcached-session-manager-tc7-2.3.0.jar
└── spymemcached-2.12.3.jar
[root@tomcat-node-1 ~]# cp msm/*.jar /usr/share/java/tomcat/
[root@tomcat-node-1 ~]# scp msm/*.jar 192.168.130.11:/usr/share/java/tomcat/
[root@tomcat-node-1 ~]# scp msm/kryo/*.jar 192.168.130.11:/usr/share/java/tomcat/

tomcat-1配置:

# vim /etc/tomcat/server.xml
<Host name="node1.dongfei.tech" appBase="/data/webapp" unpackWARs="true" autoDeploy="true">
  <Context path="/" docBase="ROOT" reloadable="">
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="n1:192.168.130.10:11211,n2:192.168.130.11:11211"
      failoverNodes="n2"
      requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
      />
  </Context>
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
         prefix="node1-dongfei-tech_access." suffix=".log"
         pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
[root@tomcat-node-1 ~]# cat /data/webapp/ROOT/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>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
    </body>
</html>

tomcat-2配置:

# vim /etc/tomcat/server.xml
<Host name="node2.dongfei.tech" appBase="/data/webapp" unpackWARs="true" autoDeploy="true">
  <Context path="/" docBase="ROOT" reloadable="">
    <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
      memcachedNodes="n1:192.168.130.10:11211,n2:192.168.130.11:11211"
      failoverNodes="n2"
      requestUriIgnorePattern=".*.(ico|png|gif|jpg|css|js)$"
      transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
      />
  </Context>
  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
         prefix="node2-dongfei-tech_access." suffix=".log"
         pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
# vim  /data/webapp/ROOT/index.jsp
<%@ page language="java" %>
<html>
    <head><title>TomcatB</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>

访问:
http://192.168.130.8

Tomcat的常用优化配置

/etc/sysconfig/tomcat, /etc/tomcat/tomcat.conf

内存空间:

JAVA_OPTS="-server -Xms32g -Xmx32g -XX:NewSize= -XX:MaxNewSize= "
    -server:服务器模式
    -Xms:堆内存初始化大小;
    -Xmx:堆内存空间上限;
    -XX:NewSize=:新生代空间初始化大小;                    
    -XX:MaxNewSize=:新生代空间最大值;


线程池设置:

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
    maxThreads:最大线程数;
    minSpareThreads:最小空闲线程数;
    maxSpareThreads:最大空闲线程数;
    acceptCount:等待队列的最大长度;
    URIEncoding:URI地址编码格式,建议使用UTF-8;
    enableLookups:是否启用dns解析,建议禁用; 
    compression:是否启用传输压缩机制,建议“on";
    compressionMinSize:启用压缩传输的数据流最小值,单位是字节;
    compressableMimeType:定义启用压缩功能的MIME类型;
        text/html, text/xml, text/css, text/javascript

禁用8005端口;

<Server port="-1" shutdown="SHUTDOWN">

隐藏版本信息:

<Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000" redirectPort="8443" />
    Server="SOME STRING"

原文地址:https://www.cnblogs.com/yaun1498078591/p/9328557.html