Tomcat相关问题


原文链接: Tomcat相关问题

set JAVA_OPTS=%JAVA_OPTS% -server -Xms512m -Xmx512m -XX:MaxNewSize=256m -XX:PermSize=512M -XX:MaxPermSize=512m

Tomcat运行一段时间后,自动停止关闭,To prevent a memory leak,Druid 数据库连接自动关闭, the JDBC Driver has been forcibly unregistered.

  1. 解决办法
    将Tomcat中server.xml监听器注释掉,重启tomcat
    vi tomcat9/conf/server.xml //注释如下两行:

<?xml version='1.0' encoding='utf-8'?>

Tomcat 权限大类上分为Manager和Admin两种

Manager

  1. manager-gui
    允许访问html接口(即URL路径为/manager/html/*)
  2. manager-script
    允许访问纯文本接口(即URL路径为/manager/text/*)
  3. manager-jmx
    允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)
  4. manager-status
    允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)

ps. manager-gui、manager-script、manager-jmx均具备manager-status的权限
即 manager-gui、manager-script、manager-jmx三种角色权限无需再额外添加manager-status权限,即可直接访问路径/manager/status/*

Admin

  1. admin-gui
    allows access to the HTML GUI
  2. admin-script
    allows access to the text interface

8005端口

server.xml中有这样一句:

<Server port="8005" shutdown="SHUTDOWN">

我们通过 telnet 命令访问 8005 端口并执行 SHUTDOWN(区分大小写)

telnet 127.0.0.1 8005
SHUTDOWN

不需要任何验证即可将 tomcat 关闭!

优化方式:

  1. 更换端口
  2. 更换关闭命令


错误页面

若使用 tomcat 默认错误页面,比如 404,则会暴露服务器版本等信息
为避免该情况,可以自定义错误页面:

  1. web.xml 倒数第二行增加配置

    <error-code>404</error-code>
    <location>/index.jsp</location>
    

  2. webapps/ROOT 下增加错误页面 index.jsp

删除自带信息

tomcat/webapps 下的所有文件夹

docker rm -f tomcat ; docker run --restart=always -d --name tomcat -p 10000:8080 -v /docker/tomcat/webapps/:/usr/local/tomcat/webapps/ -v /docker/tomcat/logs:/usr/local/tomcat/logs rinetd/tomcat:8.5

SpringBoot 启动慢

解决方法是修改成非阻塞的熵源/dev/urandom。
可以修改java.security文件中的securerandom.source值,也可以使用参数java.security.egd:

java -jar app.jar -Djava.security.egd=file:/dev/./urandom

至于为什么是/dev/./urandom,而不是/dev/urandom,这源于java的一个bug。大意是/dev/urandom在某些情况下可能还是最终会转换成调用/dev/random。所以为了保险起见,还是使用/dev/./urandom吧!

Tomcat 启动慢

apt install tomcat8

有两种解决办法:

1)在Tomcat环境中解决
可以通过配置JRE使用非阻塞的Entropy Source。
在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。
加入后再启动Tomcat,整个启动耗时下降到Server startup in 2912 ms。
2)在JVM环境中解决
打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成
securerandom.source=file:/dev/urandom

sed -i 's|securerandom.source=file:/dev/random|securerandom.source=file:/dev/urandom|g' /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security/java.security

开启远程调试

CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8899"  

配置服务器Tomcat
进入$TOMCAT_HOME/bin目录下

在 # OS specific support. 上面添加
export JAVA_OPTS='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'

#优化运行环境

##启动文件优化
RUN sed -i '1a JAVA_OPTS="$JAVA_OPTS -Xms2048m -Xmx12048m -XX:MaxNewSize=256m -XX:PermSize=128M -XX:MaxPermSize=512m -Xss512k"' ${CATALINA_HOME}/bin/catalina.sh

CATALINA_HOME=/usr/local/tomcat
##配置文件优化
RUN sed -i '/<Connector port="8080"/a maxThreads="800" acceptCount="1000" maxPostSize="0" URIEncoding="UTF-8"' ${TOMCAT_HOME}/conf/server.xml
RUN sed -i 's/port="8009"/port="8009" maxThreads="800" acceptCount="1000" maxPostSize="0" URIEncoding="UTF-8"/' ${TOMCAT_HOME}/conf/server.xml

##开启链接池,关闭非链接池配置

###开启线程池
####删除匹配行的上一行
RUN sed -i 'N;/\n.*tomcatThreadPool/!P;D' ${TOMCAT_HOME}/conf/server.xml
####删除匹配行的下一行
RUN sed -i '/minSpareThreads/{n;/-->/d}' ${TOMCAT_HOME}/conf/server.xml
RUN sed -i '/redirectPort/{n;/-->/d}' ${TOMCAT_HOME}/conf/server.xml
###关闭非线程池配置
RUN sed -i '//d' ${TOMCAT_HOME}/conf/server.xml

###优化线程池配置
####
RUN sed -i '//{s/150/1000/}' ${TOMCAT_HOME}/conf/server.xml
RUN sed -i '//{s/4/300/}' ${TOMCAT_HOME}/conf/server.xml
####<Connector executor="tomcatThreadPool" port="80" protocol="HTTP/1.1" connectionTimeout="20000"

enableLookups="false" redirectPort="8443" URIEncoding="UTF-8" acceptCount="1000" />

RUN sed -i '/Connector executor="tomcatThreadPool"/a enableLookups="false" URIEncoding="UTF-8" acceptCount="1000"' ${TOMCAT_HOME}/conf/server.xml

##正则表达式编辑xml,增加应用部署目录
##**对应的目录必须存在,否则启动会报错
RUN sed -i '//{//{/pattern=/{s/\/>/\/> \n /}}}' ${TOMCAT_HOME}/conf/server.xml

#清除管理用户
#RUN sed -i '//,/<\/tomcat-users>/d' ${TOMCAT_HOME}/conf/tomcat-users.xml

#集群配置session共享;需要先启动session服务

#配置redis 共享
RUN sed -i '//a

    <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" /> \
    <Manager className="com.radiadesign.catalina.session.RedisSessionManager"  \
             host="myredis"  \
             port="6379" \
             database="0"  \
             maxInactiveInterval="60"/>   \
' ${TOMCAT_HOME}/conf/context.xml

###增加数据源
RUN sed -i '//a

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"  \
               maxActive="100" maxIdle="30" maxWait="10000"  \
               username="java" password="java" driverClassName="com.mysql.jdbc.Driver"  \
               url="jdbc:mysql://mysql:3306/javatest"/>  \
' ${TOMCAT_HOME}/conf/context.xml

RUN cat ${TOMCAT_HOME}/conf/context.xml

#删除注释文件
RUN sed -i '/<!–/,/–>/d' ${TOMCAT_HOME}/conf/server.xml
RUN sed -i '/<!–/,/–>/d' ${TOMCAT_HOME}/conf/tomcat-users.xml

修改tomcat 内存

JAVA_OPTS='-Xms2048M -Xmx4096m -XX:MaxNewSize=128m -XX:MaxPermSize=256m -XX:PermSize=128M'

在Jetty 的VM参数中设置:
-Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

在tomcat运行环境中设置:
window环境 startup.bat第一行
SET CATALINA_OPTS= -Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

linux环境在catalina.sh

"if [ $have_tty -eq 1 ]; then"之后增加
JAVA_OPTS="-server -Xms256m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m"

1、对于安装版的TOMCAT:

进入TOMCAT的安装目录下的bin目录,双击tomcat6w.exe。点击Java选项卡,可设置初始化内存,最大内存,线程的内存大小。
初始化内存:如果机器的内存足够大,可以直接将初始化内存设置为512M,如果机器内存较小可适当调小,对于运行了EJB的应用,最好不要低于128M。
最大内存:最大内存目前设置为512M.
线程内存大小:目前配置为1024KB,这也是JDK5.0后的默认配置。
对于容器下运行了多个WEB应用时,尽量将相同的JAR包转移到TOMCAT的lib下,此外还需要在JAVA OPTIONS加上如下配置:
-XX:PermSize=16m
-XX:MaxPermSize=128m
此配置表示JAVA永久保存区域(即不会被虚拟机回收)初始大小为16M,最大为128M。

2、对于解压版的TOMCAT:

如果是WINDOWS操作系统,修改catalina.bat文件;否则修改catalina.sh文件。只需要在文件的头部加上"set JAVA_OPTS=-Xms512m -Xmx512m -Xss1024k”,数值分别对应了初始化的最小内存,最大内存,线程内存大小。如果JDK的版本是5.0之后的,线程内存可以不用设置。

3、linux系统下修改方法

在/usr/local/apache-tomcat-5.5.23/bin目录下的catalina.sh
添加:JAVA_OPTS=’-Xms512m -Xmx1024m’
要加“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。
-Xms:初始值
-Xmx:最大值
-Xmn:最小值

对于容器下运行了多个WEB应用时,尽量将相同的JAR包转移到TOMCAT的lib下,此外还需要在JAVA OPTS后加上如下配置:
-XX:PermSize=16m -XX:MaxPermSize=128m

即为:JAVA_OPTS=’-Xms256m –Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m’
此配置表示JAVA永久保存区域(即不会被虚拟机回收)初始大小为16M,最大为128M。

修改内存后,可启动TOMCAT,输入http://127.0.0.1:8080,进入Status,会提示输入登录的用户名和密码,用户可以在conf/tomcat-user.xml中配置(配置完后需要重启TOMCAT),

<?xmlversion='1.0'encoding='utf-8'?>



登录后即可看到TOMCAT当前的空闲内存和最大内存。

tomcat报Exception in thread "http-8080-36" java.lang.OutOfMemoryError: PermGen space异常的解决:

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,

这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,
它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对
PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen space错误,
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小
超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法: 手动设置MaxPermSize大小

修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=128m -XX:MaxPermSize=256m”

建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。

`