首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Tomcat 8080/80 埠被佔用完整排查與解決方案:Windows/Linux 通用

     編輯:Java 程式設計入門

快速診斷:找出佔用進程

Windows 命令列


# 查看所有監聽埠口及 PID
netstat -ano | findstr :8080

# 輸出範例:
# TCP    0.0.0.0:8080    0.0.0.0:0    LISTENING    1234
# 最後一欄 1234 即為 PID

# 根據 PID 查詢進程名稱
tasklist | findstr 1234

# 或使用 PowerShell (更詳細)
Get-Process -Id 1234 | Select-Object Id, ProcessName, Path

Linux/macOS 命令列


# 查看埠口佔用 (需 root 權限看所有進程)
sudo netstat -tlnp | grep :8080
# 或
sudo ss -tlnp | grep :8080
# 或
lsof -i :8080

# 輸出範例:
# java    1234  user  123u  IPv6  12345  0t0  TCP *:8080 (LISTEN)

常見佔用者與解決方案

進程/服務典型埠口識別特徵解決方案
另一個 Tomcat/Java 應用8080, 8005, 8009java.exe / java 進程關閉舊實例、修改 server.xml 埠口、使用不同實例目錄
System (PID 4)80, 443PID 4, 進程名 System停用 "World Wide Web Publishing Service" (W3SVC)
IIS / HTTP.sys80, 443w3wp.exe, System停用 IIS、或配置 HTTP.sys URL ACL 共享埠口
Skype80, 443Skype.exe設定 → 連線 → 取消 "使用埠 80 和 443"
Nginx/Apache80, 443, 8080nginx.exe, httpd.exe停止服務、修改 nginx.conf/httpd.conf 埠口
Oracle DB8080 (XDB HTTP)oracle.exe關閉 XDB HTTP 服務或修改埠口
VMware Workstation80, 443vmware-hostd.exe編輯 → 偏好設定 → 共享 VM → 變更埠口

詳細解決步驟

情況一:修改 Tomcat 埠口 (推薦,避免衝突)


# 修改 $CATALINA_BASE/conf/server.xml
  →  改為 8081, 8082 等

# 同步修改關閉埠口 (避免多實例衝突)
  →  改為 8006, 8007 等

# AJP 埠口 (如不使用可註釋)

情況二:停用 Windows 系統服務 (PID 4 佔用 80 埠)

  1. Win + R → services.msc
  2. 找到 World Wide Web Publishing Service (W3SVC)
  3. 右鍵 → 停止,啟動類型改為 手動 或 禁用
  4. 同理停用 Web Deployment Agent Service (MsDepSvc)

原理:HTTP.sys 核心驅動在 PID 4 (System) 下監聽,IIS/W3SVC 註冊 URL ACL 佔用埠口。

情況三:HTTP.sys URL ACL 共享埠口 (進階,共存)


# 管理員 PowerShell 執行
# 允許特定用戶/群組在特定 URL 前綴監聽
netsh http add urlacl url=https://+:8080/myapp/ user=Everyone

# 查看現有 ACL
netsh http show urlacl

# 刪除 ACL
netsh http delete urlacl url=https://+:8080/myapp/

Tomcat 需配置 server.xml 的 address 和 path 對應。

情況四:Linux 系統服務衝突


# 停用佔用 80 埠的服務
sudo systemctl stop nginx
sudo systemctl disable nginx

# 或修改服務埠口
# /etc/nginx/nginx.conf: listen 8080;
sudo systemctl restart nginx

# 防火牆開放埠口
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload

開發環境最佳實踐

  1. 統一使用非特權埠口:8080, 8081, 9090, 3000 等 (>1024,無需 root/Admin)
  2. 專案獨立配置:每個微服務/專案固定埠口,記錄在文檔/配置中心
  3. Docker 容器化:容器內固定 8080,宿主機映射不同埠口 -p 8081:8080
  4. IDE 運行配置:Eclipse/IntelliJ 設定不同 Server 實例,各自獨立 server.xml
  5. 優雅關閉:實作 ShutdownHook 釋放埠口,避免 TIME_WAIT 積壓

TIME_WAIT 狀態處理


# 大量 TIME_WAIT 導致埠口無法立即重用
netstat -an | findstr TIME_WAIT

# Windows 註冊表調優 (需重啟)
# HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
# TcpTimedWaitDelay = 30 (預設 240 秒,最小 30)
# MaxUserPort = 65534 (擴大可用埠口範圍)

# Linux 內核參數
# /etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0  # NAT 環境慎用
net.ipv4.tcp_fin_timeout = 30
# sysctl -p 生效

一鍵診斷腳本


# Windows: check_port.bat
@echo off
set PORT=%1
if "%PORT%"=="" set PORT=8080
echo 檢查埠口 %PORT% ...
netstat -ano | findstr :%PORT%
echo.
echo 對應進程詳細資訊:
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :%PORT%') do (
    tasklist /fi "PID eq %%a" /fo list /v
)
pause

# Linux: check_port.sh
#!/bin/bash
PORT=${1:-8080}
echo "檢查埠口 $PORT ..."
sudo ss -tlnp | grep ":$PORT"
echo ""
echo "進程詳細資訊:"
sudo ss -tlnp | grep ":$PORT" | awk '{print $NF}' | cut -d= -f2 | xargs -r ps -fp
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved