Author:liuchao
email:mirschao@gmail.com
github: https://github.com/mirschao
gitee: https://gitee.com/mirschao
Tomcat高效稳定Java Servlet容器第一章 Tomcat简介1.1 在CentOS 7 中部署TomCat1.2 tomcat配置文件识别1.3 上线项目到tomcat中第二章 TomCat多实例(最没有用的东西)2.1 多实例的意义和作用2.2 配置实践第三章 TomCat的调优及功能配置3.1 应用层配置优化3.2 系统层优化
Tomcat是Apache软件基金会旗下的Jakarta项目中的核心项目, 它由Apache、Sun以及其他公司和个人共同开发. 得益于Sun的参与和支持, Tomcat始终能及时地体现最新的Servlet和JSP规范. Tomcat以其先进的技术、稳定的性能以及完全免费的特点, 深受Java爱好者的喜爱, 并得到部分软件开发商的认可. 作为一款流行的Web应用服务器, Tomcat在市场上广受欢迎.
Tomcat的下载地址为: https://tomcat.apache.org/download-10.cgi
由于Tomcat是由java语言开发的, 所以想要正常运行Tomcat服务就需要在操作系统上安装 java开发环境(JDK).
JDK下载地址: https://www.oracle.com/java/technologies/downloads/#java11
server: 负责管理和启动多个service服务, 监听在 8005 端口上, 用于控制整个tomcat进程的启动和停止
service: 使用各个组件对外提供整套的web服务, 类似于nginx中的虚拟主机
Connector: 负责监听在指定的端口(默认8080)上接受外部的请求, 传递给Container处理, 并将结果返回给外部
Container: 负责处理具体的请求, 并生成对应的响应体, 返回给Connector
Tomcat 是由java语言编写的, 安装tomcat时必须要使用到java的环境, 所以部署java的环境是必须的; 对于tomcat的部署这里也采用的是源码的方式进行安装, 方便在将来控制版本的更迭
x
# 配置java环境
$ wget https://mirrors.qfcc.online/packages/tomcat/jdk-8u381-linux-x64.tar.gz
$ sudo tar xf jdk-8u381-linux-x64.tar -C /usr/local/
$ sudo vim /etc/profile.d/jdk11.sh
export JAVA_HOME=/usr/local/jdk1.8.0_381
export CLASS_PATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
$ sudo source /etc/profile
# 安装tomcat到本地
$ wget https://mirrors.qfcc.online/packages/apache-tomcat-9.0.78.tar.gz
$ sudo tar xf apache-tomcat-9.0.78.tar.gz -C /usr/local/
$ cd /usr/local/apache-tomcat-9.0.78
$ sudo bash bin/startup.sh
$ sudo vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat9
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=oneshot
ExecStart=/usr/local/apache-tomcat-9.0.78/bin/startup.sh
ExecStop=/usr/local/apache-tomcat-9.0.78/bin/shutdown.sh
ExecReload=/bin/kill -s HUP $MAINPID
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now tomcat
⚠️如果遇到启动错误的场景可以在startup.sh以及shutdown.sh中增加JAVA_HOME环境变量, 来解决这个问题
Tomcat是一个开源的Java Servlet容器, 用于运行Java Servlet和JavaServer Pages(JSP)应用程序. 安装目录中的各个文件和目录扮演着不同的角色和功能. 以下是Tomcat安装目录中常见的一些重要文件和目录及其作用:
bin/
: 该目录包含了Tomcat的可执行文件, 用于启动和停止Tomcat服务器. 主要包含以下重要文件:
startup.sh
: 用于启动Tomcat服务器
shutdown.sh
: 用于停止Tomcat服务器
catalina.sh
: 启动脚本的主要文件, 负责执行Tomcat的启动和配置
conf/
: 该目录包含Tomcat服务器的配置文件. 重要文件包括:
server.xml
: Tomcat服务器的主要配置文件, 包括定义连接器、虚拟主机等(运维配置)
web.xml
: 用于配置Web应用程序的Servlet、过滤器和监听器等(研发提供)
context.xml
: 配置Web应用程序上下文的配置文件, 可以包含数据库连接、资源等信息(研发提供)
catalina.policy
和 catalina.properties
: Tomcat的安全策略和系统属性配置文件(安全运维提供)
lib/
: 该目录包含Tomcat服务器运行时所需的Java类库文件(JAR文件)
logs/
: 该目录包含Tomcat服务器的日志文件, 如访问日志和错误日志
webapps/
: 该目录是Web应用程序部署的位置. 将你的Java Web应用程序(WAR文件)放在这里, Tomcat会自动部署并运行它们
work/
: 该目录用于存储Tomcat运行时编译的JSP文件和其他临时文件
temp/
: 该目录用于存储Tomcat服务器运行时的临时文件
这些只是Tomcat安装目录中一些重要的文件和目录, 实际安装目录可能会因不同的Tomcat版本和安装选项而有所差异. 了解这些文件和目录的作用可以帮助你更好地配置和管理Tomcat服务器, 下面是tomcat的server.xml配置文件的结构:
xxxxxxxxxx
<Server> // 顶层组件, 可以包含多个Service, 起到控制作用, 用于声明控制端口
<Service> // 顶层组件, 可以包含一个Engine 和 多个Connector, 用于声明服务实例
<Connector /> // 连接组件, 用于声明通信接口使用
<Engine> // 容器组件, 可以包含多个Host, 用于接收Service中所有的请求, 并将请求路由到对应的Host中
<Host> // 容器组件, 可以包含多个Context, 用于处理具体的请求
<Context /> // 容器组件, 用于声明应用程序的上下文信息, 如访问权限、数据库连接等信息
<Value /> // 容器组件, 用于规定日志的存储位置
</Host>
</Engine>
</Service>
</Server>
下载项目源代码:首先, 你需要从项目的源代码仓库(如Git、SVN等)中获取项目的源代码. 你可以使用版本控制工具(如Git)克隆项目仓库或者下载项目源代码的压缩包.
编译和构建:一旦你获得了项目的源代码, 你需要根据项目的构建工具(如Maven、Gradle)执行编译和构建操作, 以生成项目的可执行文件(jar/war). 这通常会生成编译后的Java类文件和其他资源文件.
打包为WAR文件:对于Java Web应用程序, 通常会将项目打包为WAR(Web ARchive)文件. WAR文件是一种可部署的Java Web应用程序打包格式, 包含了Web应用程序所需的所有文件和目录结构.
传送WAR文件到Tomcat服务器:将生成的WAR文件上传或复制到Tomcat服务器的webapps
目录中. 这个目录是Tomcat用于部署Web应用程序的默认目录.
启动Tomcat:通过执行Tomcat的启动脚本(如startup.sh
)启动Tomcat服务器.
部署Web应用程序:一旦Tomcat启动成功, 它会自动检测webapps
目录中的新WAR文件, 并将其部署为一个Web应用程序. Tomcat会自动解压WAR文件, 并将其部署到一个单独的目录中.
访问Web应用程序:一旦部署成功, 你可以通过浏览器访问部署的Web应用程序. 默认情况下, Tomcat的访问URL为http://服务器IP:8080/应用程序名称
, 其中应用程序名称
是你在WAR文件中定义的应用程序上下文名称.
xxxxxxxxxx
##>> 构建服务器设置
$ wget https://mirrors.qfcc.online/packages/tomcat/apache-maven-3.9.3-bin.tar.gz
$ wget https://mirrors.qfcc.online/packages/tomcat/jdk-8u381-linux-x64.tar.gz
$ tar xf jdk-8u381-linux-x64.tar.gz -C /usr/local/
$ vim /etc/profile.d/jdk11.sh
export JAVA_HOME='/usr/local/jdk1.8.0_381'
export PATH=$PATH:$JAVA_HOME/bin
$ tar xf apache-maven-3.9.3-bin.tar.gz -C /usr/local/
$ vim /etc/profile.d/maven393.sh
export MAVEN_HOME='/usr/local/apache-maven-3.9.3'
export PATH=$PATH:$MAVEN_HOME/bin
$ source /etc/profile
###>>> 在构建服务器中下载源代码进行编译打包
$ git clone https://gitee.com/JPressProjects/jpress.git
$ cd jpress/
$ mvn clean package ####>>>> 编译、构建、打包 一体化命令
###>>> 将生成的war包传输到tomcat服务器的webapps目录中
$ scp starter-tomcat/target/starter-tomcat-5.0.war root@TOMCAT_HOST_IP:/usr/local/apache-tomcat-9.0.78/webapps/
⚠️访问浏览器: http://TOMCAT_HOST_IP:8080/starter-tomcat-5.0 即可进入到安装的界面中
注意事项:
在上传WAR文件到Tomcat服务器之前, 确保Tomcat服务器已经安装和配置正确, 以及能够在你的网络环境中访问.
如果你有多个Tomcat实例, 确保将WAR文件部署到正确的实例中, 避免冲突或混淆.
以上步骤描述了将JavaWeb应用程序部署到Tomcat服务器的基本过程. 具体的步骤可能因你使用的项目构建工具和部署方式而略有不同. 在实际操作时, 你可能还需要处理一些项目特定的配置和依赖项, 以确保应用程序可以正确运行.
Tomcat多实例是指在一台服务器上运行多个独立的Tomcat进程, 每个实例都有自己的配置、日志和应用程序部署目录. 这种配置方式可以实现多个独立的Tomcat服务共享同一台物理服务器资源, 以提高性能、隔离应用程序、灵活部署和更好的资源利用率.
作用和意义:
隔离应用程序:每个Tomcat实例可以运行不同的应用程序, 避免了应用程序之间的干扰, 提高了应用程序的稳定性和安全性
提高性能:多个Tomcat实例可以利用多核处理器和多线程来提高并发处理能力, 从而增加整体系统的性能
灵活部署:每个Tomcat实例都可以单独启动、停止和重启, 方便对应用程序进行独立管理和维护
资源利用率:多实例可以充分利用服务器资源, 提高服务器的利用效率, 降低成本
假设我们在服务器上已经安装了Tomcat, 并且将其安装目录命名为tomcat
. 现在我们要创建两个Tomcat实例:tomcat_instance1
和tomcat_instance2
, 并让它们分别监听不同的端口.
复制Tomcat目录并修改端口:
复制tomcat
目录为tomcat_instance1
和tomcat_instance2
.
分别修改tomcat_instance1/conf/server.xml
和tomcat_instance2/conf/server.xml
, 将HTTP端口改为不同的端口号
修改AJP端口和shutdown端口, 确保不同实例的端口不冲突.
启动多实例:
在命令行中进入tomcat_instance1/bin
目录, 执行./startup.sh
启动tomcat_instance1
.
在命令行中进入tomcat_instance2/bin
目录, 执行./startup.sh
启动tomcat_instance2
.
部署应用程序:
将应用程序的WAR文件复制到tomcat_instance1/webapps
目录, tomcat_instance2/webapps
目录
访问应用程序:
通过http://服务器IP:8081
来访问tomcat_instance1
中部署的应用程序
通过http://服务器IP:8082
来访问tomcat_instance2
中部署的应用程序
这样就创建了两个Tomcat多实例, 并且它们可以独立运行和部署不同的应用程序.
在高负载情况下或者需要优化性能时, 对Tomcat进行调优和功能配置是至关重要的. 下面将详细介绍Tomcat的调优和功能配置:
1. 调整JVM参数:
堆内存大小:通过设置-Xmx
和-Xms
参数来调整Java堆内存大小. 适当调整堆大小可以提高性能, 避免频繁的垃圾回收. 例如:-Xms512m -Xmx2048m
表示初始堆大小为512MB, 最大堆大小为2048MB
垃圾回收算法:选择合适的垃圾回收算法可以减少停顿时间. 使用G1垃圾收集器(-XX:+UseG1GC)或CMS垃圾收集器(-XX:+UseConcMarkSweepGC)可能对性能有所改进
xxxxxxxxxx
$ vim /usr/local/apache-tomcat-9.0.78/bin/catalina.sh
JAVA_OPTS="-Xms=512m -Xmx=2048m"
2. 调整Tomcat连接器:
调整最大连接数:通过调整Tomcat连接器的最大连接数来提高并发处理能力. 在conf/server.xml
中, 修改<Connector>
元素的maxConnections
属性
3. 启用压缩:
启用Gzip压缩:通过启用Gzip压缩来减少数据传输量, 节省带宽, 并加快页面加载速度. 在conf/server.xml
中, 为<Connector>
元素添加compression='true'
和compressableMimeType='true'
属性
4. 静态资源缓存:
启用静态资源缓存:对于不经常变化的静态资源(例如图像、样式表、JavaScript文件等), 启用缓存可以减少服务器负载和提高加载速度. 可以通过修改conf/web.xml
中的<servlet>
元素, 添加<init-param>
来启用缓存
5. 启用连接池:
JDBC连接池:如果应用程序使用了数据库, 使用JDBC连接池可以避免频繁地创建和关闭数据库连接, 提高数据库连接的重用性和性能. Tomcat自带了一个JDBC连接池, 可以在conf/context.xml
中配置
6. 配置虚拟主机和负载均衡:
虚拟主机:通过配置虚拟主机, 可以在同一台Tomcat上运行多个域名的Web应用程序. 在conf/server.xml
中, 配置<Host>
元素来定义虚拟主机
负载均衡:在高负载情况下, 使用负载均衡来将请求分发到多个Tomcat实例, 提高整体性能和可靠性. 可以使用Nginx来进行负载均衡配置
7. 启用AccessLog:
启用AccessLog:在conf/server.xml
中的<Valve>
元素中配置AccessLog, 可以记录每个请求的日志, 方便性能监控和问题排查
以上是对Tomcat调优和功能配置的一些常见方法. 调优时应根据实际情况进行测试和评估, 确保所做的改进符合需求和预期效果. 注意备份配置文件, 以防止意外问题.
1. 调整文件描述符限制: 增加每个进程可以打开的文件描述符的数量, 以便Tomcat可以处理更多的并发连接和请求。在Linux系统中, 可以通过修改/etc/security/limits.conf
或/etc/security/limits.d/*
文件, 增加nofile(文件描述符)限制。
xxxxxxxxxx
# 对于操作系统而言提升其可使用的句柄数也可以提升连接队列的长度 /etc/sysctl.conf
fs.file-max = 2168800
# 提高运行tomcat进程用户的最大文件打开数, 提高句柄可用性 /etc/security/limits.conf
tomcat soft nofile 65535
tomcat hard nofile 65535
2. 内核参数优化: 根据服务器配置和工作负载, 可能需要调整一些内核参数, 如TCP连接、内存、网络缓冲区等。这些参数可以通过修改/etc/sysctl.conf
文件来设置
xxxxxxxxxx
# SYN_RCVD状态连接的最大个数
net.ipv4.tcp_max_syn_backlog = 262144
# 被动建立连接时, 发SYN/ACK的重试次数
net.ipv4.tcp_synack_retries = 6
# 接收网卡, 但未被内核协议栈处理的报文队列长度
net.core.netdev_max_backlog = 276144
# 超出处理能力时, 对新来的SYN直接回包RST, 丢弃连接
net.ipv4.tcp_abort_on_overflow = 1
# 发送心跳周期
net.ipv4.tcp_keepalive_time = 7200
# 探测包发送间隔
net.ipv4.tcp_keepalive_intvl = 75
# 探测包重试次数
net.ipv4.tcp_keepalive_probes = 9
# 下游服务器: /etc/sysctl.conf 主动建立连接时, 发SYN的重试次数
net.ipv4.tcp_syn_retries = 6
# 下游服务器: /etc/sysctl.conf 建立连接时的本地端口可用范围
net.ipv4.ip_local_port_range = 32768 60999
3. 使用高性能文件系统: 选择适合服务器的高性能文件系统(ext4、xfs), 以提供更快的读写性能。
4. 限制非Tomcat进程资源: 如果服务器上还运行着其他应用程序, 可以限制这些进程的资源使用, 以确保Tomcat能够获得足够的资源。常用的做法是将tomcat的优先级进行调高
5. 定期监控和优化: 定期监控系统性能和资源使用情况, 并根据监控结果进行调整和优化。
请注意, 在进行系统层面的优化时, 一定要小心操作, 确保了解每个配置的含义和影响。优化前最好备份系统配置文件, 以防止出现问题时可以还原。此外, 具体的优化配置可能会因不同的操作系统和服务器配置而有所不同, 建议在进行优化前仔细研究相关文档和资源