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。
默认配置的5个Listener 的含义:
<!‐‐ 用于以日志形式输出服务器 、操作系统、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 | 线程空闲时间,超过该时间后,空闲线程会被销毁,默 |
maxQueueSize | 在被执行前最大线程排队数目,默认为Int的最大值,也 |
prestartminSpareThreads | 启动线程池时是否启动 minSpareThreads部分线程。 |
threadPriority | 线程池中线程优先级,默认值为5,值从1到10。 |
className | 线程池实现类,未指定情况下,默认实现类为 |
如果不配置共享线程池,那么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 元素用于配置一个虚拟主机, 它支持以下嵌入元素:Alias、Cluster、Listener、Valve、Realm、Context。如果在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必须存在一个名称与Engine的defaultHost设置一致。
- 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>
属性描述:
- docBase:Web应用目录或者War包的部署路径。可以是绝对路径,也可以是相对于Host appBase的相对路径。
- path:Web应用的Context 路径。如果我们Host名为localhost, 则该web应用访问的根路径为: http://localhost:8080/myApp。
它支持的内嵌元素为:CookieProcessor, Loader, Manager,Realm,Resources,WatchedResource,JarScanner,Valve。
<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 的定制配置。
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"/>
登录:
界面:
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"/>
界面:
Server Status
五、JVM配置
最常见的JVM配置当属内存分配,因为在绝大多数情况下,JVM默认分配的内存可能不能够满足我们的需求,特别是在生产环境,此时需要手动修改Tomcat启动时的内存参数分配。
5.1 JVM内存模型图
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版本之前配 |
5 | -XX:MaxMetaspaceSize | 元空间内存最大大小, 在JDK1.8版本之前配 |
6 | -XX:InitialCodeCacheSize -XX:ReservedCodeCacheSize | 代码缓存区大小 |
7 | -XX:NewRatio | 设置新生代和老年代的相对大小比例。这种 |
8 | -XX:SurvivorRatio | 指定伊甸园区 (Eden) 与幸存区大小比例。如 -XX:SurvivorRatio=10 表示伊甸园区 (Eden) |
配置之后, 重新启动Tomcat ,访问:
六、Tomcat集群
6.1 简介
由于单台Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大时,单台Tomcat是扛不住的,这个时候,就需要搭建Tomcat的集群,而目前比较流行的做法就是通过Nginx来实现Tomcat集群的负载均衡。
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做了负载均 衡,则用户登录并访问应用系统时,就会出现问题 。
解决上述问题, 有以下几种方案:
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的Session各是各的,并没有进行同步,这在集群环境下是存在问题的。
Session同步的配置如下:
1)在Tomcat的conf/server.xml 配置如下:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
2)在Tomcat部署的应用程序 servlet_demo01 的web.xml 中加入如下配置:
<distributable/>
3)配置完毕之后, 再次重启两个 Tomcat服务。
上述方案,适用于较小的集群环境(节点数不超过4个),如果集群的节点数比较多的话,通过这种广播的形式来完成Session的复制,会消耗大量的网络带宽,影响服务的性能。
6.2.6 SSO-单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,也是用来解决集群环境Session共享的方案之一 。
七、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
输入对应的密钥库密码, 秘钥密码等信息之后,会在当前文件夹中出现一个秘钥库文件: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性能调优
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
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 | 整个场景中的网络传输量,表示所有请求的响应数据长 |
HTML transferred | 整个场景中的HTML内容传输量,表示所有请求的响应数 |
Requests per second | 每秒钟平均处理的请求数(相当于 LR 中的 每秒事务 数)这便是我们重点关注的吞吐率,它等于:Complete |
Time per request | 每个线程处理请求平均消耗时间(相当于 LR 中的 平均 |
Transfer rate | 平均每秒网络上的流量 |
Percentage of the | 指定时间里,执行的请求百分比 |
重要指标:
参数 | 指标说明 |
Requests per | 吞吐率:服务器并发处理能力的量化描述,单位是reqs/s,指的是 这个数值表示当前机器的整体性能,值越大越好。 |
Time per | 用户平均请求等待时间:从用户角度看,完成一个请求所需要的 |
Time per | 服务器平均请求等待时间:服务器完成一个请求的时间 |
Concurrency | 并发用户数 |
8.2 Tomcat性能优化
8.2.1 JVM参数调优
Tomcat是一款Java应用,那么JVM的配置便与其运行性能密切相关,而JVM优化的重点则集中在内存分配和GC策略的调整上,因为内存会直接影响服务的运行效率和吞吐量,JVM垃圾回收机制则会不同程度地导致程序运行中断。可以根据应用程序的特点,选择不同的垃圾回收策略,调整JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改善程序运行性能。
1)JVM内存参数
参数 | 参数作用 | 优化建议 |
-server | 启动Server,以服务端模式运行 | 服务端模式建议 |
-Xms | 最小堆内存 | 建议与-Xmx设置 |
-Xmx | 最大堆内存 | 建议设置为可用 |
-XX:MetaspaceSize | 元空间初始值 | |
- XX:MaxMetaspaceSize | 元空间最大内存 | 默认无限 |
-XX:MaxNewSize | 新生代最大内存 | 默认16M |
-XX:NewRatio | 年轻代和老年代大小比值,取值为整 | 不建议修改 |
-XX:SurvivorRatio | Eden区与Survivor区大小的比值, | 不建议修改 |
原教程视频地址:【黑马程序员Java进阶教程Tomcat核心原理解析】