Tomcat APR 安装

Tomcat APR 安装

APR(Apache portable Run-time libraries) 可移植运行时库,是 Apache HTTP 服务的支持库,提供了一组映射到下层操作系统的 API。Tomcat 将以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高 Tomcat 对静态文件的处理性能。改善 Tomcat 对静态文件的处理性能,同时如果使用了 HTTPS 方式传输的话,也可以提升 SSL 的处理性能。默认情况下,Tomcat 是用 BIO 的方式来实现网络通信的,性能非常低。Tomcat apr 也是在 Tomcat 上运行高并发应用的首选模式。APR 使用 JNI 的方式来读取文件以及进行网络传输,从操作系统级别来解决异步的 I/O 问题,大幅度的提高性能。如果操作系统不支持某个特定的功能,APR 将提供一个模拟的实现,这样程序员使用 APR 编写真正可在不同平台上移植的程序

安装依赖

1
2
3
4
5
Tomcat 和 JDK
yum install -y apr-devel
yum install -y gcc gcc-devel
yum install -y openssl openssl-devel
yum install -y expat-devel

下载 apr

下载地址:https://apr.apache.org/download.cgi

1
2
3
4
cd /data/tools/
wget -c http://mirrors.shu.edu.cn/apache//apr/apr-1.6.3.tar.gz
wget -c http://mirrors.shu.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
wget -c http://mirrors.shu.edu.cn/apache//apr/apr-iconv-1.2.2.tar.gz

安装 apr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 解压并进入解压目录
cd /data/tools/
tar -zxvf apr-1.6.3.tar.gz
cd apr-1.6.3/
# 配置,安装在 /data/ 目录下
./configure --prefix=/data/apr
# 报错信息
config.status: executing libtool commands
rm: cannot remove 'libtoolT': No such file or directory
config.status: executing default commands

# 解决方法
# 编辑 configure 文件
cd apr-1.6.3/
vim configure
$RM "$cfgfile" 这行代码注释掉
或 把 $RM "$cfgfile" 这行删除掉
或 写成 $RM -f "$cfgfile"
重新再运行 ./configure 就可以了

# 编译安装
make -j 4
make install

安装 apr-iconv

1
2
3
4
5
6
7
8
9
10
11
# 解压并进入解压目录
cd /data/tools/
tar -zxvf apr-iconv-1.2.2.tar.gz
cd apr-iconv-1.2.2/
# 配置,安装在 /data/ 目录下
./configure \
--prefix=/data/apr-iconv \
--with-apr=/data/apr
# 编译安装
make -j 4
make install

安装 apr-util

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 解压并进入解压目录
cd /data/tools/
tar -zxvf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1/
# 配置,安装在 /data/ 目录下
./configure \
--prefix=/data/apr-util \
--with-apr=/data/apr \
--with-apr-iconv=/data/apr-iconv/bin/apriconv

# 编译安装
make -j 4
# 报错信息
xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory
#include <expat.h>
^
compilation terminated.
make[1]: *** [xml/apr_xml.lo] Error 1
make[1]: Leaving directory `/data/tools/apr-util-1.6.1'
make: *** [all-recursive] Error 1
# 解决办法
# 缺少 expat 开发库,安装 expat 库
yum install -y expat-devel

# 重新执行
make -j 4
make install

配置 Tomcat 使用 apr 库

什么是 tomcat-native
tomcat-native 库为 Tomcat 提供了本地实现
tomcat-native 依赖于三个组件:APROpenSSLJDK

大致就是通过 tomcat-native 库,使 tomcat 运行时通过 APR 更多的调用本地 API,达到提升性能的目的。
由于依赖关系,安装时,先安装 APROpenSSL,然后再安装 tomcat-native,最后配置 tomcat 启动时依赖的库路径。

安装配置 Tomcat native

具体的安装步骤其实在 tomcat 自带的 tomcat-native.tar.gz 文件中就有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 进入 Tomcat bin 目录
cd /data/app/tomcat/bin/
# 解压 tomcat-native.tar.gz 后进入解压目录
tar -zxvf tomcat-native.tar.gz
# cd tomcat-native-1.2.8-src/native/ # Tomcat7
cd tomcat-native-1.1.33-src/jni/native/
# 配置 指定 JDK 的目录并加入 SSL
./configure \
--prefix=/data/apr \
--with-apr=/data/apr/bin/apr-1-config \
--with-java-home=/data/jdk1.8.0_172 \
--with-ssl=yes
# 编译安装
make -j 4
make install

warning: remember to run 'libtool --finish /usr/local/apr/lib'
libtool --finish /data/apr/lib
-bash: libtool: command not found
yum -y install libtool libtool-devel
libtool --finish /data/apr/lib

###################################################################################################
cd tomcat-native-1.2.16-src/native/
/data/apr/build-1/libtool --mode=install /bin/install -c -m 755 libtcnative-1.la /data/apr/lib
libtool: install: /bin/install -c -m 755 .libs/libtcnative-1.so.0.2.16 /data/apr/lib/libtcnative-1.so.0.2.16
libtool: install: (cd /data/apr/lib && { ln -s -f libtcnative-1.so.0.2.16 libtcnative-1.so.0 || { rm -f libtcnative-1.so.0 && ln -s libtcnative-1.so.0.2.16 libtcnative-1.so.0; }; })
libtool: install: (cd /data/apr/lib && { ln -s -f libtcnative-1.so.0.2.16 libtcnative-1.so || { rm -f libtcnative-1.so && ln -s libtcnative-1.so.0.2.16 libtcnative-1.so; }; })
libtool: install: /bin/install -c -m 755 .libs/libtcnative-1.lai /data/apr/lib/libtcnative-1.la
libtool: install: /bin/install -c -m 755 .libs/libtcnative-1.a /data/apr/lib/libtcnative-1.a
libtool: install: chmod 644 /data/apr/lib/libtcnative-1.a
libtool: install: ranlib /data/apr/lib/libtcnative-1.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/data/jdk1.8.0_144/bin:/data/jdk1.8.0_144/jre/bin:/root/bin:/sbin" ldconfig -n /data/apr/lib
----------------------------------------------------------------------
Libraries have been installed in:
/data/apr/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

# 将 apr 加载到 ldconfig 中
vim /etc/ld.so.conf.d/apr.conf
/data/apr/lib
/data/apr-util/lib
/data/apr-iconv/lib

# 重新加载以下 ldconfig
ldconfig -v | grep apr
/data/apr/lib:
libapr-1.so.0 -> libapr-1.so.0.6.3
/data/apr-util/lib:
libaprutil-1.so.0 -> libaprutil-1.so.0.6.1
/data/apr-iconv/lib:
libapriconv-1.so.0 -> libapriconv-1.so.0.2.2

CentOS 6.x 安装配置 Tomcat native

CentOS 6.x 会出现以下这类问题

1
2
3
4
checking OpenSSL library version >= 1.0.2... 
Found OPENSSL_VERSION_NUMBER 0x1000105f (OpenSSL 1.0.1e 11 Feb 2013)
Require OPENSSL_VERSION_NUMBER 0x1000200f or greater (1.0.2)
configure: error: Your version of OpenSSL is not compatible with this version of tcnative

OpenSSL 版本与 tcnative 版本不兼容
CentOS 7.2 或以上版本不会出现这类问题
需要手工安装 OpenSSL 1.0.2 或以上版本

1
2
3
4
5
6
7
8
9
10
11
12
# 下载 OpenSSL
wget -c https://www.openssl.org/source/openssl-1.0.2p.tar.gz

wget -c https://www.openssl.org/source/openssl-1.1.0i.tar.gz

# 安装 OpenSSL
tar -xvf openssl-1.1.0i.tar.gz
cd openssl-1.1.0i/
./config --prefix=/usr/local/openssl
./config -t
make -j 4
make install
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 将 openssl 的 lib 加入系统 ldconfig 中
vim /etc/ld.so.conf.d/openssl.conf
/usr/local/openssl/lib
# 加载一下
ldconfig -v
ldconfig -v | grep libssl

# 查看 OpenSSL 版本
/usr/local/openssl/bin/openssl version -a

# 如果遇到以下错误
openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
openssl: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

# 是由于 OpenSSL 库的位置不正确造成的
# 做一下软链接,就好了
ln -svnf /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -svnf /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

# 配置环境变量
vim /etc/profile.d/openssl.sh
#!/bin/bash

export OPENSSL_HOME=/usr/local/openssl
export PATH=$PATH:$OPENSSL_HOME/bin
openssl version -a

# 或把原来的命令备份一下,做个软链接
ll -h /usr/bin/openssl
mv /usr/bin/openssl{,_bak}
mv /usr/include/openssl{,openssl_bak}
ln -svnf /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -svnf /usr/local/openssl/include/openssl /usr/include/openssl

有 两 种方式配置 Tomcat 使用 apr 库

方式一:配置 Tomcat Native 环境变量

Linux 系统中,只要 $LD_LIBRARY_PATH 变量值所在路径包含 Tomcat 本地库
默认就使用 org.apache.coyote.http11.Http11AprProtocol

1
2
3
4
5
vim /etc/profile.d/apr.sh
#!/bin/bash
export LD_LIBRARY_PATH=/data/apr/lib

source /etc/profile

方式二:将 apr 库路径参数添加到 Tomcat 系统变量中(推荐)

编辑 $CATALINA_HOME/bin/setenv.sh 文件(如果文件不存在,新建文件)

1
export CATALINA_OPTS="$CATALINA_OPTS -Djava.library.path=/data/apr/lib"

修改 $TOMCAT_HOME/conf/server.xml

1
2
3
4
5
<Connector port="8000"
protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443"
protocal 修改为 org.apache.coyote.http11.Http11AprProtocol,重启 tomcat

测试

启动 Tomcat,若在控制台或日志出现类似如下示例信息
则表示 APR 配置成功

1
INFO: Loaded APR based Apache Tomcat Native library 1.1.33.

检查是否安装成功
如果看到下面的启动日志,表示成功

1
2
3
4
5
6
Sep 17, 2017 1:59:19 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-apr-8080"]
Sep 17, 2017 1:59:19 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-apr-8009"]
Sep 17, 2017 1:59:19 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 31002 ms
---------------- The End ----------------
0%