Tomcat 服务器的配置主要集中于 conf 目录下的 catalina.policy、catalina.properties、context.xml、server.xml、tomcat-users.xml、web.xml 文件。

一、server.xml

server.xml tomcat 服务器的核心配置文件,包含了Tomcat 的 Servlet 容器

Catalina)的所有配置。由于配置的属性特别多,我们在这里主要讲解其中的一部分重要配置。

1.1 Server

Server 是server.xml 的根元素,用于创建一个Server 实例,默认使用的实现类是org.apache.catalina.core.StandardServer。

<Server port="8005" shutdown="SHUTDOWN">
		...
</Server>

port : Tomcat 监听的关闭服务器的端口。

shutdown: 关闭服务器的指令字符串。

Server内嵌的子元素为 Listener、GlobalNamingResources、Service。

默认配置的5Listener 的含义:

<!‐‐ 用于以日志形式输出服务器 、操作系统、JVM的版本信息 ‐‐>

<Listener className="org.apache.catalina.startup.VersionLoggerListener"

/>



<!‐‐ 用于加载(服务器启动) 和 销毁 (服务器停止) APR。 如果找不到APR库, 则会
输出日志, 并不影响Tomcat启动 ‐‐>

<Listener className="org.apache.catalina.core.AprLifecycleListener"
SSLEngine="on" />



<!‐‐ 用于避免JRE内存泄漏问题 ‐‐>

<Listener
className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />



<!‐‐ 用户加载(服务器启动) 和 销毁(服务器停止) 全局命名服务 ‐‐>

<Listener
className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"

/>



<!‐‐ 用于在Context停止时重建Executor 池中的线程, 以避免ThreadLocal 相关的内
存泄漏 ‐‐>

<Listener
className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />



GlobalNamingResources 中定义了全局命名服务:

<!‐‐ Global JNDI resources

Documentation at /docs/jndi‐resources‐howto.html

‐‐>

<GlobalNamingResources>

<!‐‐ Editable user database that can also be used by
UserDatabaseRealm to authenticate users

‐‐>

<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"

description="User database that can be updated and saved"



factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat‐users.xml" />

</GlobalNamingResources>

1.2 Service

该元素用于创建 Service 实例,默认使用 org.apache.catalina.core.StandardService。
默认情况下,Tomcat 仅指定了Service 的名称, 值为 "Catalina"。Service 可以内嵌的
元素为 : Listener、Executor、Connector、Engine,其中 : Listener 用于为Service添加生命周期监听器, Executor 用于配置Service 共享线程池,Connector 用于配置Service 包含的链接器, Engine 用于配置Service中链接器对应的Servlet 容器引擎。

<Service name="Catalina">
		...
</Service>

一个Server 服务器,可以包含多个Service 服务。

1.3 Executor

默认情况下,Service 并未添加共享线程池配置。 如果我们想添加一个线程池,可以添加如下配置:

<Executor name="tomcatThreadPool"
		namePrefix="catalina‐exec‐"
		maxThreads="200"
		minSpareThreads="100"
		maxIdleTime="60000"
		maxQueueSize="Integer.MAX_VALUE"
		prestartminSpareThreads="false"
		threadPriority="5"
		className="org.apache.catalina.core.StandardThreadExecutor"/>

属性说明:

属性

含义

name

线程池名称,用于 Connector中指定。


namePrefix

所创建的每个线程的名称前缀,一个单独的线程名称为

namePrefix+threadNumber

maxThreads

池中最大线程数。


minSpareThreads

活跃线程数,也就是核心池线程数,这些线程不会被销
毁,会一直存在。


maxIdleTime

线程空闲时间,超过该时间后,空闲线程会被销毁,默
认值为60001分钟),单位毫秒。


maxQueueSize

在被执行前最大线程排队数目,默认为Int的最大值,也
就是广义的无限。除非特殊情况,这个值不需要更改,
否则会有请求不会被处理的情况发生。


prestartminSpareThreads

启动线程池时是否启动 minSpareThreads部分线程。
默认值为false,即不启动。

threadPriority

线程池中线程优先级,默认值为5,值从110


className

线程池实现类,未指定情况下,默认实现类为
org.apache.catalina.core.StandardThreadExecutor
如果想使用自定义线程池首先需要实现
org.apache.catalina.Executor接口。

学习笔记:Tomcat服务器配置_Tomcat服务器配置

如果不配置共享线程池,那么Catalina 各组件在用到线程池时会独立创建。

1.4 Connector

Connector 用于创建链接器实例。默认情况下,server.xml 配置了两个链接器,一个支持HTTP 协议,一个支持AJP 协议。因此大多数情况下,我们并不需要新增链接器配置,只是根据需要对已有链接器进行优化。

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

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

属性说明:

  • port: 端口号,Connector 用于创建服务端Socket 并进行监听, 以等待客户端请求链接。如果该属性设置为0,Tomcat 将会随机选择一个可用的端口号给当前Connector 使用。
  • protocol : 当前Connector 支持的访问协议。 默认为 HTTP/1.1 , 并采用自动切换机制选择一个基于 JAVA NIO 的链接器或者基于本地APR的链接器(根据本地是否含有Tomcat 的本地库判定)。

如果不希望采用上述自动切换的机制, 而是明确指定协议, 可以使用以下值。

Http协议:

org.apache.coyote.http11.Http11NioProtocol , 非阻塞式 Java NIO 链接器
org.apache.coyote.http11.Http11Nio2Protocol , 非阻塞式 JAVA NIO2 链接器
org.apache.coyote.http11.Http11AprProtocol , APR 链接器

AJP协议 :

org.apache.coyote.ajp.AjpNioProtocol , 非阻塞式 Java NIO 链接器
org.apache.coyote.ajp.AjpNio2Protocol ,非阻塞式 JAVA NIO2 链接器
org.apache.coyote.ajp.AjpAprProtocol , APR 链接器
  • connectionTimeOut : Connector 接收链接后的等待超时时间, 单位为 毫秒。 -1 表示不超时。
  • redirectPort:当前Connector 不支持SSL请求, 接收到了一个请求, 并且也符合security-constraint 约束, 需要SSL传输,Catalina自动将请求重定向到指定的端口。
  • executor : 指定共享线程池的名称, 也可以通过maxThreads、minSpareThreads 等属性配置内部线程池。
  • URIEncoding : 用于指定编码URI的字符编码, Tomcat8.x版本默认的编码为 UTF-8 ,

Tomcat7.x 版本默认为ISO-8859-1

完整的配置如下:

<Connector port="8080"
					protocol="HTTP/1.1"
					executor="tomcatThreadPool"
					maxThreads="1000"
					minSpareThreads="100"
					acceptCount="1000"
					maxConnections="1000"
					connectionTimeout="20000"
					compression="on"
					compressionMinSize="2048"
					disableUploadTimeout="true"
					redirectPort="8443"
					URIEncoding="UTF‐8" />

1.5 Engine

Engine 作为Servlet 引擎的顶级元素,内部可以嵌入:Cluster、Listener、Realm、Valve和Host。

<Engine name="Catalina" defaultHost="localhost">
		...
</Engine>

属性说明:

  • name: 用于指定Engine 的名称, 默认为Catalina 。该名称会影响一部分Tomcat 的存储路径(如临时文件)。
  • defaultHost : 默认使用的虚拟主机名称, 当客户端请求指向的主机无效时, 将交由默认的虚拟主机处理, 默认为localhost

1.6 Host

Host 元素用于配置一个虚拟主机, 它支持以下嵌入元素:AliasClusterListenerValveRealmContext。如果在Engine下配置Realm, 那么此配置将在当前Engine下的所有Host中共享。 同样,如果在Host中配置Realm , 则在当前Host下的所有Context中共享。Context中的Realm优先级 > Host Realm优先级 > Engine中的Realm优先级。

<Host name="localhost" appBase="webapps" unpackWARs="true"
autoDeploy="true">
		...
</Host>

属性说明:

  • name: 当前Host通用的网络名称, 必须与DNS服务器上的注册信息一致。 Engine中包含的Host必须存在一个名称与EnginedefaultHost设置一致。
  • appBase: 当前Host的应用基础目录, 当前Host上部署的Web应用均在该目录下(可以是绝对目录,相对路径)。默认为webapps
  • unpackWARs: 设置为true, Host在启动时会将appBase目录下war包解压为目录。设置为false, Host将直接从war文件启动。
  • autoDeploy: 控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用。

通过给Host添加别名,我们可以实现同一个Host拥有多个网络名称,配置如下:

<Host name="www.web1.com" appBase="webapps" unpackWARs="true"
autoDeploy="true">
		<Alias>www.web2.com</Alias>
</Host>

这个时候,我们就可以通过两个域名访问当前Host下的应用(需要确保DNS或hosts中添加了域名的映射配置)。

1.8 Context

Context 用于配置一个Web应用,默认的配置如下:

<Context docBase="myApp" path="/myApp">
		....
</Context>

属性描述:

  • docBaseWeb应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于Host appBase的相对路径。
  • pathWeb应用的Context 路径。如果我们Host名为localhost, 则该web应用访问的根路径为: http://localhost:8080/myApp。

它支持的内嵌元素为:CookieProcessor, Loader, ManagerRealmResourcesWatchedResourceJarScannerValve

<Host name="www.tomcat.com" appBase="webapps" unpackWARs="true"
autoDeploy="true">

		<Context docBase="D:\servlet_project03" path="/myApp"></Context>

		<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
					prefix="localhost_access_log" suffix=".txt"
					pattern="%h %l %u %t "%r" %s %b" />

</Host>

二、tomcat-users.xml

该配置文件中,主要配置的是Tomcat的用户,角色等信息,用来控制Tomcat中manager, host-manager的访问权限。

三、Web应用配置

web.xml 是web应用的描述文件, 它支持的元素及属性来自于Servlet 规范定义 。 在Tomcat 中, Web 应用的描述信息包括 conf/web.xml 中的默认配置 以及 Web应用目录下 WEB-INF/web.xml 的定制配置。

学习笔记:Tomcat服务器配置_Tomcat服务器配置_02

3.1 ServletContext 初始化参数

我们可以通过添加ServletContext 初始化参数,它配置了一个键值对,这样我们可以在应用程序中使用 javax.servlet.ServletContext.getInitParameter() 方法获取参数。

<context‐param>
		<param‐name>contextConfigLocation</param‐name>
		<param‐value>classpath:applicationContext‐*.xml</param‐value>
		<description>Spring Config File Location</description>
</context‐param>

3.2 会话配置

用于配置Web应用会话,包括 超时时间、Cookie配置以及会话追踪模式。它将覆盖server.xml 和 context.xml 中的配置。

<session‐config>
	<session‐timeout>30</session‐timeout>
	<cookie‐config>
		<name>JESSIONID</name>
		<domain>www.itcast.cn</domain>
		<path>/</path>
		<comment>Session Cookie</comment>
		<http‐only>true</http‐only>
		<secure>false</secure>
		<max‐age>3600</max‐age>
	</cookie‐config>
	<tracking‐mode>COOKIE</tracking‐mode>
</session‐config>

配置解析:

1)session‐timeout : 会话超时时间,单位 分钟
2)cookie‐config: 用于配置会话追踪Cookie
			name:Cookie的名称
			domain:Cookie的域名
			path:Cookie的路径
			comment:注释
			http‐only:cookie只能通过HTTP方式进行访问,JS无法读取或修改,此项可以增
加网站访问的安全性。
			secure:此cookie只能通过HTTPS连接传递到服务器,而HTTP 连接则不会传递该
信息。注意是从浏览器传递到服务器,服务器端的Cookie对象不受此项影响。
			max‐age:以秒为单位表示cookie的生存期,默认为‐1表示是会话Cookie,浏览器
关闭时就会消失。

3)tracking‐mode :用于配置会话追踪模式,Servlet3.0版本中支持的追踪模式:
COOKIE、URL、SSL
			COOKIE : 通过HTTP Cookie 追踪会话是最常用的会话追踪机制, 而且
Servlet规范也要求所有的Servlet规范都需要支持Cookie追踪。
			URL : URL重写是最基本的会话追踪机制。当客户端不支持Cookie时,可以采
用URL重写的方式。当采用URL追踪模式时,请求路径需要包含会话标识信息,Servlet容器
会根据路径中的会话标识设置请求的会话信息。如:
http://www.myserver.com/user/index.html;jessionid=1234567890。
			SSL : 对于SSL请求, 通过SSL会话标识确定请求会话标识。

3.3 Servlet配置

Servlet 的配置主要是两部分,servlet 和 servlet-mapping :

<servlet>
	<servlet‐name>myServlet</servlet‐name>
	<servlet‐class>cn.itcast.web.MyServlet</servlet‐class>
	<init‐param>
		<param‐name>fileName</param‐name>
		<param‐value>init.conf</param‐value>
	</init‐param>
	<load‐on‐startup>1</load‐on‐startup>
	<enabled>true</enabled>
</servlet>

<servlet‐mapping>
	<servlet‐name>myServlet</servlet‐name>
	<url‐pattern>*.do</url‐pattern>
	<url‐pattern>/myservet/*</url‐pattern>
</servlet‐mapping>

配置说明:

1)servlet‐name : 指定servlet的名称, 该属性在web.xml中唯一。

2)servlet‐class : 用于指定servlet类名

3)init‐param: 用于指定servlet的初始化参数, 在应用中可以通过
HttpServlet.getInitParameter 获取。

4)load‐on‐startup: 用于控制在Web应用启动时,Servlet的加载顺序。 值小于0,
web应用启动时,不加载该servlet, 第一次访问时加载。

5)enabled: true , false 。 若为false ,表示Servlet不处理任何请求。

6)url‐pattern: 用于指定URL表达式,一个 servlet‐mapping可以同时配置多个 url‐
pattern。

Servlet 中文件上传配置:

<servlet>
		<servlet‐name>uploadServlet</servlet‐name>
		<servlet‐class>cn.itcast.web.UploadServlet</servlet‐class>
		<multipart‐config>
			<location>C://path</location>
			<max‐file‐size>10485760</max‐file‐size>
			<max‐request‐size>10485760</max‐request‐size>
			<file‐size‐threshold>0</file‐size‐threshold>
		</multipart‐config>
</servlet>

配置说明:

1)location:存放生成的文件地址。

2)max‐file‐size:允许上传的文件最大值。 默认值为‐1, 表示没有限制。

3)max‐request‐size:针对该 multi/form‐data 请求的最大数量,默认值为‐1, 表示
无限制。

4)file‐size‐threshold:当数量量大于该值时, 内容会被写入文件。

3.4 Listener配置

Listener用于监听servlet中的事件,例如context、request、session对象的创建、修改、删除,并触发响应事件。Listener是观察者模式的实现,在servlet中主要用于对context、request、session对象的生命周期进行监控。在servlet2.5规范中共定义了8种Listener。在启动时,ServletContextListener 的执行顺序与web.xml 中的配置顺序一致,停止时执行顺序相反。

<listener>
	<listener‐class>org.springframework.web.context.ContextLoaderListener</listener‐class>
</listener>

3.5 Filter配置

filter 用于配置web应用过滤器, 用来过滤资源请求及响应。 经常用于认证、日志、加密、数据转换等操作, 配置如下:

<filter>
		<filter‐name>myFilter</filter‐name>
		<filter‐class>cn.itcast.web.MyFilter</filter‐class>
		<async‐supported>true</async‐supported>
		<init‐param>
			<param‐name>language</param‐name>
			<param‐value>CN</param‐value>
		</init‐param>
</filter>

<filter‐mapping>
		<filter‐name>myFilter</filter‐name>
		<url‐pattern>/*</url‐pattern>
</filter‐mapping>

配置说明:

1)filter‐name: 用于指定过滤器名称,在web.xml中,过滤器名称必须唯一。

2)filter‐class : 过滤器的全限定类名, 该类必须实现Filter接口。

3)async‐supported: 该过滤器是否支持异步

4)init‐param :用于配置Filter的初始化参数, 可以配置多个, 可以通过
FilterConfig.getInitParameter获取

5)url‐pattern: 指定该过滤器需要拦截的URL。

3.6 欢迎页面配置

welcome-file-list 用于指定web应用的欢迎文件列表。

<welcome‐file‐list>
		<welcome‐file>index.html</welcome‐file>
		<welcome‐file>index.htm</welcome‐file>
		<welcome‐file>index.jsp</welcome‐file>
</welcome‐file‐list>

尝试请求的顺序,从上到下。

3.7 错误页面配置

error-page 用于配置Web应用访问异常时定向到的页面,支持HTTP响应码和异常类两种形式。

<error‐page>
		<error‐code>404</error‐code>
		<location>/404.html</location>
</error‐page>
<error‐page>
		<error‐code>500</error‐code>
		<location>/500.html</location>
</error‐page>
<error‐page>
		<exception‐type>java.lang.Exception</exception‐type>
		<location>/error.jsp</location>
</error‐page>

四、Tomcat管理配置

从早期的Tomcat版本开始,就提供了Web版的管理控制台,他们是两个独立的Web应用,位于webapps目录下。Tomcat 提供的管理应用有用于管理的Host的host-manager和用于管理Web应用的manager。

4.1 host-manager

Tomcat启动之后,可以通过 http://localhost:8080/host-manager/html 访问该Web应用。 host-manager 默认添加了访问权限控制,当打开网址时,需要输入用户名和密码(conf/tomcat-users.xml中配置) 。所以要想访问该页面,需要在conf/tomcat-users.xml 中配置,并分配对应的角色:

  • admin-gui:用于控制页面访问权限
  • admin-script:用于控制以简单文本的形式进行访问

配置如下:

<role rolename="admin‐gui"/>
<role rolename="admin‐script"/>
<user username="itcast" password="itcast" roles="admin‐script,admingui"/>

登录:

学习笔记:Tomcat服务器配置_Tomcat服务器配置_03

界面:

学习笔记:Tomcat服务器配置_Tomcat服务器配置_04

4.2 manager

manager的访问地址为 http://localhost:8080/manager, 同样, manager也添加了页面访问控制,因此我们需要为登录用户分配角色为:

<role rolename="manager‐gui"/>
<role rolename="manager‐script"/>
<user username="itcast" password="itcast" roles="admin‐script,admingui,
manager‐gui,manager‐script"/>

界面:

学习笔记:Tomcat服务器配置_Tomcat服务器配置_05

Server Status

学习笔记:Tomcat服务器配置_Tomcat服务器配置_06

五、JVM配置

最常见的JVM配置当属内存分配,因为在绝大多数情况下,JVM默认分配的内存可能不能够满足我们的需求,特别是在生产环境,此时需要手动修改Tomcat启动时的内存参数分配。

5.1 JVM内存模型图

学习笔记:Tomcat服务器配置_Tomcat服务器配置_07

5.2 JVM配置选项

windows 平台(catalina.bat):

set JAVA_OPTS=‐server ‐Xms2048m ‐Xmx2048m ‐XX:MetaspaceSize=256m ‐XX:MaxMetaspaceSize=256m ‐XX:SurvivorRatio=8

linux 平台(catalina.sh):

JAVA_OPTS="‐server ‐Xms1024m ‐Xmx2048m ‐XX:MetaspaceSize=256m ‐XX:MaxMetaspaceSize=512m ‐XX:SurvivorRatio=8"

参数说明 :

序号

参数

含义

1

-Xms

堆内存的初始大小

2

-Xmx

堆内存的最大大小


3


-Xmn

新生代的内存大小,官方建议是整个堆得

3/8


4


-XX:MetaspaceSize

元空间内存初始大小, 在JDK1.8版本之前配
置为 -XX:PermSize(永久代)


5


-XX:MaxMetaspaceSize

元空间内存最大大小, 在JDK1.8版本之前配
置为 -XX:MaxPermSize(永久代)


6

-XX:InitialCodeCacheSize

-XX:ReservedCodeCacheSize


代码缓存区大小


7


-XX:NewRatio

设置新生代和老年代的相对大小比例。这种
方式的优点是新生代大小会随着整个堆大小
动态扩展。如 -XX:NewRatio=3 指定老年代 /新生代为 3/1。 老年代占堆大小的 3/4,新生
代占 1/4 


8


-XX:SurvivorRatio

指定伊甸园区 (Eden) 与幸存区大小比例。如

-XX:SurvivorRatio=10 表示伊甸园区 (Eden)
是 幸存区 To 大小的 10 倍 (也是幸存区 From
的 10 )。 所以, 伊甸园区 (Eden) 占新生代
大小的 
10/12, 幸存区 From 和幸存区 To 每个占新生代的 1/12 。 注意, 两个幸存区永远是一样大的。

配置之后, 重新启动Tomcat ,访问:

学习笔记:Tomcat服务器配置_Tomcat服务器配置_08

六、Tomcat集群

6.1 简介

由于单台Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大时,单台Tomcat是扛不住的,这个时候,就需要搭建Tomcat的集群,而目前比较流行的做法就是通过Nginx来实现Tomcat集群的负载均衡。

学习笔记:Tomcat服务器配置_Tomcat服务器配置_09

6.2 环境准备

6.2.1 准备Tomcat

在服务器上, 安装两台tomcat, 然后分别改Tomcat服务器的端口号 :

8005 ‐‐‐‐‐‐‐‐‐> 8015 ‐‐‐‐‐‐‐‐‐> 8025
8080 ‐‐‐‐‐‐‐‐‐> 8888 ‐‐‐‐‐‐‐‐‐> 9999
8009 ‐‐‐‐‐‐‐‐‐> 8019 ‐‐‐‐‐‐‐‐‐> 8029

6.2.2 安装配置Nginx

在当前服务器上 , 安装Nginx , 然后再配置Nginx, 配置nginx.conf :

upstream serverpool{
		server localhost:8888;
		server localhost:9999;
}

server {
		listen 99;
		server_name localhost;
    
		location / {
				proxy_pass http://serverpool/;
		}
}

6.2.3 安装配置Nginx

在当前服务器上 , 安装Nginx , 然后再配置Nginx, 配置nginx.conf :

upstream serverpool{
		server localhost:8888;
		server localhost:9999;
}

server {
		listen 99;
		server_name localhost;
    
		location / {
				proxy_pass http://serverpool/;
		}
}

6.2.4 负载均衡策略

1)轮循

最基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺 序逐一分配到不同的后端服务器。

upstream serverpool{
		server localhost:8888;
		server localhost:9999;
}

参数说明:

参数

描述

fail_timeout

max_fails结合使用


max_fails

设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时
间内,所有针对该服务器的请求都失败了,那么认为该服务器会被
认为是停机了

fail_time

服务器会被认为停机的时间长度,默认为10s


backup

标记该服务器为备用服务器。当主服务器停止时,请求会被发送到
它这里

down

标记服务器永久停机了

2)weight权重

权重方式,在轮询策略的基础上指定轮询的几率。

upstream serverpool{
		server localhost:8888 weight=3;
		server localhost:9999 weight=1;
}

weight参数用于指定轮询几率,weight的默认值为1;weight的数值与访问比率成正比, 比如8888服务器上的服务被访问的几率为9999服务器的三倍。

此策略比较适合服务器的硬件配置差别比较大的情况。

3)ip_hash

指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直 发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

upstream serverpool{
		ip_hash;
		server 192.168.192.133:8080;
		server 192.168.192.137:8080;
}

6.2.5 Session共享方案

在Tomcat集群中,如果应用需要用户进行登录,那么这个时候,用于tomcat做了负载均 衡,则用户登录并访问应用系统时,就会出现问题 。

学习笔记:Tomcat服务器配置_Tomcat服务器配置_10

解决上述问题, 有以下几种方案:

1)ip_hash 策略

一个用户发起的请求,只会请求到tomcat1上进行操作,另一个用户发起的请求只在 tomcat2上进行操作 。那么这个时候,同一个用户发起的请求,都会通过nginx的 ip_hash策略,将请求转发到其中的一台Tomcat上。

2)Session复制

在servlet_demo01 工程中 , 制作session.jsp页面,分别将工程存放在两台 tomcat 的 webapps/ 目录下:

<%@ page contentType="text/html;charset=UTF‐8" language="java" %>
<html>
<head>
	<title>Title</title>
</head>
<body>
		TOMCAT ‐ 9999 :
		<br/>
		sessionID : <%= session.getId()%>
		<br/>
		<%
				Object loginUser = session.getAttribute("loginUser");
				if(loginUser != null && loginUser.toString().length()>0){
				out.println("session 有值, loginUser = " + loginUser);
				}else{
						session.setAttribute("loginUser","ITCAST");
						out.println("session 没有值");
				}
		%>
</body>
</html>

通过nginx访问,访问到的两台Tomcat出现的sessionID是不一样的:

学习笔记:Tomcat服务器配置_Tomcat服务器配置_11

上述现象,则说明两台Tomcat的Session各是各的,并没有进行同步,这在集群环境下是存在问题的。

Session同步的配置如下:

1)在Tomcat的conf/server.xml 配置如下:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>

2)在Tomcat部署的应用程序 servlet_demo01 的web.xml 中加入如下配置:

<distributable/>

3)配置完毕之后, 再次重启两个 Tomcat服务。

学习笔记:Tomcat服务器配置_Tomcat服务器配置_12

上述方案,适用于较小的集群环境(节点数不超过4个),如果集群的节点数比较多的话,通过这种广播的形式来完成Session的复制,会消耗大量的网络带宽,影响服务的性能。

6.2.6 SSO-单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,也是用来解决集群环境Session共享的方案之一 。

学习笔记:Tomcat服务器配置_Tomcat服务器配置_13

七、Tomcat安全

7.1 配置安全

1)删除webapps目录下的所有文件,禁用tomcat管理界面;

2)注释或删除tomcat-users.xml文件内的所有用户权限;

3)更改关闭tomcat指令或禁用;

tomcat的server.xml中定义了可以直接关闭 Tomcat 实例的管理端口(默认8005)。 可以通过 telnet 连接上该端口之后,输入 SHUTDOWN (此为默认关闭指令)即可关闭 Tomcat 实例(注意,此时虽然实例关闭了,但是进程还是存在的)。由于默认关闭 Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。

方案一:

更改端口号和指令:
<Server port="8456" shutdown="itcast_shut">

方案二:

禁用8005端口:
<Server port="‐1" shutdown="SHUTDOWN">

4)定义错误页面

在webapps/ROOT目录下定义错误页面 404.html,500.html;

然后在tomcat/conf/web.xml中进行配置,配置错误页面:

<error‐page>
		<error‐code>404</error‐code>
		<location>/404.html</location>
</error‐page>
<error‐page>
		<error‐code>500</error‐code>
		<location>/500.html</location>
</error‐page>

这样配置之后,用户在访问资源时出现404,500这样的异常,就能看到我们自定义的错误页面,而不会看到异常的堆栈信息,提高了用户体验,也保障了服务的安全性。

7.2 应用安全

在大部分的Web应用中,特别是一些后台应用系统,都会实现自己的安全管理模块(权限模块),用于控制应用系统的安全访问,基本包含两个部分:认证(登录/单点登录)和授权(功能权限、数据权限)两个部分。对于当前的业务系统,可以自己做一套适用于自己业务系统的权限模块,也有很多的应用系统直接使用一些功能完善的安全框架,将其集成到我们的web应用中,如:SpringSecurity、Apache Shiro等。

7.3 传输安全

7.3.1 HTTPS介绍

HTTPS的全称是超文本传输安全协议(Hypertext Transfer Protocol Secure),是一种网络安全传输协议。在HTTP的基础上加入SSL/TLS来进行数据加密,保护交换数据不被泄露、窃取。

SSL 和 TLS 是用于网络通信安全的加密协议,它允许客户端和服务器之间通过安全链接通信。SSL 协议的3个特性:

1)保密:通过SSL链接传输的数据时加密的。

2)鉴别:通信双方的身份鉴别,通常是可选的,单至少有一方需要验证。

3)完整性:传输数据的完整性检查。

从性能角度考虑,加解密是一项计算昂贵的处理,因为尽量不要将整个Web应用采用SSL 链接, 实际部署过程中, 选择有必要进行安全加密的页面(存在敏感信息传输的页面)采用SSL通信。

HTTPS和HTTP的区别主要为以下四点:

1)HTTPS协议需要到证书颁发机构CA申请SSL证书, 然后与域名进行绑定,HTTP不用申请证书;

2)HTTP是超文本传输协议,属于应用层信息传输,HTTPS 则是具有SSL加密的安全性传输协议,对数据的传输进行加密,相当于HTTP的升级版;

3)HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是8080,后者是8443。

4)HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

HTTPS协议优势:

1)提高网站排名,有利于SEO。谷歌已经公开声明两个网站在搜索结果方面相同,如果一个网站启用了SSL,它可能会获得略高于没有SSL网站的等级,而且百度也表明对安装了SSL的网站表示友好。因此,网站上的内容中启用SSL都有明显的SEO优势。

2)隐私信息加密,防止流量劫持。特别是涉及到隐私信息的网站,互联网大型的数据泄露的事件频频发生,网站进行信息加密势在必行。

3)浏览器受信任。 自从各大主流浏览器大力支持HTTPS协议之后,访问HTTP的网站都会提示“不安全”的警告信息。

7.3.2 Tomcat支持HTTPS

1)生成秘钥库文件。

keytool ‐genkey ‐alias tomcat ‐keyalg RSA ‐keystore tomcatkey.keystore

学习笔记:Tomcat服务器配置_Tomcat服务器配置_14

输入对应的密钥库密码, 秘钥密码等信息之后,会在当前文件夹中出现一个秘钥库文件:tomcatkey.keystore

2)将秘钥库文件 tomcatkey.keystore 复制到tomcat/conf 目录下。

3)配置tomcat/conf/server.xml

<Connector port="8443"
protocol="org.apache.coyote.http11.Http11NioProtocol"
		maxThreads="150" schema="https" secure="true" SSLEnabled="true">
		<SSLHostConfig certificateVerification="false">
				<Certificate certificateKeystoreFile="D:/DevelopProgramFile/apache‐tomcat‐8.5.42‐windows‐x64/apache‐tomcat‐8.5.42/conf/tomcatkey.keystore" certificateKeystorePassword="itcast" type="RSA" />
		</SSLHostConfig>
</Connector>

4)访问Tomcat ,使用https协议。

学习笔记:Tomcat服务器配置_Tomcat服务器配置_15

八、Tomcat性能调优

8.1 Tomcat性能测试

对于系统性能,用户最直观的感受就是系统的加载和操作时间,即用户执行某项操作的耗时。从更为专业的角度上讲,性能测试可以从以下两个指标量化。

1)响应时间:如上所述,为执行某个操作的耗时。大多数情况下,我们需要针对同一个操作测试多次,以获取操作的平均响应时间。

2)吞吐量:即在给定的时间内,系统支持的事务数量,计算单位为 TPS。

通常情况下,我们需要借助于一些自动化工具来进行性能测试,因为手动模拟大量用户的并发访问几乎是不可行的,而且现在市面上也有很多的性能测试工具可以使用,如:ApacheBench、ApacheJMeter、WCAT、WebPolygraph、LoadRunner。

8.1.1 ApacheBench

ApacheBench(ab)是一款ApacheServer基准的测试工具,用户测试Apache Server的服务能力(每秒处理请求数),它不仅可以用户Apache的测试,还可以用于测试Tomcat、Nginx、lighthttp、IIS等服务器。ApacheBench(ab)是一款ApacheServer基准的测试工具,用户测试Apache Server的服务能力(每秒处理请求数),它不仅可以用户Apache的测试,还可以用于测试Tomcat、Nginx、lighthttp、IIS等服务器。

1)安装

yum install httpd‐tools

2)查看版本号

ab ‐V

学习笔记:Tomcat服务器配置_Tomcat服务器配置_16

3)部署war包, 准备环境

A. 在Linux系统上安装Tomcat
		上传 : alt + p ‐‐‐‐‐‐‐> put D:/apache‐tomcat‐8.5.42.tar.gz
		解压 : tar ‐zxvf apache‐tomcat‐8.5.42.tar.gz ‐C /usr/local
		修改端口号:8005 , 8080 , 8009
B. 将资料中的war包上传至Tomcat的webapps下
		上传: alt + p ‐‐‐‐‐‐‐‐‐> put D:/ROOT.war
		启动Tomcat解压
C. 导入SQL脚本 , 准备环境

4)测试性能

ab ‐n 1000 ‐c 100 ‐p data.json ‐T application/json http://localhost:9000/course/search.do?page=1&pageSize=10

参数说明:

参数

含义描述

-n

在测试会话中所执行的请求个数,默认只执行一次请求

-c

一次产生的请求个数,默认一次一个

-p

包含了需要POST的数据文件

-t

测试所进行的最大秒数,默认没有时间限制

-T

POST数据所需要使用的Content-Type头信息

-v

设置显示信息的详细程度

-w

HTML表的格式输出结果,默认是白色背景的两列宽度的一张表

结果说明:

指标

含义

Server Software

服务器软件

Server Hostname

主机名

Server Port

端口号

Document Path

测试的页面

Document Length

测试的页面大小

Concurrency Level

并发数

Time taken for tests

整个测试持续的时间

Complete requests

完成的请求数量


Failed requests

失败的请求数量,这里的失败是指请求的连接服务器、
发送数据、接收数据等环节发生异常,以及无响应后超
时的情况。

Write errors

输出错误数量


Total transferred

整个场景中的网络传输量,表示所有请求的响应数据长
度总和,包括每个http响应数据的头信息和正文数据的
长度。


HTML transferred

整个场景中的HTML内容传输量,表示所有请求的响应数
据中正文数据的总和


Requests per second

每秒钟平均处理的请求数(相当于 LR 中的 每秒事务

数)这便是我们重点关注的吞吐率,它等于:Complete
requests / Time taken for tests


Time per request

每个线程处理请求平均消耗时间(相当于 LR 中的 平均
事务响应时间)用户平均请求等待时间

Transfer rate

平均每秒网络上的流量

Percentage of the
requests served within
a certain time (ms)


指定时间里,执行的请求百分比

重要指标:

参数

指标说明


Requests per
second

吞吐率:服务器并发处理能力的量化描述,单位是reqs/s,指的是
在某个并发用户数下单位时间内处理的请求数。某个并发用户数
下单位时间内能处理的最大请求数,称之为最大吞吐率。

这个数值表示当前机器的整体性能,值越大越好。

Time per
request

用户平均请求等待时间:从用户角度看,完成一个请求所需要的
时间

Time per
request:across
all concurrent
requests


服务器平均请求等待时间:服务器完成一个请求的时间

Concurrency
Level


并发用户数

8.2 Tomcat性能优化

8.2.1 JVM参数调优

Tomcat是一款Java应用,那么JVM的配置便与其运行性能密切相关,而JVM优化的重点则集中在内存分配和GC策略的调整上,因为内存会直接影响服务的运行效率和吞吐量,JVM垃圾回收机制则会不同程度地导致程序运行中断。可以根据应用程序的特点,选择不同的垃圾回收策略,调整JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改善程序运行性能。

1)JVM内存参数

参数

参数作用

优化建议


-server


启动Server,以服务端模式运行

服务端模式建议
开启


-Xms


最小堆内存

建议与-Xmx设置
相同


-Xmx


最大堆内存

建议设置为可用
内存的80%

-XX:MetaspaceSize

元空间初始值


-

XX:MaxMetaspaceSize


元空间最大内存


默认无限

-XX:MaxNewSize

新生代最大内存

默认16M


-XX:NewRatio

年轻代和老年代大小比值,取值为整
数,默认为2


不建议修改


-XX:SurvivorRatio

Eden区与Survivor区大小的比值,
取值为整数,默认为
8


不建议修改


原教程视频地址:【黑马程序员Java进阶教程Tomcat核心原理解析】