Tomcat默认使用8080作为HTTP服务端口,这在实际使用中经常遇到麻烦:要么是8080已经被其他程序占用导致启动失败,要么是同一台机器上要部署多个Tomcat实例,端口必须错开。不少人对修改端口的理解停留在只改一个数字,结果改完之后启动照样报错,或者服务起了却访问不了。这篇文章就把Tomcat端口号这件事完整讲清楚,包括涉及哪几个端口、怎么改、改完之后要如何验证和排查。

一、先搞清楚Tomcat到底有几个端口要改
打开Tomcat安装目录下conf文件夹里的server.xml,你会发现Tomcat的端口并不止一个。很多人改端口失败,就是因为只改了8080,忽略了另外两个。server.xml中一共涉及三个关键端口。
第一个是HTTP端口,也就是大家最熟悉的8080。它定义在<Connector>标签的protocol属性为HTTP/1.1的那一段,是浏览器访问Web应用时真正使用的端口,也是日常说的“改端口”主要指的那个。第二个是AJP端口,默认8009,用于Tomcat与Apache、Nginx等反向代理服务器通信。如果你没有使用AJP协议做集成,这个端口即使被占用一般也不影响HTTP访问,但建议一并改掉避免冲突。第三个是Server标签上的shutdown端口,默认8005,用于接收shutdown命令来关闭Tomcat。这个端口特别容易被忽略,如果你在同一台机器上启动第二个Tomcat实例而没有改它,启动日志里就会看到Server端口的冲突报错。
看一下server.xml中对应的三段配置,心里有数之后再去改就不容易漏:
<Server port="8005" shutdown="SHUTDOWN">
...
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3"
redirectPort="8443" />
...
</Server>需要注意redirectPort指向的是8443,这是HTTPS的重定向端口,只有配置了SSL才会真正用到。普通场景下改了HTTP端口之后,redirectPort可以不动,但如果你的集群环境统一规划了端口段,建议同步调整保持风格一致。
二、独立部署Tomcat的修改步骤与验证方法
对于传统独立部署的Tomcat,修改端口非常直接。第一步,停止正在运行的Tomcat服务,Windows下执行shutdown.bat,Linux下执行bin目录中的shutdown.sh。改配置文件前先停服务是个好习惯,虽然有些配置热改也能生效,但端口配置必须在启动时读取,改了也没用,不如规范操作。
第二步,用文本编辑器打开conf目录下的server.xml,把三个端口分别改成规划好的值。例如把HTTP端口改成9090,AJP改成9009,shutdown端口改成9005。修改时注意不要使用1024以下的端口,除非以root或管理员身份运行,否则会绑定失败。另外端口号不要和其他已运行的服务冲突,Windows下可以用命令查看占用情况:
netstat -ano | findstr :8080 tasklist | findstr <PID>
Linux下对应的命令是:
netstat -tlnp | grep 8080 # 或者使用更现代的 ss 命令 ss -tlnp | grep 8080 # 查看占用端口的进程详情 lsof -i:8080
第三步,保存文件后重新启动Tomcat,观察控制台或logs目录下的catalina.out日志,看到类似“Server startup in xxx ms”的字样说明启动成功。然后通过 http://服务器IP:9090 访问验证,能正常打开Tomcat欢迎页就说明修改生效了。
这里有一个常见的坑:如果启动日志里出现“Address already in use”,说明端口仍被占用。可能是之前的Tomcat进程没有被彻底关闭,Linux下可以用ps命令配合kill结束残留进程,Windows下则要检查任务管理器中的java.exe进程。还有一种情况是端口改成了系统保留端口范围之外的值,Linux下可以通过 cat /proc/sys/net/ipv4/ip_local_port_range 查看系统动态端口范围,避开这个区间更稳妥。
三、Spring Boot内嵌Tomcat的端口修改方式
现在大量项目使用Spring Boot,内嵌的Tomcat不需要单独的server.xml,改端口的方式变成了修改应用的配置文件。最常用的是在application.properties中写入:
server.port=9090
如果使用YAML格式,写法如下:
server: port: 9090
除了改配置文件,还有两种动态方式值得了解。一是在启动时通过命令行参数覆盖,打包成jar后这样启动:
java -jar demo.jar --server.port=9090
二是通过环境变量指定,这在Docker容器和Kubernetes环境中特别常见,因为不需要重新打包,只需要改部署配置:
# Linux 环境 export SERVER_PORT=9090 java -jar demo.jar
这几种方式的优先级从高到低是:命令行参数高于环境变量,环境变量高于配置文件。理解这个优先级关系在做多环境部署时很有用,比如配置文件里写8080,测试环境通过环境变量覆盖成9090,生产环境再覆盖成其他值,互不干扰。
四、多实例部署的端口规划建议与避坑要点
当一台服务器需要跑多个Tomcat实例时,端口规划要有章法,推荐按实例做整段规划。比如第一个实例用8080、8005、8009,第二个实例用8081、8015、8019,第三个实例用8082、8025、8029,这样一眼就能看出端口属于哪个实例,后期排查问题也快。切忌随意挑数字,改到一半忘了哪个端口属于哪个实例,出问题时很难定位。
修改多实例端口时,除了server.xml里的三个端口,还要注意几个容易踩的坑。第一,如果你使用了Tomcat的集群session复制功能,server.xml中还有<Receiver>标签的tcpListenPort端口,默认4000到4100之间,多实例必须错开。第二,如果前端有Nginx反向代理,修改后端Tomcat端口后,记得同步更新Nginx配置里的upstream地址,否则请求依然会打到旧端口导致502错误。第三,Linux系统的SELinux和防火墙可能拦截新端口,CentOS下可以用 firewall-cmd --add-port=9090/tcp --permanent 放行,云服务器还要检查安全组规则是否开放了对应端口,这是很多人改完端口访问不通的最大原因。
最后建议在修改任何端口之前先备份server.xml,改动记录最好留档,方便出问题时快速回滚。端口配置看似简单,但它牵扯到服务注册、防火墙、代理转发等多个环节,养成先规划后修改、改完必验证的习惯,能省去大量无谓的排查时间。
Tomcat修改端口号Tomcat配置server.xml修改时间:2026-09-07 12:18:43