坑一:运行tomcat报APR错误:
参考:https://www.cnblogs.com/mliudong/p/3844140.html
部署Tomcat的时候出现了如下错误,
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/java/jdk1.6.0_30/jre/lib/amd64/server:/usr/java/jdk1.6.0_30/jre/lib/amd64:/usr/java/jdk1.6.0_30/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
其实这个问题以前解决过,但是没有记录,所以今天解决了以后决定把它记下来。
原因很简单,就是Tomcat在Server.xml中默认有配置加载ARP library,但是没找到相关文件。
配置文件是这样写的,
<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
配置中讲的/docs/apr.html网上的版本是http://tomcat.apache.org/tomcat-6.0-doc/apr.html
意思是装上libtcnative就好了,这个包在Tomcat发行版中就包含了,在bin/tomcat-native.tar.gz.
安装前先确保你的机器已安装,openssl,JDK,apr,apr-devel,然后解压此文件,使用经典的./configure && make && make install,如果报找不到apr可以在configure时增加--with-apr=/usr/bin/apr-1-config.
安装完成后,libtcnative.1.so被放在了/usr/local/apr/,但是Tomcat的java.library.path并不包含这个目录,可以使用ln -s /usr/local/apr/lib/libtcnative-1.so /usr/lib64/libtcnative-1.so命令解决。
重启Tomcat,可以在日志中看到,APR模块已经正常加载。
Jul 10, 2012 11:52:49 AM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.24.
然后,发现日志中有另外的错误
Jul 10, 2012 11:52:49 AM org.apache.coyote.http11.Http11AprProtocol init
SEVERE: Error initializing endpoint
java.lang.Exception: No Certificate file specified or invalid file format
at org.apache.tomcat.jni.SSLContext.setCertificate(Native Method)
at org.apache.tomcat.util.net.AprEndpoint.init(AprEndpoint.java:733)
at org.apache.coyote.http11.Http11AprProtocol.init(Http11AprProtocol.java:107)
at org.apache.catalina.connector.Connector.initialize(Connector.java:1049)
at org.apache.catalina.core.StandardService.initialize(StandardService.java:703)
at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:838)
at org.apache.catalina.startup.Catalina.load(Catalina.java:538)
at org.apache.catalina.startup.Catalina.load(Catalina.java:562)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Jul 10, 2012 11:52:49 AM org.apache.catalina.core.StandardService initialize
SEVERE: Failed to initialize connector [Connector[HTTP/1.1-8443]]
LifecycleException: Protocol handler initialization failed: java.lang.Exception: No Certificate file specified or invalid file format
at org.apache.catalina.connector.Connector.initialize(Connector.java:1051)
at org.apache.catalina.core.StandardService.initialize(StandardService.java:703)
at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:838)
at org.apache.catalina.startup.Catalina.load(Catalina.java:538)
at org.apache.catalina.startup.Catalina.load(Catalina.java:562)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Google得知需要在HTTPS的配置中
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="你的.keystore文件" />
将protocol中的HTTP/1.1改为org.apache.coyote.http11.Http11Protocol就可以解决,不知道为啥。
原帖地址:http://blog.sina.com.cn/s/blog_45c6cec00101izyi.html
坑二:启动超慢
操作日志卡在:[localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory
参考:https://blog.csdn.net/cjh365047871/article/details/79163321
tomcat启动时一直卡在[localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory,通过查找资料发现这个问题和jvm上的熵池策略有关。
1. 熵池
Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。
计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。
系统内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
2. JVM上的随机数与熵池策略
在apache-tomcat官方文档How do I make Tomcat startup faster?里面提到了一些启动时的优化项,其中一项是关于随机数生成时,采用的“熵源”(entropy source)的策略。
文档中提到了tomcat7的session id的生成主要通过java.security.SecureRandom生成随机数来实现,随机数算法使用的是“SHA1PRNG”,在sun/oracle的jdk里,这个算法的提供者在底层依赖到操作系统提供的随机数据,在linux上,与之相关的是/dev/random和/dev/urandom。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。
/dev/random依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,对/dev/random的读操作将会被阻塞,直到熵估算值增大到一定域值才会返回一个随机数。/dev/random可生成高随机性的数据,对于生成高质量的加密密钥或者是需要长期保护的场景,一般要采用该种方式。
/dev/urandom (“unlocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据,无论熵池的熵估算值是否为零。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵一般小于/dev/random。它可以作为生成较低强度密码的伪随机数生成器。 使用cat命令可以读取/dev/random和/dev/urandom的数据流(将输出转换为16进制)。
cat /dev/random | od -x
cat /dev/urandom | od -x | head -10
/dev/random产生数据的速度很慢,运行一段时间之后,只输出了一条数据,然后就一直阻塞。而/dev/urandom的产生速度很快,基本没有任何停顿。
3. /dev/random产生速度很慢的解决办法
在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom
或者将$JAVA_HOME/jre/lib/security/java.security内的securerandom.source参数修改为file:/dev/./urandom
将securerandom.source参数修改为file:/dev/./urandom后,tomcat的问题解决。
---------------------
作者:DivineH
来源:CSDN
原文:https://blog.csdn.net/qq_38293564/article/details/80395389
版权声明:本文为博主原创文章,转载请附上博文链接!
坑三:远程无权限登录tomcat界面
参考:https://blog.csdn.net/cjh365047871/article/details/79163321
tomcat8.5之后配置了用户名密码之后默认只能本地访问,远程是无法访问的,可用下面方法进行解决
1. C:\Users\Administrator\Desktop\apache-tomcat-8.5.27-windows-x64\apache-tomcat-8.5.27\conf\tomcat-users.xml 中增加
<role rolename="manager-gui"/>
<user username="admin" password="a123456" roles="manager-gui"/>
2. C:\Users\Administrator\Desktop\apache-tomcat-8.5.27-windows-x64\apache-tomcat-8.5.27\webapps\manager\META-INF\context.xml中注释掉配置
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
3. 解决部署是war包过大无法上传的问题【修改/apache-tomcat-8.5.28/webapps/manager/WEB-INF/web.xml】
<multipart-config>
<!-- 500MB max -->
<max-file-size>524288000</max-file-size>
<max-request-size>524288000</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>
</servlet>
4. jenkins自动化部署tomcat8.5
5. tomcat访问host-manager报403错误处理方法进入目录修改 tomcat9091-2/webapps/host-manager/META-INF/context.xml allow 修改为 allow="^.*$"
6. 使用jenkins进行部署时报错 org.codehaus.cargo.container.tomcat.internal.TomcatManagerException: The username you provided is not allowed to use the text-based Tomcat Manager (error 403) 处理方式,是因为,在tomcat中没有加入 manager-script权限,增加权限即可以解决问题
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="a123456" roles="manager-gui,admin-gui,manager-script"/>
---------------------
作者:p_oldpai
来源:CSDN
原文:https://blog.csdn.net/cjh365047871/article/details/79163321
版权声明:本文为博主原创文章,转载请附上博文链接!