Tomcat为何额外监听大量端口?
Tomcat监听大量随机端口的原因及排查方法
我知道Tomcat默认会使用8080(HTTP服务端口)、8009(AJP协议端口)和8005(Tomcat关闭命令监听端口),但最近用netstat查看时,发现PID为2281的Tomcat进程居然监听了一大堆随机端口,具体输出如下:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::41020 :::* LISTEN 2281/java tcp6 0 0 :::34300 :::* LISTEN 2281/java tcp6 0 0 :::34621 :::* LISTEN 2281/java tcp6 0 0 :::37150 :::* LISTEN 2281/java tcp6 0 0 :::43231 :::* LISTEN 2281/java tcp6 0 0 :::34847 :::* LISTEN 2281/java tcp6 0 0 :::40512 :::* LISTEN 2281/java tcp6 0 0 :::35808 :::* LISTEN 2281/java tcp6 0 0 :::35168 :::* LISTEN 2281/java tcp6 0 0 :::33984 :::* LISTEN 2281/java tcp6 0 0 :::44577 :::* LISTEN 2281/java tcp6 0 0 :::34145 :::* LISTEN 2281/java tcp6 0 0 :::46786 :::* LISTEN 2281/java tcp6 0 0 :::44419 :::* LISTEN 2281/java tcp6 0 0 :::40291 :::* LISTEN 2281/java tcp6 0 0 :::41091 :::* LISTEN 2281/java tcp6 0 0 127.0.0.1:8005 :::* LISTEN 2281/java tcp6 0 0 :::36903 :::* LISTEN 2281/java tcp6 0 0 :::39624 :::* LISTEN 2281/java tcp6 0 0 :::36072 :::* LISTEN 2281/java tcp6 0 0 :::38825 :::* LISTEN 2281/java tcp6 0 0 :::8009 :::* LISTEN 2281/java
常见原因
- JVM调试/监控端口:如果Tomcat启动时开启了JPDA远程调试(比如启动参数里加了
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:0),JVM会自动分配随机端口供调试工具连接;另外如果没指定JMX的固定端口,JVM也会随机开启多个端口用于监控。 - Web应用自行开启的服务:部署的Web应用里可能有代码创建了
ServerSocket并使用端口0(系统随机分配端口),这种情况下每个这样的服务都会占用一个随机监听端口。 - 第三方依赖的隐式端口:应用里用到的某些框架或第三方库,可能会在后台启动Socket服务且未指定固定端口,比如某些消息队列客户端、自定义的服务注册组件等。
排查方法
- 查看Tomcat的启动脚本(比如
catalina.sh或catalina.bat),检查CATALINA_OPTS或JAVA_OPTS里是否包含调试、JMX相关的参数,确认是否有随机端口的配置。 - 用
jstack 2281命令导出线程栈,搜索包含ServerSocket、Listen关键词的线程,定位是哪个组件在监听端口。 - 执行
jcmd 2281 VM.command_line查看JVM完整的启动参数,快速确认是否有调试、监控类的配置。 - 检查Web应用的代码,特别是后台服务、定时任务相关的模块,看是否有手动创建Socket服务的逻辑。
内容的提问来源于stack exchange,提问作者Luis Carlos Cruz Castillo
相关产品推荐
相关产品推荐

