• 一、Tomcat 配置
  • 二、Tomcat 性能调优

一、Tomcat 架构

  • Tomcat 是一个基于 Java 的 WEB容器,其实现了 JavaEE 中的 ServletJsp 规范。
  • NginxApache 服务器不同,在于一般用于 动态请求处理。
  • 在架构设计上,采用 面向组件 的方式设计。
  • 即整体功能是通过 组件的方式 拼装完成。
  • 另外 每个组件 都可以被替换以保证灵活性。


二、Tomcat 组件及关系



核心组件。

  • Server:服务器(1个)。
  • Service:服务(n个)。
  • Connector:连接器(n个)。
    指对外开放的端口号,有三种协议。
  1. HTTP/1.1。
  2. SSL https。
  3. AJP/1.3:Apache 私有协议,二进制传输(Apache JServ Protocol)。
    用于 Apache 反向代理 Tomcat。
  • Engine:引擎(1个)。
    默认:Catalina。
  • Host:虚拟机(n个)。
    基于域名(name)分发请求(默认:localhost)。
  • Context:指每个 WEB 应用(n个)。
    基于路径(path)分发请求(默认:ROOT)。
    每个 Context 的 ClassLoader 都是独立。

  • 其他组件(Component)。
  1. Manager:管理器。
  2. logger:日志管理。
  3. loader:载入器。
  4. pipeline:管道。
  5. Valve:管道的阀门。

三、server.xml 配置


  • BIO:同步阻塞 模型(Tomcat-6.X)。
  • NIO:同步非阻塞 模型(Tomcat-7.X)。
  • AIO:基于事件,异步非阻塞 模型(Tomcat-8.X)。

<?xml version="1.0" encoding="UTF-8"?><!-- `Server`服务器(1个) -->
<!-- `port`执行关闭命令的端口号 -->
<!-- `shutdown`服务器的关闭命令 -->
<Server port="8005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><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`服务(n个,默认:`Catalina`),将多个`Connector`与一个`Engine`组合成一个服务 --><Service name="Catalina"><!-- `Connector`连接器(n个,默认:`8080`),用于接收指定协议的连接,并指定给唯一的`Engine`进行处理 --><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><!-- `port`连接的端口号 --><!-- `protocol`监听的协议(默认:http/1.1) --><!-- `redirectPort`重定向端口号(指服务器正在处理`Http`请求时,收到了一个`SSL`传输`Https`请求后重定向的端口号) --><!-- `SSLEnabled`是否开启`SSL`认证(在`Https`访问时需要开启) --><!-- `enableLookups`为`true`进行`DNS`查询得到远程客户端的实际主机名,为`false`则不进行`DNS`查询而是返回其`IP`地址(`request.getRemoteHost()`获取主机名) --><!-- `minSpareThreads`最小备用线程数(默认:10,服务器启动时,创建的处理请求线程数) --><!-- `maxThreads`最大线程数(`Worker`线程) --><!-- `acceptCount`同时接收最大连接(默认:100),当所有处理请求的线程都被使用时,可以放入处理队列中的请求数,超过这个数的请求将不予处理 --><!-- `connectionTimeout`连接超时的时间(单位:毫秒),指在`acceptCount`停留最大时间 --><!-- `URIEncoding`对`URI`编码 --><!-- `useBodyEncodingForURI`响应的`Body`是否与`URIEncoding`相同编码 --><!-- `compression`开启对静态资源压缩 --><!-- `compressionMinSize`压缩最小值 --><!-- `compressableMimeType`压缩类型 --><!-- 自定义`Connector` --><Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8444" enableLookups="false" minSpareThreads="200" maxThreads="1024" acceptCount="800" connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/x-json,application/json,application/x-javascript" /><!-- `Engine`引擎(1个,默认:`Catalina`),用于处理连接的执行器 --><!-- `name`引擎名称 --><!-- `defaultHost`默认`Host` --><Engine name="Catalina" defaultHost="localhost"><Realm className="org.apache.catalina.realm.LockOutRealm"><Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" /></Realm><!-- `Host`虚拟机(n个,默认:`localhost`),基于域名匹配虚拟机,类似`Nginx`的`server`模块 --><Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"><!-- `Valve`阀门(可以理解成的过滤器),具体配置要基于`Valve`接口的子类,以下为一个访问日志的`Valve` --><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><!-- `appBase`类似`Nginx`的`root`模块(绝对路径或相对路径,相对`TOMCAT_HOME`根目录) --><!-- `unpackWARs`解压`war`包 --><!-- `autoDeploy`自动部署 --><!-- 自定义`Host` --><Host name="www.qs.com" appBase="E:/root/tomcat" unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="www.qs.com_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /><!-- `Context`应用上下文(n个),每个`Context`都有其独立的`classPath`,避免冲突 --><!-- `path`:请求路径 --><!-- `docBase`:绝对路径或相对路径(`E:/root/tomcat/qs`) --><Context path="/qshome" docBase="qs" reloadable="true" /></Host></Engine></Service><!-- 自定义`Service` --><Service name="qs"><!-- 自定义 --></Service></Server>

# 启动`Tomcat`
./bin/catalina.sh start
# 停止`Tomcat`
./bin/catalina.sh stop
# 从新加载配置
./bin/catalina.sh configtest# 远程关闭`Tomcat`
telnet 127.0.0.1 8005
SHUTDOWN

  • http://127.0.0.1:8080:访问 $TOMCAT_HOME/webapps/ROOT 目录。
  • http://127.0.0.1:8081:访问 $TOMCAT_HOME/webapps/ROOT 目录。
  • http://www.qs.com:8080:访问 E:/root/tomcat/ROOT 目录。
  • http://www.qs.com:8080/qs:访问 E:/root/tomcat/qs 目录。
  • http://www.qs.com:8080/qshome:访问 E:/root/tomcat/qs 目录。
  • http://www.qs.com:8080/wy:访问 E:/root/tomcat/wy 目录。

<!-- `E:\root\tomcat\ROOT.xml` -->
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/wy" docBase="E:/root/tomcat/wy" reloadable="true"  />

<!-- `E:\java\tomcat\apache-tomcat-learn\conf\Catalina\www.qs.com\wyb.xml` -->
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/wyb" docBase="E:/root/tomcat/wy" reloadable="true"  />

  • http://www.qs.com:8080/wyb:访问 E:/root/tomcat/wy 目录。

四、Tomcat 脚本

  • 手动部署 war 项目。
  1. 复制 war 包至 Tomcat_Home.webapps 目录。
  2. 执行 starut.bat 脚本启动。
  3. 启动过程中 war 包会被自动解压装载。

  • 在 Eclipse 或 Idea 中,启动 WEB 项目的时候。
  • 也是把 war 包复制到 webapps 目录解压吗?
  1. 显然不是,真正做法是在 Tomcat 程序文件之外,创建了一个 部署目录。
  2. 在生产环境中也是这么做的,即:Tomcat 程序目录 和 部署目录 是分开 。
  3. 只需要在启动时,指定 CATALINA_HOMECATALINA_BASE 参数即可实现。

启动参数 描述说明
JAVA_OPTS JVM 启动参数,设置内存、编码等(-Xms100m堆内存最小值、-Xmx200m-Dfile.encoding=UTF-8编码)
JAVA_HOME 指定 JDK 目录,如果未设置从 Java 环境变量当中去找
CATALINA_HOME Tomcat 程序根目录
CATALINA_BASE 应用部署目录(默认为:$CATALINA_HOME
CATALINA_OUT 应用日志输出目录(默认:$CATALINA_BASE/log
CATALINA_TMPDIR 应用临时目录(默认:$CATALINA_BASE/temp

1. 启动停止脚本

mkdir /root/qs
cd /root/qs
cp -r /root/apache-tomcat-8/conf /root/qs/
mkdir logs
mkdir weebapps

  • tomcat.sh
#!/bin/bash
export JAVA_OPTS="-Xms100m -Xmx200m"
export JAVA_HOME=/root/jdk/
# 采用软连接`/root/apache-tomcat`指向`/root/apache-tomcat-8`
#export CATALINA_HOME=/root/apache-tomcat-8
export CATALINA_HOME=/root/apache-tomcat
# `pwd`当前脚本目录`/root/qs`
export CATALINA_BASE="`pwd`"case $1 instart)$CATALINA_HOME/bin/catalina.sh startecho start success!!;;stop)$CATALINA_HOME/bin/catalina.sh stopecho stop success!!;;restart)$CATALINA_HOME/bin/catalina.sh stopecho stop success!!sleep 3$CATALINA_HOME/bin/catalina.sh startecho start success!!;;version)$CATALINA_HOME/bin/catalina.sh version;;configtest)$CATALINA_HOME/bin/catalina.sh configtest;;esac
exit 0

./tomcat start
./tomcat stop
./tomcat restart
./tomcat version
./tomcat configtest

2. 自动部署脚本

  • deploy.sh
#!/bin/bash -e
export now_time=$(date +%Y-%m-%d_%H-%M-%S)
echo "deploy time:$now_time"app=$1
version=$2
mkdir -p war/
# 从`SVN`下载程序至`war`目录
war=war/${app}_${version}.war
echo "$war"
svn export svn://192.168.0.147/release/${app}_${version}.war $wardeploy_war() {# 解压版本至当前目录target_dir=war/${app}_${version}_${now_time}unzip -q $war -d $target_dirrm -f appwarln -sf $target_dir appwartarget_ln=`pwd`/appwarecho '<?xml version="1.0" encoding="UTF-8" ?><Context docBase="'$target_ln'" allowLinking="false"></Context>' > conf/Catalina/localhost/ROOT.xml# 重启`Tomcat`服务./tomcat.sh restart
}# 部署`war`
deploy_war

./deploy.sh qs v1.0
./deploy.sh qs v2.0
# 版本回滚
rm -rf appwar
lb -s war/qs_v1.0_2022-04-14_10-20-30/
./tomcat.sh restart


五、Spring Boot 配置


server:tomcat:uri-encoding: UTF-8# 最大工作线程数(默认:200) # 操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。max-threads: 1000# 等待队列长度(默认:100)accept-count: 1000max-connections: 20000# 最小工作空闲线程数(默认10)适当增大一些,以便应对突然增长的访问量min-spare-threads: 100

六、扩展

  • 学习Tomcat
  • Tomcat的高效配置

一、Tomcat 配置相关推荐

  1. eclipse下tomcat配置

    eclipse下tomcat配置整了我一两个小时,呵呵,大家不要笑话,本人对eclipse还是菜鸟! 1.用到的软件 jdk-7u40-windows-i586 EclipseJavaEEIDEfor ...

  2. Rainbond最佳实践:Tomcat配置Redis实现Session共享

    Rainbond:生产级无服务器PaaS Rainbond是国内首个开源的生产级无服务器PaaS,深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术 ...

  3. intellij tomcat配置

    目录 intellij tomcat配置 @(目录) intellij tomcat配置 如上图标注 1 所示,我们可以切换随时为项目切换不同的容器. 如上图标注 2 所示,我们可以指定给运行的容器设 ...

  4. ssl单向tomcat配置webservice访问方法

    tomcat 配置 单向 SSL <Connector port="8443" protocol="org.apache.coyote.http11.Http11P ...

  5. Tomcat 配置WEB虚拟映射 及 配置虚拟主机

    Tomcat  配置WEB虚拟映射 及 配置虚拟主机 配置WEB虚拟映射文件夹有三种方法例如以下: 第一(要重新启动server的): 打开路径 Tomcat 6.0\conf 下的 server.x ...

  6. tomcat android https,tomcat 配置 https, android端 访问

    1.控制台 进入到tomcat 的bin 目录下 执行命令 keytool的命令网上很多解释 生成一个 tomcat.keystore 文件 keytool -genkey -alias tomcat ...

  7. tomcat苹果版安装步骤_mac系统安装apache tomcat配置方法图文详解

    下面,绿茶小乐哥分享mac系统安装apache tomcat配置方法,希望能帮助到大家! tomcat无法取访问appache资源. appache只支持静态网页,但像asp,php,cgi,jsp等 ...

  8. 详解Tomcat配置JVM参数步骤

    这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...

  9. spring boot实战(第七篇)内嵌容器tomcat配置

    spring boot默认web程序启用tomcat内嵌容器tomcat,监听8080端口,servletPath默认为 / 通过需要用到的就是端口.上下文路径的修改,在spring boot中其修改 ...

  10. jdk和tomcat配置

    一:安装jdk,需要jdk和jre的安装目录一样 二:设置jdk和jre环境变量 JAVA_HOME:C:\Program Files\Java\jdk1.7.0_80 path: %JAVA_HOM ...

最新文章

  1. retain和copy还有assign的区别
  2. 微信小程序小模块界面,边框带阴影
  3. 前端将二进制数据流转为文件_前端通过二进制流下载文件
  4. html动态图标代码,SVG动态图标是如何实现的
  5. 带参数的RedirectToAction
  6. 变频器压频比的正确设置方法
  7. SCM供应链管理系统介绍:企业SCM供应链系统应用领域、优势、功能详解
  8. SEFS安全透明加密内核
  9. ATmega16 单片机 AVR单片机 直流电机调速器
  10. 软件测试系统性总结思维导图
  11. .webp是什么文件?怎么打开这种文件
  12. excel批量生成批处理语句另存为.bat文件批量改名
  13. nslookup查询域名系统服务器,域名解析系统DNS诊断命令nslookup详解
  14. 毕业设计 : 基于stm32的微信天气机器人 - 天气检测 环境监测 微信机器人
  15. 水果食用大全 -- 果品食疗 - 葡萄
  16. 戴尔电脑录屏怎么录?这3个方法,教你轻松录屏
  17. numpy中rand与randn的区别
  18. 下一个独角兽!橙色云用互联网设计变革传统工业设计模式
  19. DirectSound播放PCM有杂音的解决方法
  20. Redis实战之好友关注功能

热门文章

  1. QPS达到30万的elasticsearch架设之道
  2. 华三服务器怎样用hdm安装linux,H3C服务器配置HDM用户指南
  3. 线性代数学习笔记3-4:描述线性变换的空间压缩情况(列空间、秩)
  4. 2022年全球市场碳化硅滑动轴承总体规模、主要生产商、主要地区、产品和应用细分研究报告
  5. JAVA视频学习笔记-马士兵(六)
  6. 头歌-信息安全技术-Linux之用户管理
  7. 【C语言】杨辉三角(等腰三角)
  8. C语言实现SM4加解密算法
  9. ValueError: binary mode doesn‘t take an encoding argument
  10. CToolBar工具条控制方法