端口冲突的两类成因
中间件起不来报端口被占用,通常是两种情况:上一个实例没有正常停止,进程仍在监听;或者同机部署了其他服务,恰好使用了同一个端口。前者的处置是走产品的停止流程清掉残留实例,后者需要重新规划端口分配或迁移其中一方。
改端口要连带改三处
把端口改掉只是第一步:防火墙放行规则、反向代理或负载均衡的转发目标、监控与健康检查的探测地址都要同步更新。只改一处最常见的表现是「本机访问正常、外部访问不通」,排查时容易怀疑到应用本身。
基本信息
| 定位命令 | 查看监听端口与占用进程 |
|---|---|
| 归属确认 | 用进程信息确认归属,避免误杀 |
| 处置原则 | 优先走产品停止流程,避免直接强制结束 |
| 连带修改 | 应用配置、防火墙规则、反向代理与监控探测 |
典型使用场景
- 中间件启动报端口已被占用
- 同一台机器部署多个实例,端口规划冲突
- 旧实例未停干净就启动新实例
- 端口变更后外部访问不通,需要核对放行与转发
- 割接期间新旧实例并存,出现监听冲突
定位占用
定位占用
ss -lntp | grep <端口> # 监听状态与进程
fuser -n tcp <端口> 2>/dev/null
ps -fp <PID> # 确认归属进程与启动时间
ls -l /proc/<PID>/cwd # 从工作目录判断属于哪个实例
grep -r "<端口>" /opt/<产品>/conf 2>/dev/null | head # 找配置文件中的端口定义处理与复测
处理与复测
# 残留实例:按产品正常停止流程处理(避免直接强制结束进程)
# 改端口后三处同步:
firewall-cmd --add-port=8081/tcp --permanent && firewall-cmd --reload
# 反向代理指向与健康检查地址同步更新
curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:8081/health; echo
ss -lntp | grep 8081 # 复核监听状态现象与判断
| 现象 | 可能原因 | 方向 |
|---|---|---|
| 启动即报端口占用 | 残留实例或其他服务占用 | 定位进程确认归属 |
| 本机通外部不通 | 防火墙或转发未同步 | 核对放行规则与代理配置 |
| 重启后时好时坏 | 启动顺序与残留进程相关 | 规范停止流程 |
| 健康检查失败但端口可连 | 探测路径或状态码判断错误 | 核对探测地址与返回码 |
| 多实例互相影响 | 端口与数据目录规划重叠 | 重新规划实例资源 |
端口冲突多见于旧实例未停干净就拉起新实例:在变更脚本里加入端口空闲检查,能在启动前发现冲突,避免把问题带到生产流量上。