Tomcat配置与调优

Tomcat集群

Session复制配置方法

  • 在Tomcat的conf/server.xml 配置如下:
    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
    
  • 在Tomcat部署的应用程序 servlet_demo01 的web.xml 中加入如下配置 :
    <distributable/>
    

注意

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

Tomcat 安全

配置安全

  • 删除webapps目录下的所有文件,禁用tomcat管理界面;
  • 注释或删除tomcat-users.xml文件内的所有用户权限;
  • 更改关闭tomcat指令或禁用
    • tomcat的server.xml中定义了可以直接关闭 Tomcat 实例的管理端口(默认8005)。可以通过 telnet 连接上该端口之后,输入 SHUTDOWN (此为默认关闭指令)即可关闭Tomcat 实例(注意,此时虽然实例关闭了,但是进程还是存在的)。
    • 由于默认关闭Tomcat 的端口和指令都很简单。默认端口为8005,指令为SHUTDOWN 。
    方案一:更改端口号和指令:
    <Server port="8456" shutdown="itcast_shut">
    
    方案二:	禁用8005端口:
    <Server port="‐1" shutdown="SHUTDOWN">
    
  • 定义错误页面
    • 在webapps/ROOT目录下定义错误页面 404.html,500.html;
    • 用户在访问资源时出现404,500这样的异常,就能看到我们自定义的错误页面,而不会看到异常的堆栈信息,提高了用户体验,也保障了服务的安全性。
    • 然后在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>
    

应用安全

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

传输安全
Tomcat支持HTTPS

  • 生成秘钥库文件。

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

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

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

  • 配置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="yzx"  type="RSA" />
        </SSLHostConfig>
    </Connector>
    
  • 访问Tomcat ,使用https协议。
    在这里插入图片描述

Tomcat性能调优

JVM参数调优

  • Tomcat是一款Java应用,JVM的配置便与其运行性能密切相关,JVM优化的重点在内存分配和GC策略的调整上,因为内存会直接影响服务的运行效率和吞吐量,JVM垃圾回收机制则会不同程度地导致程序运行中断。

  • 根据应用程序的特点,选择不同的垃圾回收策略,调整JVM垃圾回收策略,可以极大减少垃圾回收次数,提升垃圾回收效率,改善程序运行性能。

  • JVM内存参数:

    • -server:启动Server,以服务端模式运行,服务端模式建议开启
    • -Xms :最小堆内存,建议与-Xmx设置相同
    • -Xmx :最大堆内存,建议设置为可用内存的80%
    • -XX:MetaspaceSize :元空间初始值
    • -XX:MaxMetaspaceSize:元空间最大内存 默认无限
    • -XX:MaxNewSize :新生代最大内存 默认16M
    • -XX:NewRatio:年轻代和老年代大小比值,取值为整数,默认为2,不建议修改
    • -XX:SurvivorRatio:Eden区与Survivor区大小的比值,取值为整数,默认为8,不建议修改

调优前后及对比

  • 调优前Tomcat默认垃圾回收器
    在这里插入图片描述

  • JVM调优

    vi bin/catalina.sh
    
    JAVA_OPTS="-server -Xms2g -Xmx2g -XX:MetaSpaceSize=256m -XX:MaxMetaSpaceSize=528m -XX:SurvivorRatio=8 -XX:USEConcMarkSweepGC -XX:+PrintGCDetails“
    
  • 调优后
    在这里插入图片描述

Tomcat配置调优
调整conf/server.xml中的连接器的配置maxThreads:池中最大线程数。

  • maxConnections:最大连接数,CPU密集型建议不要过高,CPU运算不密集的建议建议2000左右
  • acceptCount:最大等待数 多余的请求会放到等待队列(连接数=maxConnections+acceptCount,还多的会被拒绝)
  • maxThreads:最大线程数,根据硬件决定
<Connector port="8080"  
          protocol="HTTP/1.1"
          redirectPort="8443" 
          connectionTimeout="20000"
          URIEncoding="UTF‐8"
          maxConnections="1000"
          acceptCount="200"
          maxThreads="500"  />

Tomcat自带监控工具

tomcat-users.xml

  • 该配置文件中,主要配置的是Tomcat的用户,角色等信息,用来控制Tomcat中manager, host-manager的访问权限。
  • 从早期的Tomcat版本开始,就提供了Web版的管理控制台,他们是两个独立的Web应用,位于webapps目录下。Tomcat 提供的管理应用有用于管理的Host的host-manager和用于管理Web应用的manager。

host-manager

  • Tomcat启动之后,可以通过 http://localhost:8080/host-manager/html 访问该Web应用。

  • host-manager 默认添加了访问权限控制,当打开网址时,需要输入用户名和密码(conf/tomcat-users.xml中配置) 。

  • 所以要想访问该页面,需要在conf/tomcat-users.xml 中配置,并分配对应的角色:

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

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

    在这里插入图片描述

manager

  • manager 的访问地址为 http://localhost:8080/manager
  • manager也添加了页面访问控制,因此我们需要为登录用户分配角色
    <role rolename="manager‐gui"/>
    <role rolename="manager‐script"/>
    <user username="yzx" password="yzx" roles="admin‐script,admin‐gui,manager‐gui,manager‐script"/>
    
    在这里插入图片描述
    在这里插入图片描述

Tomcat核心配置server.xml

server.xml 是tomcat 服务器的核心配置文件,包含了Tomcat的 Servlet 容器(Catalina)的所有配置

  • Tomcat的server.xml配置文件符合Container 结构
    <Server>
    	<Service> 
    		<Connector/>
    		<Connector/>
    		<Engine>
    			<Host>
    				<Context></Context>
    			</Host>
    		</Engine>
    	</Service>
    </Server>
    

Server

  • 配置
    <Server port="8005" shutdown="SHUTDOWN">
    ...    
    </Server>
    
  • Server是server.xml的根元素,用于创建一个Server实例,默认使用的实现类是org.apache.catalina.core.StandardServer。
  • 子元素
    • port : Tomcat 监听的关闭服务器的端口。
    • shutdown: 关闭服务器的指令字符串。

Server子标签

  • Listener:监听器(默认5种)

    <!‐‐ 用于以日志形式输出服务器 、操作系统、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>	 
    
  • Service

    <Service name="Catalina">
    ...    
    </Service>
    
    • 一个Server服务器,可以包含多个Service服务。
    • 默认使用 org.apache.catalina.core.StandardService。
    • 默认情况下,Tomcat 仅指定了Service 的名称, 值为 “Catalina”。

Service子标签

  • Listener: 用于为Service添加生命周期监听器

  • Executor:用于配置Service 共享线程池(Service 默认并未添加共享线程池配置,如果不配置共享线程池,那么会给每个Connecto都独立创建一个线程池。)

    <Executor name="tomcatThreadPool"	#线程池名称,用于 Connector中指定。
    namePrefix="catalina‐exec‐"			#所创建的每个线程的名称前缀,一个单独的线程名称为namePrefix+threadNumber。
    maxThreads="200"					#池中最大线程数。
    minSpareThreads="100"				#活跃线程数,也就是核心池线程数,这些线程不会被销毁,会一直存在。
    maxIdleTime="60000"					#线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单位毫秒。
    maxQueueSize="Integer.MAX_VALUE"	#在被执行前最大线程排队数目,默认为Int的最大值,也就是广义的无限。除非特殊情况,这个值不需要更改,否则会有请求不会被处理的情况发生。
    prestartminSpareThreads="false"		#启动线程池时是否启动 minSpareThreads部分线程。默认值为false,即不启动。
    threadPriority="5"					#线程池中线程优先级,默认值为5,值从1到10。
    className="org.apache.catalina.core.StandardThreadExecutor"		#线程池实现类,未指定情况下,默认实现类为org.apache.catalina.core.StandardThreadExecutor。
    																#如果想使用自定义线程池首先需要实现org.apache.catalina.Executor接口。
    />
    
  • Connector: 用于配置Service 包含的链接器(默认情况下,server.xml 配置了两个链接器,分别支持HTTP协议、AJP协议。大多数情况下不需要新增链接器配置,只根据需要对已有链接器进行优化)

    <Connector port="8080" 			#端口号,Connector 用于创建服务端Socket 并进行监听, 以等待客户端请求链接。如果该属性设置为0,
    								# Tomcat将会随机选择一个可用的端口号给当前Connector使用。
    								
    	protocol="HTTP/1.1" 		#当前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="20000"	#Connector 接收链接后的等待超时时间, 单位为 毫秒。 -1 表示不超时。
    								
    	redirectPort="8443" 		#当前Connector 不支持SSL请求, 接收到了一个请求, 并且也符合security-constraint 约束, 需要SSL传输,Catalina自动将请求重定向到指定的端口。
    	/>
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    

    其余属性说明:

    • executor : 指定共享线程池的名称, 也可以通过maxThreads、minSpareThreads等属性配置内部线程池。
    • URIEncoding : 用于指定编码URI的字符编码, Tomcat8.x版本默认的编码为 UTF-8 ,Tomcat7.x版本默认为ISO-8859-1。
    • maxConnections:最大连接数,建议2000左右
    • acceptCount:最大等待数(连接数=maxConnections+acceptCount,还多的会被拒绝)
    • maxThreads:最大线程数
      <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" />
      
  • Engine:用于配置Service中链接器对应的Servlet 容器引擎

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

    子元素:

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

Engine子标签

  • Host:Host 元素用于配置一个虚拟主机
    <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应用。
    • 如果在Engine下配置Realm, 那么此配置将在当前Engine下的所有Host中共享。 同样,如果在Host中配置Realm , 则在当前Host下的所有Context中共享。
    • Context中的Realm优先级 > Host 的Realm优先级 > Engine中的Realm优先级。

Host子标签

  • Alias:给 Host添加别名(可以实现同一个Host拥有多个网络名称)

    <Host name="www.web1.com"  appBase="webapps" unpackWARs="true"
    		autoDeploy="true">
    		<Alias>www.web2.com</Alias>
    </Host>  
    
  • 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 &quot;%r&quot; %s %b" />	   
    </Host>
    
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页