很久以前,我创建了一个 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