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

Mik*_*ike 6 iis apache-2.2

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

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

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

我一直无法发现使一台机器工作而另一台机器失败的区别。有没有人知道为什么当 IIS 停止时端口 80 不会释放?

Kev*_*Kev 11

执行以下命令:

netsh http show servicestate
Run Code Online (Sandbox Code Playgroud)

看看看起来像的条目:

Registered URLs:
    HTTP://+:80/<SERVICE_NAME>
Run Code Online (Sandbox Code Playgroud)

这会告诉您在端口 80 上侦听的内容。

也要注意 Skype,它有一个坏习惯,会占用 80 端口。

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

http://+:80/MSDEPLOYAGENTSERVICE/
Run Code Online (Sandbox Code Playgroud)

对该特定 URI 的请求被移交给注册该特定 URI 的应用程序。

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

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

因此,基本上,如果您想使用端口 80,我认为您需要在Listen 80要用于 Apache 的 IP 地址上找到并杀死可能在那里侦听的所有内容(如果您执行 a )。

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

最简单的解决方法(并不理想,我相信您已经知道了)可能是为 Windows 配置 Apache 以侦听不是端口 80 的内容。

如需进一步阅读,请参见:

关于 HTTP 服务器 API - MSDN