[TOC]
问题0.Tomcat指定Java版本运行
解决方法:在Tomcat里的bin中的setclasspath.bat或者setclasspath.sh开头添加设置环境变量;
代码语言:javascript复制#Windows : Tomcat/bin/setclasspath.bat
set JAVA_HOME = C:JAVAJDK8
set JRE_HOME = C:JAVAJDK8JRE
#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
#将文件中下列:
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启动时候警告在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间
问题描述:启动时候报这样的警告:
代码语言:javascript复制警告 [main] org.apache.catalina.webresources.Cache.getResource
无法将位于[/WEB-INF/classes/templates/framework/help/helpinfo.html]的资源添加到Web应用程序[/zhfx]的缓存中,
因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间。
解决办法: 在 /conf/context.xml
的 </Context>
前添加以下内容(大小默认是1024,单位是KB):
<Resources cachingAllowed="true" cacheMaxSize="100000" />
问题3.Tomcat如何在启动时候设置JVM参数
解决方法:在 bincatalina.bat
文件打开并且在262行左右,set JPDA= 下面一行添加如下:
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标签配置;
解决方法:
代码语言:javascript复制<!-- 注意这里要在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文件是否存在
#输入命令
service.bat install '服务名';
services.msc #看服务管理器,看是否添加好了
如果添加好了的话进入属性设置为自动 (避免宕机时可以重新启动),此时在bin目录下启动tomcat9.exe 点击启动ok;
问题6.Tomcat关闭日志输出
描述:在部署Tomcat后运行久了catalina.out会越来越大,对系统的稳定造成了一定的影响;可以通过以下方式进行屏蔽掉该部分的日志信息;
代码语言:javascript复制# 方式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元素参数
代码语言:javascript复制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编码转换
代码语言:javascript复制# 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;
代码语言:javascript复制docker run -d -p 8080:8080 -v /HMK/helloword/webapps:/usr/tomcat/webapps --name tomcat jamtur01/tomcat
解决办法:使用-v参数将war包挂载至容器内的 tomcat/webapps目录
代码语言:javascript复制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,这里是挂载的单个文件