Tomcat9 运行模式更改为APR模式 附安装脚本

Tomcat9 运行模式更改为APR模式 附安装脚本

Tomcat支持三种接收请求的处理方式:BIO、NIO、APR

软件版本: Tomcat9.0.85

操作系统: Rockylinux 8.9

BIO由于每个请求都要创建一个线程来处理,线程开销比较大,不能再高并发的场景,性能也是最低的。

NIO是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,比传统的bio更好的并发性能。

APR(Apache Portable Run-time libraries)简单理解,就是从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和响应性能, 也是Tomcat运行高并发应用的首选模式。

所需软件的下载地址

https://mirrors.cloud.tencent.com/apache/apr/

tomcat-native在tomcat的bin下

* apr

* apr-iconv

* apr-util

* tomcat-native

安装依赖

yum install -y apr-devel openssl-devel gcc make expat-devel libtool

安装软件

cd /usr/local/src

wget https://mirrors.cloud.tencent.com/apache/apr/apr-1.6.5.tar.gz

tar xf apr-1.6.5.tar.gz

cd apr-1.6.5/

./configure --prefix=/usr/local/apr

make && make install

cd /usr/local/src

wget https://mirrors.cloud.tencent.com/apache/apr/apr-iconv-1.2.2.tar.gz

tar xf apr-iconv-1.2.2.tar.gz

cd apr-iconv-1.2.2/

./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-iconv

make && make install

cd /usr/local/src

wget https://mirrors.cloud.tencent.com/apache/apr/apr-util-1.6.3.tar.gz

tar xf apr-util-1.6.3.tar.gz

cd apr-util-1.6.3/

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv

make && make install

wget https://mirrors.cloud.tencent.com/apache/tomcat/tomcat-connectors/native/1.2.39/source/tomcat-native-1.2.39-src.tar.gz

tar xf tomcat-native-1.2.39-src.tar.gz

./configure --prefix=/usr/local/tomcat-native --with-apr=/usr/local/apr --with-ssl=yes

make && make install

echo -e 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/tomcat-native/lib:$CATALINA_HOME/lib\nexport LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib' >> /etc/profile

source /etc/profile

启用 Tomcat Native Library(上面已配置,这一步可不做)

在 $CATALINA_HOME/bin 目录下新建 setenv.sh:

LD_LIBRARY_PATH=/usr/local/tomcat-native/lib:$CATALINA_HOME/lib

export LD_LIBRARY_PATH

tomcat的server.xml需要更换成以下配置

namePrefix="catalina-exec-"

maxThreads="300"

minSpareThreads="30"/>

port="8080"

protocol="org.apache.coyote.http11.Http11AprProtocol"

connectionTimeout="20000"

redirectPort="8443"

acceptCount="900"

disableUploadTimeout="true"

URIEncoding="UTF-8"

enableLookups="false"

compression="on"

compressionMinSize="1024"

/>

/usr/local/tomcat/bin/startup.sh

查看端口情况

[root@slave bin]# netstat -tulnp | grep 8080tcp6 0 0 :::8080 :::* LISTEN 84309/java

附脚本

#!/bin/bash

###

# @Descripttion:

# @Author: zhouzl

# @version: tomcat9apr环境配置 在rocky8.10上测试通过

# @Date: 2024-02-27 16:22:57

# @LastEditors: zhouzl

# @LastEditTime: 2024-12-17 14:23:57

# 基于openjdk-1.8.0.432,如果是其它版需要替换tomcat.service中的相关参数

# 脚本为的source环境执行完毕之后可能会不生效.需要重新执行一遍 source /etc/profile 解决方法是使用 source 脚本名 的方式来执行脚本

# ps: 脚本里面无法成功启动tomcat,需要手工启动

###

tomcatversion='9.0.98'

aprversion='1.7.5'

apriconvversion='1.2.2'

aprutilvreion='1.6.3'

tomcatnativeversion='1.3.1'

#tomcat-native 位于tomcat安装包的bin下面

#判断程序是否存在

program_exists() {

local ret='0'

command -v "$1" >/dev/null 2>&1 || { local ret='1'; }

# fail on non-zero return value

if [ "$ret" -ne 0 ]; then

return 1

fi

return 0

}

#获取输入

function get_char()

{

SAVEDSTTY=$(stty -g)

stty -echo

stty cbreak

dd if=/dev/tty bs=1 count=1 2> /dev/null

stty -raw

stty echo

stty "$SAVEDSTTY"

}

enable_pause=1

#暂停

function pause()

{

if [ "x$1" != "x" ]; then

echo "$1"

fi

if [ $enable_pause -eq 1 ]; then

echo "Press any key to continue!"

char=$(get_char)

fi

}

program_exists java

yum install -y apr-devel wget openssl-devel gcc make expat-devel libtool net-tools wget java-1.8.0-openjdk*

source /root/.bash_profile

echo ".........tomcat安装............."

#判断tomcat是否存存,存在则跳过

if [ -h "/usr/local/tomcat" ];then

echo "tomcat已存在,跳过安装"

break

else

echo "................开始下载tomcat............."

wget https://mirrors.cloud.tencent.com/apache/tomcat/tomcat-9/v"${tomcatversion}"/bin/apache-tomcat-"${tomcatversion}".tar.gz

tar xvf apache-tomcat-"${tomcatversion}".tar.gz -C /usr/local/

ln -s /usr/local/apache-tomcat-"${tomcatversion}"/ /usr/local/tomcat

fi

cd /usr/local/src || exit

echo "开始安装APR"

wget https://mirrors.cloud.tencent.com/apache/apr/apr-"${aprversion}".tar.gz

tar xf apr-"${aprversion}".tar.gz

cd /usr/local/src/apr-"${aprversion}"/ || exit

./configure --prefix=/usr/local/apr

make && make install

echo "开始安装apr-iconv"

cd /usr/local/src || exit

wget https://mirrors.cloud.tencent.com/apache/apr/apr-iconv-"${apriconvversion}".tar.gz

tar xf apr-iconv-"${apriconvversion}".tar.gz

cd apr-iconv-"${apriconvversion}"/ || exit

./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-iconv

make && make install

echo "开始安装apr-util"

cd /usr/local/src || exit

wget https://mirrors.cloud.tencent.com/apache/apr/apr-util-"${aprutilvreion}".tar.gz

tar xf apr-util-"${aprutilvreion}".tar.gz

cd apr-util-"${aprutilvreion}"/ || exit

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv

make && make install

JAVA_BIN=$(which java)

echo "${JAVA_BIN}"

JAVA_HOME=$(realpath "${JAVA_BIN}")

echo "${JAVA_HOME}"

BASE_NAME=$(basename "${JAVA_HOME}")

echo "${BASE_NAME}"

while [[ ${BASE_NAME} == "bin" || ${BASE_NAME} == "jre" || ${BASE_NAME} == "java" ]]

do

JAVA_HOME=$(dirname "${JAVA_HOME}")

echo "JAVA_HOME: " "${JAVA_HOME}"

BASE_NAME=$(basename "${JAVA_HOME}")

echo "BASE_NAME: " "${BASE_NAME}"

done

echo "JAVA_HOME: ${JAVA_HOME}"

echo "开始安装tomcat-native"

cd /usr/local/src || exit

wget https://mirrors.cloud.tencent.com/apache/tomcat/tomcat-connectors/native/"${tomcatnativeversion}"/source/tomcat-native-"${tomcatnativeversion}"-src.tar.gz

tar xf tomcat-native-"${tomcatnativeversion}"-src.tar.gz

cd /usr/local/src/tomcat-native-"${tomcatnativeversion}"-src/native || exit

./configure --prefix=/usr/local/tomcat-native --with-apr=/usr/local/apr --with-java-home="${JAVA_HOME}"

make && make install

echo -e "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/tomcat-native/lib:$CATALINA_HOME/lib\nexport LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib" >> /etc/profile

source /etc/profile

cat >/usr/local/tomcat/bin/setenv.sh <

LD_LIBRARY_PATH=/usr/local/tomcat-native/lib:$CATALINA_HOME/lib

export LD_LIBRARY_PATH

EOF

#tomcat配置文件

cat >/usr/local/tomcat/conf/server.xml <

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" />

namePrefix="catalina-exec-"

maxThreads="300"

minSpareThreads="30"/>

port="8080"

protocol="org.apache.coyote.http11.Http11AprProtocol"

connectionTimeout="20000"

redirectPort="8443"

acceptCount="900"

disableUploadTimeout="true"

URIEncoding="UTF-8"

enableLookups="false"

compression="on"

compressionMinSize="1024"

/>

resourceName="UserDatabase"/>

prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />

protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>

EOF

mkdir -p /data/wwwroot/default

useradd www -s /sbin/nologin

chown -R www:www /usr/local/tomcat/

chmod -R 744 /usr/local/tomcat

chown -R www:www /data/wwwroot/

#生成tomcat启动服务

cat > /usr/lib/systemd/system/tomcat.service <

[Unit]

Description=Apache Tomcat Web Application Container

After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.432.b06-2.el8.x86_64/"

ExecStart=/usr/local/tomcat/bin/startup.sh

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/usr/local/tomcat/bin/shutdown.sh

PrivateTmp=true

User=www

Group=www

[Install]

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl enable tomcat

systemctl restart tomcat

附centos7下tomcat 9.0106

#!/bin/bash

###

# @Descripttion:

# @Author: zhouzl

# @version: tomcat9 apr环境配置 在centos7.9上测试通过 openssl3.5

# @Date: 2025-06-24 09:22:57

# @LastEditors: zhouzl

# @LastEditTime: 2025-06-24 09:22:57

# 基于openjdk-1.8.0.412,如果是其它版需要替换 tomcat.service 中的相关参数

# 脚本为的source环境执行完毕之后可能会不生效.需要重新执行一遍 source /etc/profile 解决方法是使用 source 脚本名 的方式来执行脚本

# ps: 脚本里面无法成功启动tomcat,需要手工启动

###

tomcatversion='9.0.106'

aprversion='1.7.6'

apriconvversion='1.2.2'

aprutilvreion='1.6.3'

tomcatnativeversion='1.3.1'

#tomcat-native 位于tomcat安装包的bin下面

#判断程序是否存在

program_exists() {

local ret='0'

command -v "$1" >/dev/null 2>&1 || { local ret='1'; }

# fail on non-zero return value

if [ "$ret" -ne 0 ]; then

return 1

fi

return 0

}

#获取输入

function get_char()

{

SAVEDSTTY=$(stty -g)

stty -echo

stty cbreak

dd if=/dev/tty bs=1 count=1 2> /dev/null

stty -raw

stty echo

stty "$SAVEDSTTY"

}

enable_pause=1

#暂停

function pause()

{

if [ "x$1" != "x" ]; then

echo "$1"

fi

if [ $enable_pause -eq 1 ]; then

echo "Press any key to continue!"

char=$(get_char)

fi

}

program_exists java

yum install -y apr-devel wget openssl-devel gcc make expat-devel libtool net-tools wget java-1.8.0-openjdk*

source /root/.bash_profile

echo ".........tomcat安装............."

#判断tomcat是否存存,存在则跳过

if [ -h "/usr/local/tomcat" ];then

echo "tomcat已存在,跳过安装"

break

else

echo "................开始下载tomcat............."

wget https://mirrors.cloud.tencent.com/apache/tomcat/tomcat-9/v"${tomcatversion}"/bin/apache-tomcat-"${tomcatversion}".tar.gz

tar xvf apache-tomcat-"${tomcatversion}".tar.gz -C /usr/local/

ln -s /usr/local/apache-tomcat-"${tomcatversion}"/ /usr/local/tomcat

fi

cd /usr/local/src || exit

echo "开始安装APR"

wget https://mirrors.cloud.tencent.com/apache/apr/apr-"${aprversion}".tar.gz

tar xf apr-"${aprversion}".tar.gz

cd /usr/local/src/apr-"${aprversion}"/ || exit

./configure --prefix=/usr/local/apr

make && make install

echo "开始安装apr-iconv"

cd /usr/local/src || exit

wget https://mirrors.cloud.tencent.com/apache/apr/apr-iconv-"${apriconvversion}".tar.gz

tar xf apr-iconv-"${apriconvversion}".tar.gz

cd apr-iconv-"${apriconvversion}"/ || exit

./configure --with-apr=/usr/local/apr --prefix=/usr/local/apr-iconv

make && make install

echo "开始安装apr-util"

cd /usr/local/src || exit

wget https://mirrors.cloud.tencent.com/apache/apr/apr-util-"${aprutilvreion}".tar.gz

tar xf apr-util-"${aprutilvreion}".tar.gz

cd apr-util-"${aprutilvreion}"/ || exit

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv

make && make install

JAVA_BIN=$(which java)

echo "${JAVA_BIN}"

JAVA_HOME=$(realpath "${JAVA_BIN}")

echo "${JAVA_HOME}"

BASE_NAME=$(basename "${JAVA_HOME}")

echo "${BASE_NAME}"

while [[ ${BASE_NAME} == "bin" || ${BASE_NAME} == "jre" || ${BASE_NAME} == "java" ]]

do

JAVA_HOME=$(dirname "${JAVA_HOME}")

echo "JAVA_HOME: " "${JAVA_HOME}"

BASE_NAME=$(basename "${JAVA_HOME}")

echo "BASE_NAME: " "${BASE_NAME}"

done

echo "JAVA_HOME: ${JAVA_HOME}"

echo "开始安装tomcat-native"

cd /usr/local/src || exit

wget https://mirrors.cloud.tencent.com/apache/tomcat/tomcat-connectors/native/"${tomcatnativeversion}"/source/tomcat-native-"${tomcatnativeversion}"-src.tar.gz

tar xf tomcat-native-"${tomcatnativeversion}"-src.tar.gz

cd /usr/local/src/tomcat-native-"${tomcatnativeversion}"-src/native || exit

./configure --prefix=/usr/local/tomcat-native --with-apr=/usr/local/apr --with-java-home="${JAVA_HOME}" --with-ssl=/usr/local/openssl

make && make install

echo -e "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/tomcat-native/lib:$CATALINA_HOME/lib\nexport LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib" >> /etc/profile

source /etc/profile

cat >/usr/local/tomcat/bin/setenv.sh <

LD_LIBRARY_PATH=/usr/local/tomcat-native/lib:$CATALINA_HOME/lib

export LD_LIBRARY_PATH

EOF

#tomcat配置文件

cat > /usr/local/tomcat/conf/server.xml <

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" />

namePrefix="catalina-exec-"

maxThreads="300"

minSpareThreads="30"/>

port="8080"

protocol="org.apache.coyote.http11.Http11AprProtocol"

connectionTimeout="20000"

redirectPort="8443"

acceptCount="900"

disableUploadTimeout="true"

URIEncoding="UTF-8"

enableLookups="false"

compression="on"

compressionMinSize="1024"

/>

resourceName="UserDatabase"/>

prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />

protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>

EOF

mkdir -p /data/wwwroot/default

useradd www -s /sbin/nologin

chown -R www:www /usr/local/tomcat/

chmod -R 744 /usr/local/tomcat

chown -R www:www /data/wwwroot/

#生成tomcat启动服务

cat > /usr/lib/systemd/system/tomcat.service <

[Unit]

Description=Apache Tomcat Web Application Container

After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/""

ExecStart=/usr/local/tomcat/bin/startup.sh

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/usr/local/tomcat/bin/shutdown.sh

PrivateTmp=true

User=www

Group=www

[Install]

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl enable tomcat

systemctl restart tomcat

相关风雨

浼止的意思
pc365buy

浼止的意思

🌊 08-20 💨 阅读 7701
话不在多,而在于精
365bet线上娱

话不在多,而在于精

🌊 08-03 💨 阅读 2276