新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 站长技术 > 服务器

tomcat网络处理线程模型

时间:2019-11-27 16:31:14  来源:  作者:

虽然现在springboot微服务纵横都是用的jar包,但是还有很多使用的Tomcat。tomcat是servlet的容器,也是springboot默认集成的容器,有必要对他的网络线程模型做一下了解。

tomcat网络处理线程模型

 

(一) tomcat网络处理线程模型

  • ① BIO同步Servlet

一个请求,一个工作线程,CPU利用率低,tomcat7以下才使用这种,新版本不再使用,tomcat8默认NIO

tomcat网络处理线程模型

 

  • ② APR 异步Servlet

apr(Apache Portable Runtime/Apache可以执行运行库),Apache Http服务器的支持库。JINI的行还是调用Apache Http服务器的核心动态链接库来处理文件读取或者网络传输操作,tomcat 默认监听指定路径,如果有apr安全,则自动启用。

tomcat网络处理线程模型

 

  • ③ NIO异步Servlet

tomcat8开始,默认NIO方式,非阻塞读取请求信息,非堵塞处理下一个请求,完全异步。

tomcat网络处理线程模型

 

  • ④ NIO处理流程
  1. Acceptor接收器接受套接字。
  2. 接收器从缓存中检索nioChannel对象。
  3. Pollerthread将nioChannel注册到它的选择器IO事件中。
  4. 轮询器将nioChannel分配给一个work线程来处理请求。
  5. SocketProcessor完成对请求的处理和返回客户端。
tomcat网络处理线程模型

 

  • ⑤ 参数调优

不能靠经验猜测,需要不断调试,找出适应应用程序的合理配置。

  1. ConnectionTime ,默认 20s,适当调整减少时间。
  2. maxThreads处理连接的最大线程数,默认200,建议增大,但是不是越大越好的。
  3. acceptCount(backlog)等待接收accept的请求数量限制,默认100,建议增大,socket参数 min(accept,、proc/sys/net/core/omaxconn),如果acceptCount设置是100.操作系统设置的10,就按照10来,请求限制就是10。
  4. maxConnections最大连接处理器,默认 nio 1w,apr 8192, 建议不要调整。
  • ⑥ 连接数调整

tomcat能够接受到的连接数,acceptCount和connections,一个用户请求连接到accept queue队列,代表捂手成功,通过tcp的形式,收到一个通知给tomcat。 tomcat收到请求数量是根据1万,这1万个请求正在处理,线程,如果tomcat已经满了,请求都堆积到操作系统里面,操作系统acceptCount就是控制堆积数量的。windows这块,操作系统堆满了,tcp这块也堆满了直接关闭了请求了。
linux这块,不仅仅有队列,还有个tcp握手过程中的一个syn queue,linux也会在syn queue,这属于系统内核。

tomcat网络处理线程模型

 

总共连接数 = acceptCount+ connections

connections: Tomcat能接收的请求限制。

acceptCount: 超过Tomcat能接收的请求数以后,堆积在操作系统的数量(windows 和 linux 略有不同)。

什么时候需要调整connections?如何调整?

connections小于maxThread的时候,需要调大,最好是比预期的最高并发数要大20%;反 正是堆积到tomcat的work处理线程池中(堆积占内存)。举个简单的例子:cpu数量是5 maxThread是5,结果连接数据connections只有3,这不是浪费的了吗?直接调整connections的数量。

什么时候需要调整acceptCount?

想受理更多用户请求,却又不想堆积在tomcat中,利用操作系统来高效的堆积,可以调整为 最高并发数 ­ connections; 实际上不需要调整,tomcat默认100,linux默认128;最好是把连接控制交给应用程序,这 样方便管理。这是操作系统层面的,调整的比较少。一般都是调整connections。

SpringBoot的参数配置

JAVA -­jar web­demo­1.1.0.jar ­­--server.tomcat.max­connections=1 -- ­­server.tomcat.acceptCount=1

  • ⑦ 线程数调整

并发处理线程数调整

线程太少,CPU利用率过低,程序的吞吐量变小,资源浪费,容易堆积。
线程太多,上下文频繁切换,性能反而变低。

线程数调为多少合适?

场景代入:服务器配置2核,不考虑内存问题。
收到请求,java代码执行耗时50ms,等待数 据返回50ms。
理想的线程数量= (1 + 代码阻塞时间/代码执行时间) * cpu数量 。
实际情况是跑起代码,压测环境进行调试。不断调整线程数,将CPU打到80~90%的利用率。

SpringBoot的参数配置

java -jar web-demo-1.1.0.jar --­­server.tomcat.maxThreads=500

  • ⑧ 场景描述

有一家足疗店,只有两个足浴的位置。
假设一个足浴技师,接待一个客人需要30分钟,接待一个客人后,休息30分钟。
请问:这家需要几个技师?4个技师

tomcat网络处理线程模型

 

一个线程在一个cpu里面执行,请求执行需要50毫秒,休息50毫秒,理想的线程数量就是
cpu的数量 * (1+ 50ms/50ms),1个cpu就是2个线程。

(二)示例

  • ① 代码

WebDemoApplication

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;
import java.util.concurrent.Callable;

@SpringBootApplication
@RestController
@EnableAsync
public class WebDemoApplication {
 public static void main(String[] args) {
 SpringApplication.run(WebDemoApplication.class, args);
 }

 // 这个方法固定延时3秒,用于测试线程/连接数量控制
 @RequestMapping("/testCount")
 public String testCount() throws InterruptedException {
 Thread.sleep(3000);// connections acceptCount
 return "Success";
 }

 @RequestMapping("/test")
 public String benchmark() throws InterruptedException {
 System.out.println("访问test:" + Thread.currentThread().getName());

 // 这段代码,一直运算。
 for (int i = 0; i < 200000; i++) {
 new Random().nextInt();
 }
 // 50毫秒的数据库等待,线程不干活
 Thread.sleep(50L);
 return "Success";
 }

 // 异步支持
 @RequestMapping("/testAsync")
 public Callable<String> benchmarkAsync() throws InterruptedException {
 return new Callable<String>() {
 @Override
 public String call() throws Exception {
 System.out.println("访问testAsync:" + Thread.currentThread().getName());
 // 这段代码,一直运算。
 for (int i = 0; i < 200000; i++) {
 new Random().nextInt();
 }
 // 50毫秒的数据库等待,线程不干活
 Thread.sleep(50L);
 return "Success";
 }
 };
 }
}


application.yml

server:
 port: 8080

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>com.study.chapter-3</groupId>
 <artifactId>web-demo</artifactId>
 <version>1.1.0</version>

 <name>web-demo</name>
 <description>Tomcat调优代码</description>

 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.0.6.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>

 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 <java.version>1.8</java.version>
 </properties>

 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-configuration-processor</artifactId>
 <optional>true</optional>
 </dependency>
 </dependencies>

 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>
</project>
tomcat网络处理线程模型

 

  • ② 下载jmeter

https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/

tomcat网络处理线程模型

 


tomcat网络处理线程模型

 

jmeter的测试脚本,使用的时候保存成jmx,使用的时候加载这个jmx

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.0 r1840935">
 <hashTree>
 <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="测试计划" enabled="true">
 <stringProp name="TestPlan.comments"></stringProp>
 <boolProp name="TestPlan.functional_mode">false</boolProp>
 <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
 <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
 <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
 <collectionProp name="Arguments.arguments"/>
 </elementProp>
 <stringProp name="TestPlan.user_define_classpath"></stringProp>
 </TestPlan>
 <hashTree>
 <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="数量测试" enabled="true">
 <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
 <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
 <boolProp name="LoopController.continue_forever">false</boolProp>
 <stringProp name="LoopController.loops">1</stringProp>
 </elementProp>
 <stringProp name="ThreadGroup.num_threads">10</stringProp>
 <stringProp name="ThreadGroup.ramp_time">1</stringProp>
 <boolProp name="ThreadGroup.scheduler">false</boolProp>
 <stringProp name="ThreadGroup.duration"></stringProp>
 <stringProp name="ThreadGroup.delay"></stringProp>
 </ThreadGroup>
 <hashTree>
 <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true">
 <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
 <collectionProp name="Arguments.arguments"/>
 </elementProp>
 <stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
 <stringProp name="HTTPSampler.port">8080</stringProp>
 <stringProp name="HTTPSampler.protocol">http</stringProp>
 <stringProp name="HTTPSampler.contentEncoding"></stringProp>
 <stringProp name="HTTPSampler.path">/testCount</stringProp>
 <stringProp name="HTTPSampler.method">GET</stringProp>
 <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
 <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
 <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
 <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
 <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
 <stringProp name="HTTPSampler.connect_timeout"></stringProp>
 <stringProp name="HTTPSampler.response_timeout"></stringProp>
 </HTTPSamplerProxy>
 <hashTree/>
 <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true">
 <boolProp name="ResultCollector.error_logging">false</boolProp>
 <objProp>
 <name>saveConfig</name>
 <value class="SampleSaveConfiguration">
 <time>true</time>
 <latency>true</latency>
 <timestamp>true</timestamp>
 <success>true</success>
 <label>true</label>
 <code>true</code>
 <message>true</message>
 <threadName>true</threadName>
 <dataType>true</dataType>
 <encoding>false</encoding>
 <assertions>true</assertions>
 <subresults>true</subresults>
 <responseData>false</responseData>
 <samplerData>false</samplerData>
 <xml>false</xml>
 <fieldNames>true</fieldNames>
 <responseHeaders>false</responseHeaders>
 <requestHeaders>false</requestHeaders>
 <responseDataOnError>false</responseDataOnError>
 <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
 <assertionsResultsToSave>0</assertionsResultsToSave>
 <bytes>true</bytes>
 <sentBytes>true</sentBytes>
 <url>true</url>
 <threadCounts>true</threadCounts>
 <idleTime>true</idleTime>
 <connectTime>true</connectTime>
 </value>
 </objProp>
 <stringProp name="filename"></stringProp>
 </ResultCollector>
 <hashTree/>
 </hashTree>
 <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="参数调优测试用例" enabled="true">
 <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
 <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
 <boolProp name="LoopController.continue_forever">false</boolProp>
 <stringProp name="LoopController.loops">10</stringProp>
 </elementProp>
 <stringProp name="ThreadGroup.num_threads">1000</stringProp>
 <stringProp name="ThreadGroup.ramp_time">1</stringProp>
 <boolProp name="ThreadGroup.scheduler">false</boolProp>
 <stringProp name="ThreadGroup.duration"></stringProp>
 <stringProp name="ThreadGroup.delay"></stringProp>
 </ThreadGroup>
 <hashTree>
 <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true">
 <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
 <collectionProp name="Arguments.arguments"/>
 </elementProp>
 <stringProp name="HTTPSampler.domain">192.168.100.241</stringProp>
 <stringProp name="HTTPSampler.port">8080</stringProp>
 <stringProp name="HTTPSampler.protocol">http</stringProp>
 <stringProp name="HTTPSampler.contentEncoding"></stringProp>
 <stringProp name="HTTPSampler.path">test</stringProp>
 <stringProp name="HTTPSampler.method">GET</stringProp>
 <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
 <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
 <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
 <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
 <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
 <stringProp name="HTTPSampler.connect_timeout"></stringProp>
 <stringProp name="HTTPSampler.response_timeout"></stringProp>
 </HTTPSamplerProxy>
 <hashTree/>
 <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
 <boolProp name="ResultCollector.error_logging">false</boolProp>
 <objProp>
 <name>saveConfig</name>
 <value class="SampleSaveConfiguration">
 <time>true</time>
 <latency>true</latency>
 <timestamp>true</timestamp>
 <success>true</success>
 <label>true</label>
 <code>true</code>
 <message>true</message>
 <threadName>true</threadName>
 <dataType>true</dataType>
 <encoding>false</encoding>
 <assertions>true</assertions>
 <subresults>true</subresults>
 <responseData>false</responseData>
 <samplerData>false</samplerData>
 <xml>false</xml>
 <fieldNames>true</fieldNames>
 <responseHeaders>false</responseHeaders>
 <requestHeaders>false</requestHeaders>
 <responseDataOnError>false</responseDataOnError>
 <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
 <assertionsResultsToSave>0</assertionsResultsToSave>
 <bytes>true</bytes>
 <sentBytes>true</sentBytes>
 <url>true</url>
 <threadCounts>true</threadCounts>
 <idleTime>true</idleTime>
 <connectTime>true</connectTime>
 </value>
 </objProp>
 <stringProp name="filename"></stringProp>
 </ResultCollector>
 <hashTree/>
 <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true">
 <boolProp name="ResultCollector.error_logging">false</boolProp>
 <objProp>
 <name>saveConfig</name>
 <value class="SampleSaveConfiguration">
 <time>true</time>
 <latency>true</latency>
 <timestamp>true</timestamp>
 <success>true</success>
 <label>true</label>
 <code>true</code>
 <message>true</message>
 <threadName>true</threadName>
 <dataType>true</dataType>
 <encoding>false</encoding>
 <assertions>true</assertions>
 <subresults>true</subresults>
 <responseData>false</responseData>
 <samplerData>false</samplerData>
 <xml>false</xml>
 <fieldNames>true</fieldNames>
 <responseHeaders>false</responseHeaders>
 <requestHeaders>false</requestHeaders>
 <responseDataOnError>false</responseDataOnError>
 <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
 <assertionsResultsToSave>0</assertionsResultsToSave>
 <bytes>true</bytes>
 <sentBytes>true</sentBytes>
 <url>true</url>
 <threadCounts>true</threadCounts>
 <idleTime>true</idleTime>
 <connectTime>true</connectTime>
 </value>
 </objProp>
 <stringProp name="filename"></stringProp>
 </ResultCollector>
 <hashTree/>
 </hashTree>
 <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="异步Servlet参数调优测试用例" enabled="true">
 <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
 <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
 <boolProp name="LoopController.continue_forever">false</boolProp>
 <stringProp name="LoopController.loops">1</stringProp>
 </elementProp>
 <stringProp name="ThreadGroup.num_threads">1000</stringProp>
 <stringProp name="ThreadGroup.ramp_time">2</stringProp>
 <boolProp name="ThreadGroup.scheduler">false</boolProp>
 <stringProp name="ThreadGroup.duration"></stringProp>
 <stringProp name="ThreadGroup.delay"></stringProp>
 </ThreadGroup>
 <hashTree>
 <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true">
 <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
 <collectionProp name="Arguments.arguments"/>
 </elementProp>
 <stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
 <stringProp name="HTTPSampler.port">8080</stringProp>
 <stringProp name="HTTPSampler.protocol">http</stringProp>
 <stringProp name="HTTPSampler.contentEncoding"></stringProp>
 <stringProp name="HTTPSampler.path">testAsync</stringProp>
 <stringProp name="HTTPSampler.method">GET</stringProp>
 <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
 <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
 <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
 <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
 <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
 <stringProp name="HTTPSampler.connect_timeout"></stringProp>
 <stringProp name="HTTPSampler.response_timeout"></stringProp>
 </HTTPSamplerProxy>
 <hashTree/>
 <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
 <boolProp name="ResultCollector.error_logging">false</boolProp>
 <objProp>
 <name>saveConfig</name>
 <value class="SampleSaveConfiguration">
 <time>true</time>
 <latency>true</latency>
 <timestamp>true</timestamp>
 <success>true</success>
 <label>true</label>
 <code>true</code>
 <message>true</message>
 <threadName>true</threadName>
 <dataType>true</dataType>
 <encoding>false</encoding>
 <assertions>true</assertions>
 <subresults>true</subresults>
 <responseData>false</responseData>
 <samplerData>false</samplerData>
 <xml>false</xml>
 <fieldNames>true</fieldNames>
 <responseHeaders>false</responseHeaders>
 <requestHeaders>false</requestHeaders>
 <responseDataOnError>false</responseDataOnError>
 <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
 <assertionsResultsToSave>0</assertionsResultsToSave>
 <bytes>true</bytes>
 <sentBytes>true</sentBytes>
 <url>true</url>
 <threadCounts>true</threadCounts>
 <idleTime>true</idleTime>
 <connectTime>true</connectTime>
 </value>
 </objProp>
 <stringProp name="filename"></stringProp>
 </ResultCollector>
 <hashTree/>
 </hashTree>
 </hashTree>
 </hashTree>
</jmeterTestPlan>

  • ③ 测试效果windows 和linux 机制不一样

一台双核4g的虚拟机,里面已经安装好了jdk8。上边代码的jar上传到虚拟机上。

java -jar web-demo-1.1.0.jar --­­server.tomcat.maxThreads=10 --server.tomcat.maxConnections=2 --server.tomcat.acceptCount=3
tomcat网络处理线程模型

 

jmeter加载上边写的测试脚本,修改服务器IP

tomcat网络处理线程模型

 

linux环境下,最大连接数是2,acceptCount=3,来了10个线程进行操作,每次操作2个,最后应该处理5个,因为2+3 =5,但是linux有等待机制。所以全部都处理完了。

tomcat网络处理线程模型

 

试试windows的环境下,启动命令跟linux一样。最大连接数是2,acceptCount=3,来了10个线程进行操作,每次操作2个,windows确实就处理了5个,剩余的直接抛弃掉了。

tomcat网络处理线程模型

 

  • ④ 1000个线程访问linux的程序

最大线程设置成4个。

java -jar web-demo-1.1.0.jar --server.tomcat.maxThreads=4

cpu利用率60.9% 有异常数据0.27%,响应的平均时间21s。

tomcat网络处理线程模型

 


tomcat网络处理线程模型

 

最大线程设置成200个。

java -jar web-demo-1.1.0.jar --server.tomcat.maxThreads=200

cpu利用率很高,但是异常数据很高。吞吐量变高99.9/sec。

tomcat网络处理线程模型

 


tomcat网络处理线程模型

 

就是不停的更换这个maxThreads 查看jmeter的结果,因为我是虚机很难很好的测试出结果

PS:请求多,CPU占用率高了,如果能接受很慢的响应,就加大。 否则就集群分流认清现实,优化代码才是王道,配置只能是锦上添花!tomcat基本不是单独使用的,基本要跟Nginx配合的,ngxin负责限流+日志记录。



Tags:tomcat   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
一、Tomcat顶层架构先上一张Tomcat的顶层结构图(图A),如下: Tomcat中最顶层的容器是Server,代表着整个服务器,从上图中可以看出,一个Server可以包含至少一个Service,用于具体提供服...【详细内容】
2020-03-17   tomcat  点击:(8)  评论:(0)  加入收藏
tomcat中的证书配置参数如下:<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true" scheme="https" secure="t...【详细内容】
2020-03-17   tomcat  点击:(6)  评论:(0)  加入收藏
目录的简单介绍 bin:启动和关闭tomcat的bat文件 conf:配置文件 server.xml该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host) web.xml文件配置与web应用(we...【详细内容】
2020-03-11   tomcat  点击:(5)  评论:(0)  加入收藏
前段时间和@lufei 大哥学习了一波Linux下基于文件描述符的反序列化回显方式的思路。在自己实现的过程中发现,是通过IP和端口号的筛选,从而过滤出当前线程(也可以说是请求)的文件...【详细内容】
2020-03-11   tomcat  点击:(9)  评论:(0)  加入收藏
前段时间和@lufei 大哥学习了一波Linux下基于文件描述符的反序列化回显方式的思路。在自己实现的过程中发现,是通过IP和端口号的筛选,从而过滤出当前线程(也可以说是请求)的文件...【详细内容】
2020-03-08   tomcat  点击:(5)  评论:(0)  加入收藏
2月22日消息 国家信息安全漏洞共享平台(CNVD)近日发布了一份关于 Apache Tomcat 存在文件包含漏洞的安全公告,具体如下:安全公告编号:CNTA-2020-00042020 年 1 月 6 日,国家信息安...【详细内容】
2020-02-22   tomcat  点击:(11)  评论:(0)  加入收藏
安全是系统架构中最重要的关注点之一,通常情况下,所说的安全涵盖网络安全、数据安全、操作系统安全、服务器安全以及应用系统安全等诸多方面。Tomcat 是一个免费的开放源代码 的Web应用服务器,技术先进、性能稳定。由于...【详细内容】
2020-02-19   tomcat  点击:(16)  评论:(0)  加入收藏
Service.xmlServer.xml配置文件用于对整个容器进行相关的配置。 <Server>元素:是整个配置文件的根元素。表示整个Catalina容器。 属性:className:实现了org.apache.catalina.Se...【详细内容】
2020-02-17   tomcat  点击:(14)  评论:(0)  加入收藏
Docker 安装 Nginxdocker pull nginx 命令安装查找 Docker Hub 上的 nginx 镜像runoob@runoob:~/nginx$ docker search nginxNAME DESCRIPTION STARS OFFICIAL AUTOMATEDngi...【详细内容】
2019-12-30   tomcat  点击:(19)  评论:(0)  加入收藏
Tomcat安装目录:C:\tomcat\apache-tomcat-8.5.15 Jdk8安装目录:C:\jdk 配置CATALINA_HOME 环境变量,指向tomcat的家目录 配置JAVA_HOME 配置环境变量配置CLASSPATH .;%JAVA_HOM...【详细内容】
2019-12-30   tomcat  点击:(35)  评论:(0)  加入收藏
很多情况下,我们在linux服务器上安装了tomcat或者nginx之类的软件. 当我们想用80端口的时候,如果不用root用户启动就会报错.这是因为,对于linux系统而言,1024以下的端口,普...【详细内容】
2019-12-30   tomcat  点击:(20)  评论:(0)  加入收藏
在Nginx反向代理转发tomcat这篇文章中,对nginx进行了简单的介绍,实现了nginx代理转发的功能,以及静态、动态资源分离的实现。本篇文章接着这篇文章继续写下去的,如果有不明白的...【详细内容】
2019-12-28   tomcat  点击:(3)  评论:(0)  加入收藏
web.xml简介web.xml是web应用的基础配置文件,但又不是必须的。web.xml主要用来配置Filter、Listener、Servlet等。我们常用的框架多数都要通过web.xml文件进行配置后才能引入...【详细内容】
2019-12-19   tomcat  点击:(29)  评论:(0)  加入收藏
随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说。要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日志的切割的变得刻不容缓。而且,切割后的日志,还可以定期清理掉久远的日志…...【详细内容】
2019-12-19   tomcat  点击:(22)  评论:(0)  加入收藏
Tomcat如何配置和优化,并不是每个工程师都需要掌握的内容。但如果你想成为一个架构师,就必须要学会本文的人内容了。在conf目录下存放着Tomcat的所有配置文件,而server.xml是其...【详细内容】
2019-12-18   tomcat  点击:(15)  评论:(0)  加入收藏
一、配置Tomcat/conf/server.xml修改配置<connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443" URIEncoding...【详细内容】
2019-12-17   tomcat  点击:(17)  评论:(0)  加入收藏
使用Idea的时候,修改了代码,需要反复的重启Tomcat,查看效果,是不是贼烦?还记得刚上手idea的时候,瞎配置部署Tomcat,结果最后修改一个jsp都要重新启动服务器,我这金牛座程序员能忍?~这...【详细内容】
2019-12-16   tomcat  点击:(27)  评论:(0)  加入收藏
我们都知道,get请求和post请求的一个比较显著区别就是,在使用post请求的时候,中文不会乱码,但是在使用get请求的时候,如果url后面带有中文就会乱码了。那么这个怎么解决呢? 前提:配...【详细内容】
2019-12-09   tomcat  点击:(27)  评论:(0)  加入收藏
客户端用户点击浏览器服务连接,浏览器通过客户端底层服务通过路由传送报文,目标服务器获取解析报文,Tomcat监听程序触发处理请求一、Tomcat 软件目录结构及功能 bin: 服务相关...【详细内容】
2019-12-09   tomcat  点击:(27)  评论:(0)  加入收藏
本文内容主要介绍了Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤,文章给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧!最近公司需要在Linux下监控t...【详细内容】
2019-12-05   tomcat  点击:(60)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条