Tomcat配置优化

修改server.xml

Tomcat 8.5 安全配置与高并发优化

默认配置


<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
/>

优化配置

 # 用此项配置 protocol="org.apache.coyote.http11.Http11Nio2Protocol"启动时会有警告
# 警告 [main] org.apache.tomcat.util.net.Nio2Endpoint.bind The NIO2 connector requires an exclusive executor to operate properly on shutdown

<Connector
executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="40000"
maxConnections="10000"
redirectPort="8443"
enableLookups="false"
acceptCount="100"
maxPostSize="10485760"
compression="on"
disableUploadTimeout="true"
compressionMinSize="2048"
acceptorThreadCount="2"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
maxHttpHeaderSize="8192"
processorCache="20000"
tcpNoDelay="true"
connectionLinger="5"
server="Server Version 11.0"
URIEncoding="utf-8"
/>

优化配置升级(连接池)

未配置APR可使用org.apache.coyote.http11.Http11NioProtocol


<Executor name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="800"
minSpareThreads="100"
maxSpareThreads="500"
prestartminSpareThreads="true"
maxQueueSize="200"
maxIdleTime="30000"
/>

<Connector executor="tomcatThreadPool"
port="8081"
URIEncoding="UTF-8"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="10000"
acceptCount="200"
acceptorThreadCount="2"
maxConnections="8192"
enableLookups="false"
redirectPort="8443"
server=" "
compression="on"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
/>

server.xml配置供参考

已启用apr

<Executor name="tomcatThreadPool" 
namePrefix="catalina-exec-"
maxThreads="800"
minSpareThreads="100"
maxSpareThreads="500"
prestartminSpareThreads="true"
maxQueueSize="100"
maxIdleTime="20000"
/>

<Connector executor="tomcatThreadPool"
port="7171"
URIEncoding="UTF-8"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
acceptCount="100"
acceptorThreadCount="2"
maxConnections="8192"
enableLookups="false"
redirectPort="8443"
server=" "
compression="on"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
/>

配置对照

protocol,Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol(如果这个用不了,就用下面那个)
protocol,Tomcat 6、7 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol
enableLookups,禁用DNS查询
acceptCount,指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100
maxPostSize,以 FORM URL 参数方式的 POST 提交方式,限制提交最大的大小,默认是 2097152(2兆),它使用的单位是字节。10485760 为 10M。如果要禁用限制,则可以设置为 -1。
maxPostSize:设置由容器解析的URL参数的最大长度,-1(小于0)为禁用这个属性,默认为2097152(2M) 请注意, FailedRequestFilter 过滤器可以用来拒绝达到了极限值的请求。
acceptorThreadCount,用于接收连接的线程的数量,默认值是1。一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核 CPU 一般配置为 2.
acceptorThreadCount:用于接受连接的线程数量。增加这个值在多CPU的机器上,尽管你永远不会真正需要超过2。 也有很多非维持连接,您可能希望增加这个值。默认值是1。
connectionTimeout:Connector接受一个连接后等待的时间(milliseconds),默认值是60000。
maxConnections:这个值表示最多可以有多少个socket连接到tomcat上
maxHttpHeaderSize:http请求头信息的最大程度,超过此长度的部分不予处理。一般8K。
compression:是否启用GZIP压缩 on为启用(文本数据压缩) off为不启用, force 压缩所有数据
disableUploadTimeout:这个标志允许servlet容器使用一个不同的,通常长在数据上传连接超时。 如果不指定,这个属性被设置为true,表示禁用该时间超时。
compressionMinSize:当超过最小数据大小才进行压缩
compressableMimeType:配置想压缩的数据类型
URIEncoding:网站一般采用UTF-8作为默认编码。
processorCache:协议处理器缓存的处理器对象来提高性能。 该设置决定多少这些对象的缓存。-1意味着无限的,默认是200。 如果不使用Servlet 3.0异步处理,默认是使用一样的maxThreads设置。 如果使用Servlet 3.0异步处理,默认是使用大maxThreads和预期的并发请求的最大数量(同步和异步)。
tcpNoDelay:如果设置为true,TCP_NO_DELAY选项将被设置在服务器套接字,而在大多数情况下提高性能。这是默认设置为true。
connectionLinger:秒数在这个连接器将持续使用的套接字时关闭。默认值是 -1,禁用socket 延迟时间。
server:隐藏Tomcat版本信息,首先隐藏HTTP头中的版本信息

禁用 AJP

Tomcat8.5.88 当前教程版本中是默认关闭AJP

<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->

隐藏 Tomcat 版本号

cd /usr/local/tomcat/lib/
unzip catalina.jar
cd org/apache/catalina/util
vim ServerInfo.properties
#server.info=Apache Tomcat/8.5.16
#server.number=8.5.16.0
#server.built=Jun 21 2017 17:01:09 UTC

server.info=
server.number=
server.built=

Tomcat 配置APR线程池

参考文档(搭建OK)

辅助-参考文档

安装成功配置情况示例参考

Tomcat 8.5.88 成功开启APR模式依赖组件版本信息如下:

下载依赖文件

最新依赖下载地址

历史依赖下载地址

编译环境准备

yum -y install gcc gcc-c++ libtool* autoconf automake expat-devel perl perl-devel

编译apr组件

apr

cd /path/apr/apr-1.6.3
./configure --prefix=/usr/local/apr
make && make install

apr-iconv

cd /path/apr/apr-iconv-1.2.2
./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
make && make install

apr-util

cd /path/apr/apr-util-1.6.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
make && make install

tomcat-native

cd /path/tomcat-native-1.2.16-src/native 
./configure --with-java-home=/opt/jdk/jdk1.8.0_151/  --with-ssl=/usr/local/openssl
make && make install

错误情况记录

openssl版本低

centos 7 将 OpenSSL 升级到 1.1.1 版本或以上版本


wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz --no-check-certificate
tar -zxvf openssl-1.1.0g.tar.gz
cd openssl-1.1.0g
./config --prefix=/usr/local/openssl

./config -t

make && make install

修改环境变量

export PATH=/usr/local/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/openssllib:$LD_LIBRARY_PATH
source /etc/profile

验证openssl版本

openssl version

修改环境变量

vim /etc/profile
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
source /etc/profile

修改conf/server.xml配置文件

  • 连接池
    protocol="org.apache.coyote.http11.Http11AprProtocol"

替换命令vim操作

:%s/protocol="org.apache.coyote.http11.Http11NioProtocol"/protocol="org.apache.coyote.http11.Http11AprProtocol"/g

修改setenv.sh(可忽略)

-Djava.library.path=/usr/local/apr/lib

配置apr环境变量后不需要单独配置当前项

Apr启用成功截图

设置环境setenv.sh

注意:若配置一台服务器多个Tomcat,其他Tomcat的setenv.sh中’$CATALINA_BASE’也需要修改!

#Java环境(注意:若不配置jdk环境,以service方式启动报错!!!)
JAVA_HOME=/opt/jdk1.8.0_151

#配置tomcat启动后将进程号保存至 ./bin/tomcat.pid 文件
CATALINA_PID="$CATALINA_BASE/tomcat.pid"

#添加JAVA启动变量配置
### 末尾可添加针对开启jspAgent配置: -javaagent:/usr/local/services/tomcat_8.5.88/8084/jspAgent/JSPAgent.jar ###

##默认一般jdk启动配置参数
##JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m"
##修改后的jdk启动配置参数(APR模式)
##JAVA_OPTS="-Djava.io.tmpdir=/tmp -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -XX:+TieredCompilation -Xms8192m -Xmx8192m -XX:NewSize=6144m -XX:MaxNewSize=6144m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=512M -XX:SurvivorRatio=8 -XX:ParallelGCThreads=8 -XX:+UseAdaptiveSizePolicy -XX:+UseCompressedOops -XX:+UseBiasedLocking -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+CMSParallelInitialMarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintCommandLineFlags -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:/root/gc.$$.log -Djava.library.path=/usr/local/apr/lib"
##修改后的jdk启动配置参数(非APR模式)
JAVA_OPTS="-Djava.io.tmpdir=/tmp -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -XX:+TieredCompilation -Xms8192m -Xmx8192m -XX:NewSize=6144m -XX:MaxNewSize=6144m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=512M -XX:SurvivorRatio=8 -XX:ParallelGCThreads=8 -XX:+UseAdaptiveSizePolicy -XX:+UseCompressedOops -XX:+UseBiasedLocking -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+CMSParallelInitialMarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:+PrintCommandLineFlags -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:../logs/gclogs/gc.$$.log"

某环境配置项(可参考)

JAVA_OPTS="-server -Xms7168m -Xmx7168m -Xmn2400m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:ReservedCodeCacheSize=1024M -XX:SurvivorRatio=8 -Djava.io.tmpdir=/tmp -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Dfile.encoding=UTF-8 -XX:+AggressiveOpts -XX:+TieredCompilation -XX:+UseCompressedOops -XX:+UseBiasedLocking -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+CMSParallelInitialMarkEnabled -XX:CMSInitiatingOccupancyFraction=75 -XX:+PrintCommandLineFlags -XX:+HeapDumpOnOutOfMemoryError -XX:CMSFullGCsBeforeCompaction=2 -XX:SoftRefLRUPolicyMSPerMB=0 -Djava.library.path=/usr/local/apr/lib -javaagent:/usr/local/services/tomcat851/jspAgent/JSPAgent.jar";

日志按日分割

当前配置项,请自行忽略!, 请跳转日志优化板块

bin目录下创建back_catalina_out.sh

vim back_catalina_out.sh

脚本内容

#!/bin/bash
#tomcat日志目录
log_path=/usr/local/services/tomcat_8.5.88/8081/logs
d=`date +%Y-%m-%d`
d30=`date -d'5 day ago' +%Y-%m-%d`
cd ${log_path} && cp catalina.out $log_path/catalina.out.$d.log
echo > catalina.out
rm -rf $log_path/catalina.out.${d30}.log
rm -rf $log_path/localhost_access_log.${d30}.txt

赋予执行权限

chmod u+x back_catalina_out.sh

添加corn系统定时任务

0 0 * * * /usr/local/services/tomcat_8.5.88/8081/bin/back_catalina_out.sh

日志优化

环境变量配置

Tomcat_LOGPATH_9091=/usr/local/services/tomcat_9.0.83/9091/logs
export Tomcat_LOGPATH_9091

脚本文件修改

#!/bin/bash
#tomcat日志目录
log_path=${Tomcat_LOGPATH_9091}
d=`date +%Y-%m-%d`
d30=`date -d'5 day ago' +%Y-%m-%d`
cd ${log_path} && cp catalina.out $log_path/catalina.out.$d.log
echo > catalina.out
rm -rf $log_path/catalina.out.${d30}.log
rm -rf $log_path/localhost_access_log.${d30}.txt

cron定时任务执行的sh脚本中涉及引用环境变量配置,则需要修改定时任务项配置

Linux 中 Crontab 执行时的环境变量问题

0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9091/bin/back_catalina_out.sh

配置Tomcat随系统启动

新增配置文件

vi /usr/lib/systemd/system/tomcat8.service

文件内容

[Unit]
Description=Tomcat
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=oneshot
#Tomcat的目录地址
ExecStart=/usr/local/services/tomcat_8.5.88/8081/bin/startup.sh
ExecStop=/usr/local/services/tomcat_8.5.88/8081/bin/shutdown.sh
ExecReload=/bin/kill -s HUP $MAINPID
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

设置开机启动

systemctl enable tomcat8

常见命令

#启动tomcat
systemctl start tomcat8_8082.service
#关闭tomcat
systemctl stop tomcat8_8082.service
#重启tomcat
systemctl restart tomcat8_8082.service
#查看状态tomcat
systemctl status tomcat8_8082.service

Linux配置多个Tomcat容器

复制已配置好Tomcat目录8081

cp -rf 8081 8082
cp -rf 8081 8083
cp -rf 8081 8084

配置多Tomcat环境变量

修改/etc/profile配置文件

命名规则:CATALINA-{序号}-BASE-{版本号}

##########first tomcat###########
CATALINA_1_BASE_8_5_88=/usr/local/services/tomcat_8.5.88/8081
CATALINA_1_HOME_8_5_88=/usr/local/services/tomcat_8.5.88/8081
TOMCAT_1_HOME_8_5_88=/usr/local/services/tomcat_8.5.88/8081
export CATALINA_1_BASE_8_5_88 CATALINA_1_HOME_8_5_88 TOMCAT_1_HOME_8_5_88
##########first tomcat###########

##########second tomcat##########
CATALINA_2_BASE_8_5_88=/usr/local/services/tomcat_8.5.88/8082
CATALINA_2_HOME_8_5_88=/usr/local/services/tomcat_8.5.88/8082
TOMCAT_2_HOME_8_5_88=/usr/local/services/tomcat_8.5.88/8082
export CATALINA_2_BASE_8_5_88 CATALINA_2_HOME_8_5_88 TOMCAT_2_HOME_8_5_88
##########second tomcat##########

##########third tomcat##########
CATALINA_3_BASE_8_5_88=/usr/local/services/tomcat_8.5.88/8083
CATALINA_3_HOME_8_5_88=/usr/local/services/tomcat_8.5.88/8083
TOMCAT_3_HOME_8_5_88=/usr/local/services/tomcat_8.5.88/8083
export CATALINA_3_BASE_8_5_88 CATALINA_3_HOME_8_5_88 TOMCAT_3_HOME_8_5_88
##########third tomcat##########

##########fourth tomcat##########
CATALINA_4_BASE_8_5_88=/usr/local/services/tomcat_8.5.88/8084
CATALINA_4_HOME_8_5_88=/usr/local/services/tomcat_8.5.88/8084
TOMCAT_4_HOME_8_5_88=/usr/local/services/tomcat_8.5.88/8084
export CATALINA_4_BASE_8_5_88 CATALINA_4_HOME_8_5_88 TOMCAT_4_HOME_8_5_88
##########fourth tomcat##########

使配置文件生效

source /etc/profile

验证配置文件

echo $CATALINA_1_BASE_8_5_88

修改Tomcat配置项

如果新服务器中从未安装过Tomcat则第一个8081不需要修改

如果新服务器中已存在旧Tomcat,则为了避免CataLina的环境变量冲突,8081也需要进行修改

vim打开catalina.sh文件执行以下命令全局替换

8081

:%s/CATALINA_BASE/CATALINA_1_BASE_8_5_88/g
:%s/CATALINA_HOME/CATALINA_1_HOME_8_5_88/g

8082

:%s/CATALINA_BASE/CATALINA_2_BASE_8_5_88/g
:%s/CATALINA_HOME/CATALINA_2_HOME_8_5_88/g

8083

:%s/CATALINA_BASE/CATALINA_3_BASE_8_5_88/g
:%s/CATALINA_HOME/CATALINA_3_HOME_8_5_88/g

8084

:%s/CATALINA_BASE/CATALINA_4_BASE_8_5_88/g
:%s/CATALINA_HOME/CATALINA_4_HOME_8_5_88/g

配置多Tomcat的setenv.sh

修改setenv.sh

8081

CATALINA_PID="$CATALINA_1_BASE_8_5_88/tomcat.pid"

8082

CATALINA_PID="$CATALINA_2_BASE_8_5_88/tomcat.pid"

8083

CATALINA_PID="$CATALINA_3_BASE_8_5_88/tomcat.pid"

8084

CATALINA_PID="$CATALINA_4_BASE_8_5_88/tomcat.pid"

配置多Tomcat的端口

修改端口

### 示例:8082 修改端口 ###
#修改关闭端口(原8015):
<Server port="8025" shutdown="SHUTDOWN" ... >
#修改访问端口(原8081):
<Connector port="8082" ... >
#修改监听端口(AJP默认是注释关闭的、不用修改):
#<Connector port="8011" protocol="AJP/1.3" ... >

迁移部署新环境

搭建环境VM虚拟机中,需要迁移已配置好到生产环境部署

迁移Tomcat旧环境准备

压缩Tomcat环境

tar -zvcf tomcat_8.5.88.tar.gz tomcat_8.5.88

解压缩

tar -zxvf tomcat_8.5.88.tar.gz (-C 指定目录 )

上传至新服务器环境

scp命令传文件

#scp【本地文件的路径】【服务器用户名】@【服务器地址】:【服务器上存放文件的路径】
scp tomcat_8.5.88.tar.gz root@192.168.116.129:/root/

迁移Tomcat新环境部署

创建部署目录service

mkdir -p /usr/local/services/

移动tomcat环境压缩包并解压

#移动
mv /root/tomcat_8.5.88.tar.gz ./
#解压
tar -zxvf tomcat_8.5.88.tar.gz

检查目录是否与原tomcat服务器环境一致

#pwd
/usr/local/services/tomcat_8.5.88

配置Tomcat的环境变量
点击跳转

配置日志分割

点击这里跳转指定位置

配置系统启动

点击这里跳转指定位置

配置GC日志

JDK8打印并分析GC日志

详解可参考博客文档信息

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseSerialGC -Xmx1m -Xloggc:./gc-serial.log

参数 功能
-XX:+PrintGC 输出GC日志
-XX:+PrintGCDetails 输出GC的详细日志
-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息
-Xloggc:gc.log 日志文件的输出路径

注意事项

自动部署已关闭

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="false">

创建gcLog日志目录

setenv.sh的配置gclog的路径可修改

如果有设gc日志打印输出则需要配置gc日志目录

#示例:Tomcat8081
mkdir -p /usr/local/services/tomcat_8.5.88/8081/logs/gclogs

Tomcat配置定时重启

Linux操作系统用crontab做定时关闭启动tomcat

查看crontab任务是否执行以及执行日志

crontab报错:errors in crontab file, can’t install


cron定时任务配置

打印定时任务日志输出

11月30日11时51分执行任务

51 11 30 11 * /bin/sh /opt/sh_file/tomcat.sh >> /var/log/tomcat_sh.log 2>&1

Tomcat.sh脚本

#!/bin/sh
#./etc/profile

#防止cron定时执行由于无java环境导致失败情况
export JAVA_HOME=/opt/jdk/jdk1.8.0_151

sh /usr/local/services/tomcat_8.5.88/8081/bin/shutdown.sh

sleep 30s

sh /usr/local/services/tomcat_8.5.88/8081/bin/startup.sh

注意:
setenv.sh文件中最好也配置下Java环境变量路径,防止以service服务方式启动tomcat失败情况。

Tomcat9.0.83版本升级

Tomcat9 升级注意事项

配置文件server.xml变更项:

#compressableMimeType Tomcat9.0以前参数配置项
compressibleMimeType

连接池Executor配置项需变更

#以下配置需移除
maxSpareThreads
prestartminSpareThreads

写在最前面的话

前言:将打包好环境迁移部署其他服务器时,需要注意以下几点

  • 配置etc/profile环境变量
    • Tomcat环境
    • 日志脚本
  • cron的定时任务
    • 日志
  • firewalld防火墙
    • 开启9091-9094防火墙

  1. 环境变量 /etc/profile

    此处示例仅9091,其余9092-9094的tomcat容器可自行参照博客配置

    【完整配置示例请滚动到底部查看(包括9091-9094)】

    CATALINA_1_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9091/
    CATALINA_1_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9091/
    TOMCAT_1_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9091/
    export CATALINA_1_BASE_9_0_83 CATALINA_1_HOME_9_0_83 TOMCAT_1_HOME_9_0_83
  2. bin目录下环境配置setenv.sh

    若打印gc日志,需要提前创建gc日志目录

JAVA_HOME=/opt/jdk/jdk1.8.0_151

CATALINA_PID="$CATALINA_1_BASE_9_0_83/tomcat.pid"

JAVA_OPTS="-server -Xms7168m -Xmx7168m -Xmn2048m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:ReservedCodeCacheSize=1024M -XX:SurvivorRatio=8 -Djava.io.tmpdir=/tmp -Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Dfile.encoding=UTF-8 -XX:+AggressiveOpts -XX:+TieredCompilation -XX:+UseCompressedOops -XX:+UseBiasedLocking -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+CMSParallelInitialMarkEnabled -XX:CMSInitiatingOccupancyFraction=75 -XX:+PrintCommandLineFlags -XX:+HeapDumpOnOutOfMemoryError -XX:CMSFullGCsBeforeCompaction=2 -XX:SoftRefLRUPolicyMSPerMB=1000 -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:../logs/gclogs/gc.$$.log -Djava.library.path=/usr/local/apr/lib -javaagent:/usr/local/services/tomcat_9.0.83/9091/jspAgent/JSPAgent.jar";
  1. 替换catalina.sh

    vim中按:号后输入以下命令全局替换

CATALINA_BASE

%s/CATALINA_BASE/CATALINA_1_BASE_9_0_83/g

CATALINA_HOME

%s/CATALINA_HOME/CATALINA_1_HOME_9_0_83/g
  1. 配置apr,针对tomcat版本的tomcat-native配置

  2. 修改server.xml配置文件

  3. 配置日志脚本back_catalina_out.sh

  4. 启动,观察日志是否报错

  5. 后续9092 - 9094的容器需要配置拓展

    1. 9091为模板复制多个容器9092-9094
    2. 修改setenv.shCATALINA_PID
    3. 替换catalina.shCATALINA_BASECATALINA_HOME
    4. 修改back_catalina_out的目录配置
    5. 修改server.xml的端口配置
    6. 启动验证是否启动成功
  6. 补充配置项参数

开启防火墙

继续往后滑,有相关代码直接执行命令

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="x.x.x.x" port protocol="tcp" port="9091" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="x.x.x.x" port protocol="tcp" port="9092" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="x.x.x.x" port protocol="tcp" port="9093" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="x.x.x.x" port protocol="tcp" port="9094" accept"

Tomcat的环境变量

CATALINA_1_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9091/
CATALINA_1_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9091/
TOMCAT_1_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9091/
export CATALINA_1_BASE_9_0_83 CATALINA_1_HOME_9_0_83 TOMCAT_1_HOME_9_0_83
CATALINA_2_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9092/
CATALINA_2_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9092/
TOMCAT_2_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9092/
export CATALINA_2_BASE_9_0_83 CATALINA_2_HOME_9_0_83 TOMCAT_2_HOME_9_0_83
CATALINA_3_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9093/
CATALINA_3_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9093/
TOMCAT_3_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9093/
export CATALINA_3_BASE_9_0_83 CATALINA_3_HOME_9_0_83 TOMCAT_3_HOME_9_0_83
CATALINA_4_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9094/
CATALINA_4_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9094/
TOMCAT_4_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9094/
export CATALINA_4_BASE_9_0_83 CATALINA_4_HOME_9_0_83 TOMCAT_4_HOME_9_0_83

LogPath环境变量

Tomcat_LOGPATH_9091=/usr/local/services/tomcat_9.0.83/9091/logs
Tomcat_LOGPATH_9092=/usr/local/services/tomcat_9.0.83/9092/logs
Tomcat_LOGPATH_9093=/usr/local/services/tomcat_9.0.83/9093/logs
Tomcat_LOGPATH_9094=/usr/local/services/tomcat_9.0.83/9094/logs
export Tomcat_LOGPATH_9091 Tomcat_LOGPATH_9092 Tomcat_LOGPATH_9093 Tomcat_LOGPATH_9094

定时任务配置

crontab -e打开定时配置

老版本定时任务配置

0 0 * * * /usr/local/services/tomcat_9.0.83/9091/bin/back_catalina_out.sh
0 0 * * * /usr/local/services/tomcat_9.0.83/9092/bin/back_catalina_out.sh
0 0 * * * /usr/local/services/tomcat_9.0.83/9093/bin/back_catalina_out.sh
0 0 * * * /usr/local/services/tomcat_9.0.83/9094/bin/back_catalina_out.sh

新版本定时任务配置(脚本文件启用了环境变量)

0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9091/bin/back_catalina_out.sh
0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9092/bin/back_catalina_out.sh
0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9093/bin/back_catalina_out.sh
0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9094/bin/back_catalina_out.sh

Tomcat的catalina替换命令

由于是通过9091复制出来的,命令如下(在vim中按:):

9092

%s/CATALINA_1_BASE_9_0_83/CATALINA_2_BASE_9_0_83/g

%s/CATALINA_1_HOME_9_0_83/CATALINA_2_HOME_9_0_83/g

9093

%s/CATALINA_1_BASE_9_0_83/CATALINA_3_BASE_9_0_83/g
%s/CATALINA_1_HOME_9_0_83/CATALINA_3_HOME_9_0_83/g

9094

%s/CATALINA_1_BASE_9_0_83/CATALINA_4_BASE_9_0_83/g
%s/CATALINA_1_HOME_9_0_83/CATALINA_4_HOME_9_0_83/g

防火墙添加放行端口命令
Firewall防火墙命令

  • 添加放行IP+端口
  • 重载防火墙
  • 打印防火墙规则

开放允许指定IP+端口访问

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xx.xxx.x.25" port protocol="tcp" port="9091" accept" && firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xx.xxx.x.25" port protocol="tcp" port="9092" accept" && firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xx.xxx.x.25" port protocol="tcp" port="9093" accept" && firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xx.xxx.x.25" port protocol="tcp" port="9094" accept" && firewall-cmd --reload && firewall-cmd --zone=public --list-rich-rules

开放指定端口访问

firewall-cmd --zone=public --add-port=9091/tcp --permanent && firewall-cmd --zone=public --add-port=9092/tcp --permanent && firewall-cmd --zone=public --add-port=9093/tcp --permanent && firewall-cmd --zone=public --add-port=9094/tcp --permanent && firewall-cmd --reload && firewall-cmd --zone=public --list-ports

iptables

/sbin/iptables -I INPUT -s xx.xxx.x.25 -p tcp --dport 9091 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.25 -p tcp --dport 9092 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.25 -p tcp --dport 9093 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.25 -p tcp --dport 9094 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.29 -p tcp --dport 9091 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.29 -p tcp --dport 9092 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.29 -p tcp --dport 9093 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.29 -p tcp --dport 9094 -j ACCEPT 
service iptables save && service iptables restart && cat /etc/sysconfig/iptables

一键部署配置命令

#!/bin/bash
#desc 一键部署tomcat环境
#author muyh
#date 2024/04/20

# 指定要下载的 URL
url="YOUR_URL_HERE"
# 指定要保存文件的目录
directory="/usr/local/services"

# 检查目录是否存在,如果不存在则创建
if [ ! -d "$directory" ]; then
mkdir -p "$directory"
fi

# 使用 wget 下载文件到指定目录
# wget -P "$directory" "$url"
wget -P "$directory" "$url" --no-check-certificate || { echo "下载失败,脚本中止执行"; exit 1; }


# 获取下载的文件名
filename=$(basename "$url")

# 切换到目标目录
cd "$directory" || exit

# 解压缩文件
if [[ "$filename" == *.zip ]]; then
unzip "$filename"
elif [[ "$filename" == *.tar.gz || "$filename" == *.tgz ]]; then
tar xvzf "$filename"
elif [[ "$filename" == *.tar.bz2 || "$filename" == *.tbz2 ]]; then
tar xvjf "$filename"
else
echo "Unsupported file format for extraction: $filename"
fi

# 赋予执行权限给特定文件夹下的所有 .sh 文件
for folder in "$directory/$filename"*/; do
if [ -d "$folder" ]; then
if [ -n "$(find "$folder" -maxdepth 1 -type f -name '*.sh')" ]; then
chmod u+x "${folder}"*.sh > /dev/null 2>&1
fi
fi
done



# 添加命令语句到 /etc/profile
# echo '# Add your command here' >> /etc/profile

echo 'CATALINA_1_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9091/' >> /etc/profile
echo 'CATALINA_1_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9091/' >> /etc/profile
echo 'TOMCAT_1_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9091/' >> /etc/profile
echo 'export CATALINA_1_BASE_9_0_83 CATALINA_1_HOME_9_0_83 TOMCAT_1_HOME_9_0_83' >> /etc/profile

echo 'CATALINA_2_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9092/' >> /etc/profile
echo 'CATALINA_2_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9092/' >> /etc/profile
echo 'TOMCAT_2_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9092/' >> /etc/profile
echo 'export CATALINA_2_BASE_9_0_83 CATALINA_2_HOME_9_0_83 TOMCAT_2_HOME_9_0_83' >> /etc/profile

echo 'CATALINA_3_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9093/' >> /etc/profile
echo 'CATALINA_3_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9093/' >> /etc/profile
echo 'TOMCAT_3_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9093/' >> /etc/profile
echo 'export CATALINA_3_BASE_9_0_83 CATALINA_3_HOME_9_0_83 TOMCAT_3_HOME_9_0_83' >> /etc/profile

echo 'CATALINA_4_BASE_9_0_83=/usr/local/services/tomcat_9.0.83/9094/' >> /etc/profile
echo 'CATALINA_4_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9094/' >> /etc/profile
echo 'TOMCAT_4_HOME_9_0_83=/usr/local/services/tomcat_9.0.83/9094/' >> /etc/profile
echo 'export CATALINA_4_BASE_9_0_83 CATALINA_4_HOME_9_0_83 TOMCAT_4_HOME_9_0_83' >> /etc/profile


echo 'Tomcat_LOGPATH_9091=/usr/local/services/tomcat_9.0.83/9091/logs' >> /etc/profile
echo 'Tomcat_LOGPATH_9092=/usr/local/services/tomcat_9.0.83/9092/logs' >> /etc/profile
echo 'Tomcat_LOGPATH_9093=/usr/local/services/tomcat_9.0.83/9093/logs' >> /etc/profile
echo 'Tomcat_LOGPATH_9094=/usr/local/services/tomcat_9.0.83/9094/logs' >> /etc/profile
echo 'export Tomcat_LOGPATH_9091 Tomcat_LOGPATH_9092 Tomcat_LOGPATH_9093 Tomcat_LOGPATH_9094' >> /etc/profile


# 加载 /etc/profile
source /etc/profile


# 检查 iptables 是否启动
### iptables此处执行可能失效 ###
if systemctl is-active --quiet iptables; then
echo "iptables 防火墙已启动"
# 执行 iptables 相关命令
# 在这里添加你想要执行的 iptables 命令

/sbin/iptables -I INPUT -s xx.xxx.x.25 -p tcp --dport 9091 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.25 -p tcp --dport 9092 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.25 -p tcp --dport 9093 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.25 -p tcp --dport 9094 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.29 -p tcp --dport 9091 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.29 -p tcp --dport 9092 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.29 -p tcp --dport 9093 -j ACCEPT && /sbin/iptables -I INPUT -s xx.xxx.x.29 -p tcp --dport 9094 -j ACCEPT && service iptables save && service iptables restart && cat /etc/sysconfig/iptables

fi

# 检查 firewalld 是否启动
if systemctl is-active --quiet firewalld; then
echo "firewalld 防火墙已启动"
# 执行 firewalld 相关命令
# 在这里添加你想要执行的 firewalld 命令

firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xx.xxx.x.25" port protocol="tcp" port="9091" accept" && firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xx.xxx.x.25" port protocol="tcp" port="9092" accept" && firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xx.xxx.x.25" port protocol="tcp" port="9093" accept" && firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="xx.xxx.x.25" port protocol="tcp" port="9094" accept" && firewall-cmd --reload && firewall-cmd --zone=public --list-rich-rules

fi


# 添加定时任务到 crontab
(crontab -l ; echo "0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9091/bin/back_catalina_out.sh") | crontab -
(crontab -l ; echo "0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9092/bin/back_catalina_out.sh") | crontab -
(crontab -l ; echo "0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9093/bin/back_catalina_out.sh") | crontab -
(crontab -l ; echo "0 0 * * * . /etc/profile;/bin/sh /usr/local/services/tomcat_9.0.83/9094/bin/back_catalina_out.sh") | crontab -


base_dir="$directory"

# 检查基础目录是否存在
if [ ! -d "$base_dir" ]; then
echo "Base directory '$base_dir' not found."
exit 1
fi

# 获取当前系统的 JAVA_HOME 值
java_home=$(echo $JAVA_HOME)

# 查找所有 Tomcat 目录并修改其中的 setenv.sh 文件
# -maxdepth 2 检索深度2
# -name "90*" 目录文件名前缀90开头
find "$base_dir" -maxdepth 2 -type d -name "90*" | while IFS= read -r tomcat_dir; do
setenv_file="$tomcat_dir/bin/setenv.sh"
if [ -f "$setenv_file" ]; then
# 替换 setenv.sh 文件中的 JAVA_HOME 变量
# sed -i "s|^#* *export *JAVA_HOME=.*|export JAVA_HOME=\"$java_home\"|g" "$setenv_file" # update 2024/07/01 发现存在失效情况!
# 注释掉现有的 JAVA_HOME 配置
sed -i 's/^JAVA_HOME=.*$/#&/' "$setenv_file"
# 添加新的 JAVA_HOME 配置
echo "JAVA_HOME=$java_home" >> "$setenv_file"
echo "JAVA_HOME in $setenv_file has been replaced with $java_home"
else
echo "setenv.sh not found in $tomcat_dir"
fi
done

echo "脚本命令执行完毕!"