Windows — Web 服务器无法绑定到端口 80,但没有已知进程正在使用该端口

Windows — Web 服务器无法绑定到端口 80,但没有已知进程正在使用该端口

很久以前,我创建了一个 Powershell 脚本,用于停止 Apache 服务、删除 Web 服务器日志并重新启动服务。之前一直没有出现任何问题,直到最近停止过程开始超时,出现了众所周知的错误“服务未及时响应...”。

好吧,为了解决这个问题,我更新了脚本。所以现在非常简单地解释一下它的作用:

stop-service webserverservice
# Check if process is stil alive, and if found using the PID
stop-process -id $processPid -force

这样应该就可以解决问题了,如果停止服务超时,那么就直接终止进程吧。实际上,在终止主进程之前,还要进行两次最后的检查,以确保不会产生任何子进程。

但是 - 在某些服务器上,并非所有服务器,也并非总是如此,上述步骤并不可靠。启动服务器时,它会显示

(OS 10048)Only one usage of each socket address (protocol/network 
address/port) is normally permitted.  
: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

这是我无法解释的事情。仍然使用 Powershell 和 netstat 等效项获取 NetTCPConnection

PS C:\temp> Get-NetTCPConnection -LocalPort 80
Get-NetTCPConnection : No MSFT_NetTCPConnection objects found with 
property 'LocalPort' equal to '80'.  
Verify the value of the property and retry.

这让我只剩下一个选择,重新启动服务器,然后一切都恢复正常。

有人看到了我没有看到的东西,可以解释为什么我会遇到这个问题吗?

答案1

看起来 apache 配置为绑定到 0.0.0.0:80

这意味着它绑定到系统上的每个 IP,端口为 80。

因此,如果主机是 192.168.10.55,则 apache 至少会尝试绑定到:

127.0.0.1:80 // localhost 192.168.10.55:80 // IP 可用

如果上述任何一个将某些东西绑定到 80,Apache 将无法启动,并出现你在 OP 上注意到的错误

有几种方法可以解决这个问题。

第一的:修改 apache 配置以仅绑定到实际需要的 IP。避免使用 localhost。避免使用未知或未使用的 IPv6 或管理接口。

第二:使用 netstat 查看端口 80 上的内容。

netstat -a |findstr :80

相关内容