1. 概述
本文介绍 Tomcat 服务器部署 中一些报错及解决方案。
2. 数据决策系统中,中文无法搜索
问题描述:
Tomcat 独立部署 成功后,在决策平台内搜索时,输入中文无法正常搜索,但在本地输入中文进行搜索是可以的。
原因分析:Tomcat 的 URIEncoding 值不是 UTF-8,导致中文被转码,无法被搜到。
解决方案1:请至少使用Tomcat8以上版本部署,URIEncoding 值默认为 UTF-8。
解决方案2:手动添加 URIEncoding 属性值。
1)以管理员身份进入%TOMCAT_HOME%/conf文件夹,使用文本编辑器打开server.xml文件。
2)在server.xml文件中,找到以下配置块,规定了 Tomcat 监听 HTTP 请求的端口号等信息。
3)添加一个属性「URIEncoding="UTF-8"」,即可让 Tomcat 以 UTF-8 的编码处理 get 请求。
4)保存并关闭server.xml文件。请参考 关闭或重启FineReport工程 文档,重启Tomcat服务器,以使配置生效。
3. JDK12 环境下报错
4. 报错404
4.1 案例一
问题描述:
The origin server did not find a current representation for the target resource or is not willing to disclose that one exist.
解决方案:
确保访问 11.0 报表工程时 URL 是正确的:http://localhost:8080/webroot/decision,工程路径不能漏掉,且路径中大小写敏感。
这个报错大概率是 Tomcat 和 JDK 版本引起的,推荐使用 Tomcat8.5.57 及以上版本,或者 Tomcat8 最新版本;JDK 要求 1.8 且小版本需在 JDK8u102 以上。
4.2 案例二
问题描述:
The requested resource is not available.
解决方案:
需要检查一下 JDK 的环境变量配置是否有错,特别是有没有设置 JAVA_HOME。
Tomcat 版本太低也可能会导致这个错误,推荐使用 Tomcat8.5.57 及以上版本,或者 Tomcat8 最新版本。
4.3 案例三
问题描述:
Tomcat 启动报错:fine assist start failed
解决方案:
检查环境变量指向的%JRE_HOME%\bin底下没有 attach.dll,若没有 attach.dll 文件,需要将%JAVA_HOME%\jdk\jre\bin下的 attach.dll 文件拷贝到此路径下。
4.4 案例四
问题描述:
日志报错:The error reported was [E:\tomcat\apache-tomcat-7.0.79\bin\tcnative-1.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform]
解决方案:
检查 JDK 版本是否与操作系统对应,如32位的系统只能使用32位的 JDK,64位的系统只能使用64位的 JDK。
4.5 案例五
问题描述:
Tomcat 升级或更换为其他版本后,访问报表时报404错误,且日志文件中存在 RFC 系列错误信息。
解决方案1:
修改 %Tomcat_HOME%\conf 目录下的 server.xml 文件,在 server.xml 中添加如下代码,重启服务器即可。
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"
relaxedQueryChars='^{}[]|"' />
解决方案2:
修改%Tomcat_HOME%\conf\catalina.properties文件中注释掉的这行。
#tomcat.util.http.parser.HttpParser.requestTargetAllow=|
或 将内容修改为:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
如果修改 server.xml 后还是中文乱码,可以在 catalina 文件中添加:
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8
5. 配置管理员密码出错
问题描述:
使用 exe 安装包安装的 Tomcat,部署工程后设置管理员账号时前端报错:配置管理员密码出错,后台报错:ERROR [standard] Database is not initialized,如下图所示:
解决方案:
这是由于 exe 启动方式内存不足导致的,需要调大 tomcat 启动内存。
修改内存方法请参见:Tomcat修改内存
6. 工程部署到 Tomcat 后没有生成 fanruan.log
问题描述:
FineReport 工程部署到 Tomcat 后,%Tomcat_HOME%\logs文件夹下没有生成 fanruan.log 文件,无法查看工程执行情况。
而且报错:
java.io.FileNotFoundException: /var/lib/tomcat8/../logs/fanruan.log (No such file or directory)
解决方案:
1)在%Tomcat_HOME%\webapps\webroot\WEB-INF路径下新建一个名为 config 的文件夹。
2)在 config 文件夹中新增log4j.properties文件,如下图所示:
文件内容如下所示:
log4j.rootLogger=${LOG_ROOT_LEVEL},standard,stdout
log4j.appender.standard=com.fr.third.apache.log4j.DailyRollingFileAppender
log4j.appender.standard.DatePattern='.'yyyy-MM-dd
log4j.appender.standard.File=${LOG_HOME}/../logs/fanruan.log
log4j.appender.standard.layout=com.fr.third.apache.log4j.PatternLayout
log4j.appender.standard.layout.ConversionPattern=%d{HH\:mm\:ss} %t %p [%c] %m%n
log4j.appender.standard.Append=true
log4j.appender.stdout=com.fr.third.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=com.fr.third.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{HH\:mm\:ss} %t %p [%c] %m%n
用户可在代码第四行修改日志存放路径。
7. 工程启动时闪退
问题描述:
用户将 FineReport 工程部署到 Tomcat 服务器上,启动 FineReport 工程时出现闪退现象;将 Tomcat 中部署的 FineReport 工程删除,单独启动 Tomcat ,可以正常启动。日志报错如下图所示:
运行到 ResourceUpdateActivator 模块时闪退。
原因分析:
360 安全软件阻挡。
解决方案:
1)把运行 java 程序的 java.exe 添加到信任中,即可正常运行。如下图所示:
注:该方法适用范围:360 天擎-Windows 服务器版。
2)若采取步骤一后还是无法启动,需关闭「文件系统防护」按钮。如下图所示:
8. Post 提交参数过多时子报表无法显示
问题描述:
当将 FineReport 部署到 Tomcat 上时,当需要将主表的参数通过网络报表全部传递给子表,选择如下图的设置:
点击主表的链接,钻取到子表。而有时候主表有需要大量的传递参数,将参数传递和继承给各个子表,会导致子表无法显示无法运算的问题,页面为空白页面或者如下图所示:
原因分析:
由于 Tomcat 默认的 post 参数的最大大小为 2M, 当超过时将会出错,可以配置 maxPostSize 参数来改变大小。传出的参数大小超过这个限制就会导致上面的问题。
解决方案:
注:该解决方案适用于 Tomcat7 及以上版本。
从 Apache-Tomcat-7.0.63 开始,参数 maxPostSize 的含义就变为: 如果将值设置为 0,表示 POST 最大值为 0,如果将值设置为 -1,表示不限制 post 大小。
在此版本之前设置为 0 表示不限制 post 大小。
在 Tomcat 文件夹下的 conf 文件中的 server.xml 配置中添加:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxPostSize="-1"
maxHttpHeaderSize ="102400"/>
参数说明:
maxPostSize="-1" //-1 表示不限制大小。
maxPostSize:指定 post 方式请求的最大量,没有指定默认为 2097152。
maxHttpHeaderSize ="102400"。
maxHttpHeaderSize:HTTP 请求和响应头的最大量,以字节为单位,默认值为 4096 字节。
9. Tomcat 前端报错 400
问题描述
高版本 Tomcat(7.0.76以后)会严格按照对 RFC 3986 规范进行访问解析,而 RFC 3986 规范定义了 URL 中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。传入的参数若不在 RFC3986中 的保留字段中,会报 400 错误。
解决方案
1)修改%Tomcat_HOME%/conf/server.xml文件,增加下面代码:
maxpostsize="209715200"
maxHttpHeaderSize="16384"
relaxedPathChars="[]|"
relaxedQueryChars="[]|{}^\`"<>"
useBodyEncodingForURI="true"
URIEncoding="UTF-8"
如下图所示:
2)重启工程。
10. 云迁移目录丢失
Ubuntu 系统下,将正式环境中的 Tomcat 打包后拷贝到云服务器上,启动Tomcat后,目录丢失,同时,在目录管理中新增目录,提示报错信息“目录已存在”。
10.1 报错信息一
问题描述
报错信息如下所示:
AWT is not properly configured on this server. Perhaps you need to run your container with "-Djava
.awt.headless=true"? See also: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+got+java.awt.headle ss+problem
java.lang.UnsatisfiedLinkError: /mnt/jdk1.8/jre/lib/amd64/libawt_xawt.so: libXrender.so.1: cannot open shared
object file: No such file or directory
解决方案
apt-get install libxrender-dev,重启 Tomcat 。
10.2 报错信息二
问题描述
java.lang.UnsatisfiedLinkError: /mnt/jdk1.8/jre/lib/amd64/libawt_xawt.so: libXtst.so.6: cannot open shared object
file: No such file or directory
解决方案
apt-get install libxtst-dev,重启 Tomcat 。
11. 请求目标中找到无效字符
问题描述:
启动Tomcat工程报错:在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义。
原因分析:
有些地址被Tomcat认定存在不合法字符
7.0.76及之后版本Tomcat中的新特性,严格按照 RFC 3986 规范进行访问解析
RFC 3986规范定义了URL中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])
解决方案:
1)检查不合法字符
检查系统地址和地址传参中,是否存在不合法字符。
例如在URL中传入了一段json,传入的参数中有"{"字符,不在RFC3986中的保留字段中
2)放行不合法字符
在/conf/catalina.properties文件中,找到最后注释掉的一行
#tomcat.util.http.parser.HttpParser.requestTargetAllow=|
改成
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
表示把{}放行