Windows Server 上 80 端口被 PID=4 的 System 进程占用,实为 HTTP.sys 托管的系统服务(如 IIS、WinRM、BranchCache、SQL Server Reporting Services)所致;需通过 netstat 和 tasklist 定位具体服务,再停用或重配;若仍被占,可禁用 HTTP.sys 或改用其他端口部署。
windows server 上部署 web 应用(如 tomcat、apache 或 nginx)时提示 80 端口被占用,通常不是某个普通应用在抢端口,而是系统级服务默认监听了它——最常见的是 pid=4 的 system 进程。这不是用户能直接结束的进程,必须定位背后的实际服务并针对性处理。
确认谁在真正占用 80 端口
以管理员身份运行命令提示符,执行以下两步:
- netstat -ano | findstr :80 —— 查看监听 80 端口的 PID(大概率是 4)
- tasklist /svc /fi "PID eq 4" —— 查看 PID=4 关联的服务名(注意不是“System”本身,而是它托管的 HTTP.sys 驱动所承载的服务)
输出中常出现的服务包括:W3SVC(IIS)、WinRM、BranchCache、SQL Server Reporting Services。这些才是真正的“占用者”。
停用或重配常见系统服务
根据上一步查到的具体服务,选择对应操作:
- IIS(World Wide Web Publishing Service):若不用 IIS,进「服务」管理器(services.msc)停止 World Wide Web Publishing Service,并设为“禁用”;或运行 net stop w3svc
- SQL Server Reporting Services:找到服务名如 SQLServerReportingServices 或 ReportServer,停止并设为“禁用”(该服务常随 SQL Server Express 自启,易反复占 80)
- WinRM(Windows Remote Management):不建议直接禁用(影响远程管理),可改端口:运行 winrm set winrm/config/listener?Address=*+Transport=HTTP @{Port="5985"},再重启 WinRM 服务
- BranchCache:若非企业内网分发场景,直接在服务中禁用即可
关闭 HTTP.sys 驱动(治本但需谨慎)
如果以上服务都已停用,80 端口仍被占,说明底层 HTTP 协议栈(HTTP.sys)仍在监听。这是 System 进程托管的核心机制:
- 运行 net stop http /y 强制卸载 HTTP.sys 驱动(会同时停掉所有依赖它的服务)
- 永久禁用:执行 sc config http start= disabled,然后重启服务器
- ⚠️ 注意:禁用后 IIS、WinRM HTTP 模式、.NET Core Kestrel 的
UseHttpSys()等将不可用,仅推荐纯自托管(如 Nginx 反代、Tomcat 直连)环境使用
临时释放或换端口部署(快速上线首选)
若需立即启动应用且无法停系统服务,两个低风险方案:
-
改用其他端口:Tomcat 改
server.xml中 Connector 的 port="8080";Nginx 改listen 8080;;Apache 改Listen 8080。再配反向代理或防火墙端口转发 - 保留 80 端口但让渡给你的应用:停掉 IIS 后,用 netsh http add urlacl url=http://+:80/ user=Everyone 授予你的应用监听权限(适用于 .NET Core 等基于 HTTP.sys 的程序)


















