IIS 7.0 在服务停止时不会释放端口 80。无法在端口 80 上运行 Apache

IIS 7.0 在服务停止时不会释放端口 80。无法在端口 80 上运行 Apache

我有两台开发机器,都运行 Windows 7 Professional。

第一台机器交替用于 IIS 7.0 和 Apache 2.2 Web 服务器(但不会同时使用)。我关闭 IIS,释放端口 80,然后在端口 80 上启动 Apache。(反之亦然)。这很好用。

我有第二台开发机器,需要在其上进行相同的设置。(为不同的客户执行不同的项目)。即使 IIS 停止,端口 80 仍被系统级进程使用。

我无法发现导致一台机器工作而另一台机器失败的差异。有谁知道为什么 IIS 停止后端口 80 不会释放?

答案1

执行以下命令:

netsh http show servicestate

查看如下所示的条目:

Registered URLs:
    HTTP://+:80/<SERVICE_NAME>

它将告诉您端口 80 上正在监听的内容。

也要小心 Skype,它有抢占端口 80 的坏习惯。

从 Windows 2003 开始​​,Microsoft 创建了内核模式 http 驱动程序。此驱动程序的一个功能是内核模式侦听器。内核模式侦听器提供了一项称为端口共享的功能,多个应用程序可以侦听同一端口。希望执行此操作的应用程序为其应用程序注册一个 URI 命名空间。例如,在我的计算机上,我有 MS 部署代理服务侦听此 URL:

http://+:80/MSDEPLOYAGENTSERVICE/

对该特定 URI 的请求将被传递给注册该特定 URI 的应用程序。

IIS 是另一个将向内核模式侦听器服务及其各种绑定注册自身的应用程序。

Windows 上的 Apache 的问题在于它不使用 Windows HTTP 内核模式子系统并自行注册(这不是小题大做,只是现实情况)。它自己的进程会尝试直接绑定到您配置的任何 IP/端口组合。当然,如果 HTTP 侦听器服务正在侦听其他服务在端口 80 上注册的 URI,它将被启动。

因此,基本上,如果您想使用端口 80,我认为您需要找到并终止可能在Listen 80您想要用于 Apache 的 IP 地址上监听的所有内容(如果您这样做的话)。

甚至可能需要删除不再使用的已注册 URI,因为在应用程序自行卸载时这些 URI 可能没有被正确清理。

最简单的解决方法,虽然不是最理想的,而且我相信您已经知道了,可能是将 Apache 配置为 Windows 来监听非 80 端口。

欲进一步了解,请参阅:

关于 HTTP 服务器 API - MSDN

相关内容