tomcat调优实践

持续整理中

调优思路

  • 清空webapps

  • 隐藏tomcat版本号

  • 开启apr

  • 修改随机数生成器

  • 修改8005重启命令

  • 禁用8009

  • Connector和exec优化

  • 开机启动

  • systemd支持

  • cron自动重启自动清理日志

  • 关闭autoDeploy

  • 使用LD_LIBRARY_PATH替换java.library.path

关闭autoDeploy

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

使用LD_LIBRARY_PATH替换java.library.path

1
2
3
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=$CATALINA_HOME/extra/lib
会覆盖系统环境变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH/path/to//so-lib
  • 添加多个值 -Djava.library.path=/opt/hdf-java/build/bin:/opt/opencv-2.4.10/build/lib

隐藏版本

1
2
3
4
cd apache-tomcat/lib/
unzip catalina.jar
修改 org/apache/catalina/util/ServerInfo.properties
增量更新jar包: jar -uvf catalina.jar org/apache/catalina/util/ServerInfo.properties

自定义header Server

conf/server.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<Connector port="8080" protocol="HTTP/1.1"  
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />

修改后如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true"
server="Microsoft-IIS/6.5"/>

开启apr

LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。
LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只设置RPATH
这么多搜索路径,他们有个先后顺序如下
1、RUMPATH 优先级最高
2、RPATH 其次
3、LD_LIBRARY_PATH
4、/etc/ld.so.cache
5、/usr/lib/ /lib/

1
2
3
4
yum -y install apr-devel
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib
或者:
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"

bin/catalina.sh stop 不生效问题

在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。
/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止。\这样的设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。

/dev/random的一个副本是/dev/urandom(“unblocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。
这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。

1
2
3
sed -i 's/securerandom.source=file:\/dev\/random/securerandom.source=file:\/dev\/urandom/g' /usr/java/jdk1.8.0_192/jre/lib/security/java.security

-Djava.security.egd=file:/dev/./urandom

使bin/catalina.sh stop -force生效

cat >> /data/webserver/tomcat/bin/setenv.sh << EOF
#!/bin/bash
CATALINA_PID=$CATALINA_HOME/bin/catalina.map.pid
EOF

Connector优化

1
2
3
4
5
6
7
8
9
10
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="5000"
minSpareThreads="2500"
maxSpareThreads="3750"
enableLookups="false" //禁用dns解析
edirectPort="8443"
acceptCount="1024"
debug="0"
connectionTimeout="10000"
disableUploadTimeout="true" />

prometheus监控jmx

1
2
3
4
5
6

- cat jmx.sh
#!/usr/bin/env bash
# Script to run a java application for testing jmx4prometheus.
# Note: You can use localhost:5556 instead of 5556 for configuring socket hostname.
java -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=5555 -jar ./jmx_prometheus_httpserver-0.12.0-jar-with-dependencies.jar 5556 ./tomcat.yml
  • cat setenv.sh
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    CATALINA_PID=$CATALINA_HOME/bin/catalina.map.pid
    JAVA_OPTS="$JAVA_OPTS -Djava.library.path=$CATALINA_HOME/extra/apr/lib
    -Djava.security.egd=file:/dev/./urandom
    -Djava.awt.headless=true"
    [ -f $CATALINA_HOME/extra/catalina_opts.sh ] && source $CATALINA_HOME/extra/catalina_opts.sh
    [ -f $CATALINA_HOME/extra/jmx_exporter_opts.sh ] && source $CATALINA_HOME/extra/jmx_exporter_opts.sh
  • cat jmx_exporter_opts.sh
    1
    JAVA_OPTS="$JAVA_OPTS -javaagent:/data/webserver/tomcat/extra/jmx_exporter/jmx_prometheus_javaagent-0.12.0.jar=7788:/data/webserver/tomcat/extra/jmx_exporter/tomcat.yml"
  • tomcat开启jmx

解决验证码不显示的问题