我使用 tomcat 8.5.4 在端口 443 上构建一个基于 https 的服务器,如下所示:
94 <Connector
95 protocol="org.apache.coyote.http11.Http11NioProtocol"
96 port="8000" maxThreads="200"
97 scheme="https" secure="true" SSLEnabled="true"
98 keystoreFile="conf/rs_keystore.jks" keystorePass="ntsdawn"
99 clientAuth="false" sslProtocol="TLS"/>
但是一个client使用tcp去连接8000端口,然后很快就关闭了tcp连接。在此之后,在我的服务器中,连接处于 CLOSE_WAIT 状态,更重要的是,CPU 增长并且 org.apache.tomcat.util.net.TLSClientHelloExtractor 对象被 gc 触发器快速创建:
root@nts32:/home/vcloud/apache-tomcat-8.5.4/logs# jmap -histo 14 | head
num #instances #bytes class name
----------------------------------------------
1: 5159655 165108960 java.util.HashMap$Node
2: 9138 131509512 [I
3: 5148446 123562704 java.util.ArrayList
4: 5145501 123492024 java.util.concurrent.LinkedBlockingQueue$Node
5: 5145486 123491664 org.apache.tomcat.util.net.**TLSClientHelloExtractor**
6: 3210008 102720256 java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
7: 2162508 86500320 java.util.HashMap$KeyIterator
并且连接将永远保持在 CLOSE_WAIT....
但是,如果我像这样修改 server.xml 使用 http 而不是 https:
70 <Connector port="8000" protocol="org.apache.coyote.http11.Http11NioProtocol"
71 connectionTimeout="20000"
72 redirectPort="8443" />
然后一切就OK了。 TCP 连接来了,我的服务器将在客户端发送 FIN 时回复 FIN。
是不是我的https配置有问题?
最佳答案
tomcat 8.5.4 中存在一个错误,当套接字连接在 TLS 握手完成之前断开时,TLS 连接会进入循环。升级到 tomcat 8.5.5 或更高版本 应该可以解决这个问题。
下面是错误
关于java - 带有 https 的 tomcat 在直接 TCP 连接时获得 CLOSE_WAIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39718556/