[TOC]

问题0.Tomcat指定Java版本运行

解决方法:在Tomcat里的bin中的setclasspath.bat或者setclasspath.sh开头添加设置环境变量;

1
2
3
4
5
6
7
#Windows : Tomcat/bin/setclasspath.bat
set JAVA_HOME = C:\JAVA\JDK8
set JRE_HOME = C:\JAVA\JDK8\JRE

#Linux:Tomcat/bin/setclasspath.sh
export JAVA_HOME=/home/jdk/Java/jdk7/jdk1.7.0_51
export JRE_HOME=/home/jdk/Java/jdk7/jre7


问题1.Tomcat控制台中文乱码

解决办法:打开你的Tomcat安装目录,接着编辑子目录conf下的文件logging.properties;
相对路径是:Tomcat/conf/logging.properties

1
2
3
4
5
6
7
#将文件中下列:
1catalina.org.apache.juli.AsyncFileHandler.encoding = utf-8
2localhost.org.apache.juli.AsyncFileHandler.encoding = utf-8
java.util.logging.ConsoleHandler.encoding = utf-8

#中utf-8改为GBK后保存:
java.util.logging.ConsoleHandler.encoding = GBK


问题2.Tomcat启动时候警告在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间

问题描述:启动时候报这样的警告:

1
2
3
警告 [main] org.apache.catalina.webresources.Cache.getResource
无法将位于[/WEB-INF/classes/templates/framework/help/helpinfo.html]的资源添加到Web应用程序[/zhfx]的缓存中,
因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间。

解决办法: 在 /conf/context.xml</Context> 前添加以下内容(大小默认是1024,单位是KB):
1
<Resources cachingAllowed="true" cacheMaxSize="100000" />


问题3.Tomcat如何在启动时候设置JVM参数

解决方法:在 bin\catalina.bat 文件打开并且在262行左右,set JPDA= 下面一行添加如下:

1
set JAVA_OPTS=-Xms1024m -Xmx2048m -XX:PermSize=256M -XX:MaxNewSize=500m -XX:MaxPermSize=500m -Djava.awt.headless=true -XX:+PrintGCDetails

参数解释:

  • -Xms表示JVM Heap(堆内存)最小尺寸128MB,初始分配
  • -Xmx表示JVM Heap(堆内存)最大允许的尺寸256MB,按需分配
  • PermSize和MaxPermSize指明虚拟机为java永久生成对象(Permanate generation)
  • 如,class对象、方法对象这些可反射(reflective)对象分配内存限制,这些内存不包括在Heap(堆内存)区之中
  • NewSize/MaxNewSize:定义YOUNG段的尺寸,
  • NewSize为JVM启动时YOUNG的内存大小(young内存为堆中的新生代,保存刚实列化的对象);
  • MaxNewSize为最大可占用的YOUNG内存大小。


问题4.Tomcat中利用war包部署避免访问路径必须加上项目名称

问题描述:当我们打包好一个Springboot项目导出message.war并且进行导入的部署,这时在tomcat中的Webapp多了一个message应用,我们去浏览器上进行访问测试输入URL,如:http://localhost:8012/message/login,如果此时不想带有message目录就可以采用在Server.xml进行Context标签配置;

解决方法:

1
2
<!-- 注意这里要在host元素下添加,而path指访问的url直接是项目地址-->
<Context docBase="D:/apache-tomcat-8.5.38/webapps/message" path="" reloadable="true" crossContext="true"/>


问题5.Tomcat如果进行注册为windows服务进行自启动

描述:打开cmd窗口window10用户记得用管理员权限打开,进入tomcat下名的bin目录查看service.bat文件是否存在

1
2
3
#输入命令 
service.bat install '服务名';
services.msc #看服务管理器,看是否添加好了

如果添加好了的话进入属性设置为自动 (避免宕机时可以重新启动),此时在bin目录下启动tomcat9.exe 点击启动ok;


问题6.Tomcat关闭日志输出

描述:在部署Tomcat后运行久了catalina.out会越来越大,对系统的稳定造成了一定的影响;可以通过以下方式进行屏蔽掉该部分的日志信息;

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
# 方式1.修改bin/catalina.sh / bat
if [ -z "$CATALINA_OUT" ] ; then
  CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
CATALINA_OUT=/dev/null
fi

# 方式2.修改conf/logging.properties日志配置文件
# 将level级别设置成WARNING就可以大量减少日志的输出,当然也可以设置成OFF,直接禁用掉。
$cat /apps/tomcat0/conf/logging.properties
1catalina.org.apache.juli.FileHandler.level = OFF
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.

2localhost.org.apache.juli.FileHandler.level = OFF
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.


# 3.关闭localhost_access_log日志修改conf/server.xml文件将AccessLogValve注释掉
<Host name="61.1.2.3" appBase=""
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_log." suffix=".txt" timestamp="true"/>
<Valve className="org.apache.catalina.valves.AccessLogValve" fileDateFormat="yyyy-MM-dd" pattern="%{X_FORWARDED_FOR}i %h %l %u$
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="127.0.0.1"/>
</Host>


7.Tomcat 版本默认字符编码导致应用参数日志乱码问题

描述:最近将Windows Server上的应用需要移植到Docker之中, 由于Tomcat版本问题在应用进行参数传递时候发生乱码;
原因:Tomcat7及以前默认采用iso-8859-1编码而Tomcat8以后版本对字符的默认编码格式是UTF-8;
解决办法:

  • 方法1:配置server.xml文件Connector元素参数
    1
    2
    3
    4
    5
    vi conf/server.xml
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
    # 参数说明:
    URIEncoding 属性将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理请求参数。
    useBodyEncodingForURI="true" 属性是指请求参数的编码方式采用请求体的编码方式,,若请求体采用UTF-8解析,则请求参数也要采用UTF-8来解析
  • 方法2:修改应用Servlet编码转换
    1
    2
    3
    4
    # Post
    request.setCharacterEncoding("UTF-8");
    # Get
    new String(username.getBytes("ISO-8859-1"),"UTF-8"); #先反向解码然后再用UTF-8编码


8.Docker构建Tomcat镜像运行时挂载应用注意事项;

描述:常规的使用将宿主机webapps目录直接挂载至容器的webapps并且启动容器后发现非ROOT.war解压运行后访问404;

1
docker run -d -p 8080:8080 -v /HMK/helloword/webapps:/usr/tomcat/webapps --name tomcat jamtur01/tomcat

解决办法:使用-v参数将war包挂载至容器内的 tomcat/webapps目录
1
2
docker run -d -p 8080:8080 -v /HMK/helloword/webapps/HelloWorld.war:/usr/tomcat/webapps/HelloWorld.war --name tomcat jamtur01/tomcat
# 注意: -v /HMK/helloword/webapps/HelloWorld.war:/usr/tomcat/webapps/HelloWorld.war,这里是挂载的单个文件