15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 7.Tomcat之参数配置

7.Tomcat之参数配置

时间:2023-06-30 16:33:01 | 来源:网站运营

时间:2023-06-30 16:33:01 来源:网站运营

7.Tomcat之参数配置:

0.连接器和线程池的重要参数

线程池参数

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> name线程池名称用于 Connector中指定namePrefix所创建的每个线程的名称前缀一个单独的线程名称为 namePrefix+threadNumbermaxThreads池中最大线程数默认值200minSpareThreads活跃线程数也就是核心池线程数这些线程不会被销毁会一直存在默认值10maxIdleTime线程空闲时间超过该时间后空闲线程会被销毁默认值为60001分钟),单位毫秒当核心线程数满了之后新来的任务会添加到阻塞队列当队列满了之后才会创建非核心线程因为上述用的阻塞队列是无界队列所以不会创建非核心线程 即该时间也没用maxQueueSizelinkedQueue在被执行前最大线程排队数目默认为Int的最大值也就是广义的无限除非特殊情况这个值不需要更改否则会有请求不会被处理的情况发生默认:Integer.MAX_VALUEprestartminSpareThreads启动线程池时是否启动 minSpareThreads部分线程默认值为false即不启动threadPriority线程池中线程优先级默认值为5值从1到10className线程池实现类未指定情况下默认实现类为org.apache.catalina.core.StandardThreadExecutor如果想使用自定义线程池首先需要实现 org.apache.catalina.Executor接口 ...线程池的设置要考虑任务类型IO型还是计算密集型还要兼顾机器的性能连接器参数博客

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="10000" redirectPort="8443" maxConnections="2" maxThreads="2" acceptCount="2"/>port:端口protocol:协议connectionTimeout:是建立TCP连接后等待第一次客户端发送请求的超时时间如果超过则会断开连接默认值是60000mskeepAlivedTime:是客户端发送完第一次请求后到第二次的间隔超时时间时间重要参数

Connector处理连接的过程就像是就餐的过程

1.acceptCount就是预约的人数限制,maxConnections就是餐厅中的位置限制,maxThreads就是厨师的数量 在BIO模型中,一个厨师只能给一个餐桌做饭,所以maxConnections=maxThreads,在NIO中一个厨师可以给 多个餐桌做饭,所以maxConnections>maxThreads.

2.当maxConnections还没有满时,就是有空位,不用预约直接就可以进来,如果里面坐满了,就是去外面排队预约 而最多预约acceptCount个,再来的人就会拒绝。

3.maxConnections为10,maxThreads为2,acceptCount为5 连接10个,等待5个,每次处理2个。

思考

问题:https://segmentfault.com/q/1010000011412748

解释;https://stackoverflow.com/questions/29925681/tomcat-connector-relationship-between-connectiontimeout-and-keepalivetimeout

1.配置文件

1.Server.xml

是tomcat中容器的配置文件

<?xml version="1.0" encoding="UTF-8"?><!--关闭服务器的端口--><Server port="8005" shutdown="SHUTDOWN"> <!--日志形式输出服务器操作系统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> <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 name="Catalina"> <!-- 配置Connector共享线程池 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="200" minSpareThreads="100" maxIdleTime="60000" 时间是毫秒1分钟 maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/> 如果没有配置则各个connector用自己的线程池 --> <!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool"/> <!--executor指定共享线程池的名字 --> <!-- AJP协议监听端口 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> <!-- 默认使用的虚拟主机名称 当客户端请求指向的主机无效时 将交由默认的虚拟主机处理 默认主机名为localhost --> <Engine name="Catalina" defaultHost="localhost"> <!--For clustering, please take a look at documentation at: /docs/cluster-howto.html (simple how to) /docs/config/cluster.html (reference documentation) --> <!-- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> --> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <!-- Host 元素用于配置一个虚拟主机 它支持以下嵌入元素AliasClusterListenerValveRealmContext 如果在Engine下配置Realm 那么此配置将在当前Engine下的所有Host中共享 同样如果在Host中配置Realm 则在当前Host下的所有Context中共享 Context中的Realm优先级 > Host 的Realm优先级 > Engine中的Realm优先级 --> <!-- 1 name: 当前Host通用的网络名称 必须与DNS服务器上的注册信息一致 Engine中包含的Host必须存在一个名称与Engine的defaultHost设置一致 2 appBase 当前Host的应用基础目录 当前Host上部署的Web应用均在该目录下可以是绝对目录相对路径)。默认为webapps 3 unpackWARs 设置为true Host在启动时会将appBase目录下war包解压为目录设置为false Host将直接从war文件启动 4 autoDeploy 控制tomcat是否在运行时定期检测并自动部署新增或变更的web应用。(将改完的包放到tomcat里不用重新启动tomcat会自动重新部署 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 1 docBaseWeb应用目录或者War包的部署路径可以是绝对路径也可以是相对于 Host appBase的相对路径 2 pathWeb应用的Context 路径如果我们Host名为localhost 则该web应用访问的根路径为 http://localhost:8080/myApp。 --> <Context docBase="demon" path="/demon"> </Context> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <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> </Engine> </Service></Server>一个完整的Connector配置

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

2.多域名测试

发送域名---》hosts找域名对应的ip------》找不到后会去DNS去找IP----------》服务器(tomcat)

1.在server.xml中创建两个host

<Host name="flank1" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <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> <Host name="flank2" appBase="webapps2" unpackWARs="true" autoDeploy="true"> <!-- SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html --> <!-- <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> --> <!-- Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern="common" --> <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>
  1. 创建webapps2并将webapps1,webapps2的欢迎页修改用来区分。



3.在hosts文件中配置域名和ip的对应

4.启动tomcat测试 http://localhost:8080/ 此时已经找不到了,是因为没有localhost的主机名都被改成了flank1,flank2




3 tomcat-users.xml

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

2.WEB应用的配置

web应用的配置主要在web.xml文件中,该文件有两个地方一个是tomcat/conf下用来设置全部应用的默认设置,一个是web应用/WEB-INF下面是用来设置单个应用

2.1

用来设置当前应用的全局参数,可以在servlet中获取使用

<context-param> <param-name>database</param-name> <param-value>mysql</param-value> </context-param>public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("doGet....."); //获取context-param参数 String database = request.getServletContext().getInitParameter("database"); response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("<h1>" + database + "</h1>"); out.println("</body></html>"); }





2.2

会话设置,什么是会话?会话是客户端和服务器端的建立的TCP连接,在这个连接上可以发送多个http请求,因为http是无状态协议,所以在服务器端使用Session来记录用户,当浏览器第一次访问服务器时,会先创建Session,并把sessionID返回给浏览器,保存在cookie中,叫JSESSIONID, 等下次访问时就带上JSESSIONID,服务器根据id来查找对应的Session,这样服务器就可以知道是否是同一个浏览器发送的请求,如果没有设置cookie的过期时间,关闭浏览器后浏览器会清除所有的cookie,再打开访问浏览器就会创建一个新的连接,同时重新创建一个Session, 所以Session和Cookie都是用来进行会话跟踪的,服务器中的Session的存活时间是可以设置的。 会话跟踪:用来表示一个TCP连接上的请求是同一个用户,或者多个TCP连接上发送的请求是同一个用户




配置session和cookie,有两种方式可以在servlet代码中配置,也可以在web.xml文件中配置。

这些配置也可以在代码里面写<!-- 配置Session--> <session-config> <!--session的失效时间默认30分钟--> <session-timeout>30</session-timeout> <cookie-config> <!--默认的名字是JESSIONID也可以修改--> <name>JESSIONID-flank</name> <!--域名--> <domain>localhost</domain> <path>/</path> <!--注释信息--> <comment>Session Cookie</comment> <!--表示这个Cookie只能通过浏览器发送http请求携带过来不能通过JS发送--> <http-only>true</http-only> <!--如果为true则只有https的请求才能携带session信息--> <secure>false</secure> <!--Cookie的有效时间,一个小时--> <max-age>3600</max-age> </cookie-config> <!--跟踪模式使用COOKIE进行会话跟踪还有就是使用URL进行跟踪就是将SESSION在URL上进行赋值--> <tracking-mode>COOKIE</tracking-mode> </session-config>验证 服务器端通过代码

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("doGet....."); //获取context-param参数 String database = request.getServletContext().getInitParameter("database"); //获取sessionID String id = request.getSession().getId(); System.out.println("id = " + id); response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("<h1>" + database + "</h1>"); out.println("<h1>" + id + "</h1>"); out.println("</body></html>"); }浏览器端




2.3

<servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>com.example.demo.HelloServlet</servlet-class> <!--设置servlet的初始化参数只对当前servlet有效区别context-param--> <init-param> <!--可以用HttpServlet的getInitParameter方法来获取值--> <param-name>name</param-name> <param-value>tom</param-value> </init-param> <!-- 应用程序启动的时候加载该Servlet如果值<0则是当第一次访问时加载, 可以用servlet的init方法什么时候调用来体现. --> <load-on-startup>1</load-on-startup> <!--true:表示当前servlet可用可以接收请求--> <enabled>true</enabled> </servlet> <!--请求路径和servlet的映射--> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <!-- 配置应用的参数--> <context-param> <param-name>database</param-name> <param-value>mysql8.2</param-value> </context-param>

2.4

Listener用于监听servlet中的事件,例如context,request,session对象的创建,修改,删除,并触发响应的事件,主要用来对context,request,session对象的生命周期进行监控。

2.5

用来过滤资源请求及响应,经常用于认证,日志,加密,数据转换等操作,

<filter> <filter-name>myFilter</filter-name> <filter-class>com.example.demo.LanguageFilter</filter-class> <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>public class LanguageFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { //获取filter的配置参数 String language = filterConfig.getInitParameter("language"); System.out.println("filter-init: " + language); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("doFilter"); chain.doFilter(request, response); } @Override public void destroy() { System.out.println("destroy"); }}如果是springboot项目就不用配置方式了,使用注册MyFilterBean的方式来创建filter.和Intercepter的区别

2.6和

<!--欢迎页面--> <welcome-file-list> <!--尝试请求的顺序,从上到下--> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 当出现了异常时可以避免用户看到. 用来配置访问异常时定向到的页面,支持HTTP响应码和异常类两种形式--> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/505.html</location> <!--在servlet中使用i/0来造异常--> </error-page>





3. Tomcat的管理配置

tomcat提供了两个管理程序,在安装目录下的webapps下面有两个host-manager和manager,前者来管理虚拟主机,后者来管理web应用。

4.JVM的配置

tomcat的运行需要jdk环境,启动一个main方法会创建一个JVM实例,而Tomcat也是通过Bootstrap里的main方法启动,所以tomcat也是运行在JVM之上的, 当main方法运行结束,JVM实例也就结束了。 1.JVM内存模型图

2.JVM的配置选项,

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

堆内存=546.5+1365.5+68(from)+68(to)

5.Tomcat集群

1.安装两个tomcat,分别修改端口号 tomcat_01:关闭端口号8015-----Connector端口号8081-------AJP服务器间通信协议端口号8019 tomcat_02:关闭端口号8025-----Connector端口号8082-------AJP服务器间通信协议端口号8029 2.安装配置Nginx




  1. 修改tomcat的欢迎页面,运行tomcat01--->tomcat02---->nginx测试






5.2 负载均衡的策略

1). 轮询 最基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。 upstream serverpool{ server localhost:8888; server localhost:9999; } 参数说明:

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; }

5.3session 共享问题

session共享是集群中常见的问题,同一个用户访问两个节点,session不一样




解决方法1:ip_hash,一个用户固定的到一个服务器节点 解决方法2:通过tomcat集群广播session,每个节点都有一整套的session信息 1) 在Tomcat的conf/server.xml 配置如下: 2) 在Tomcat部署的应用程序 servlet_demo01 的web.xml 中加入如下配置 : 3) 配置完毕之后, 再次重启两个 Tomcat服务

上述方案,适用于较小的集群环境(节点数不超过4个),如果集群的节点数比较多的话,通过这种广播的形式来完成Session的复制,会消耗大量的网络带宽,影响服务的性能。 解决方法3:单点登录(Single Sign On), 简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,也是用来解决集群环境Session共享的方案之一 。

6.Tomcaat安全

安全包括哪些方面的安全?能做到什么程度呐?

配置安全 主要体现在tomcat有自带的manager和host-manager程序,同时提供了一个默认的端口8005可以来监听SHUTDOWN命令,如果没有修改用户访问到服务器时,可以通过telnet连接到服务器的对应端口发送命令来关闭服务器。另外当出现错误时要提供错误页面不能让用户看到堆栈记录。 1.删除webapps目录下的所有文件, 2.更改端口或指令 更改端口号和指令: 禁用8005端口: 3.添加错误页面 在webapps/ROOT目录下定义错误页面 404.html,500.html; 然后在tomcat/conf/web.xml中进行配置 , 配置错误页面: 404 /404.html 500 /500.html 这样配置之后,用户在访问资源时出现404,500这样的异常,就能看到我们自定义的错误页面,而不会看到异常的堆栈信息,提高了用户体验,也保障了服务的安全性。

应用安全 指的是后台系统的权限管理模块,通常是基于Springboot Security ,Apache Shiro 来实现,一般分为认证(登陆/单点登陆),授权(功能权限,数据权限)两个部分。

传输安全 ** 使用https进行数据加密,认证的安全传输 1.使用jdk提供的keytool工具生成免费的证书(这种证书是不被浏览器信任的)

之后生成密钥库文件

2. 将秘钥库文件 tomcatkey.keystore 复制到tomcat/ 目录下。 3. 配置tomcat/conf/server.xml

<!--添加一个连接器用来监听8443端口--><Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" schema="https" secure="true" SSLEnabled="true"> <SSLHostConfig certificateVerification="false"> <Certificate certificateKeystoreFile="tomcatkey.keystore" certificateKeystorePassword="tomcat" type="RSA" /> </SSLHostConfig> </Connector>4.重启tomcat测试



关键词:配置,参数

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭