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

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

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

我有第二个开发机器,我需要做相同的设置。 (针对不同客户的不同项目)。 即使IIS停止,端口80仍然由系统级进程使用。

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

执行以下命令:

netsh http show servicestate 

看看这样的条目:

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

这会告诉你80端口正在收听什么。

注意Skype也是如此,这个习惯抓住了80端口。

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

 http://+:80/MSDEPLOYAGENTSERVICE/ 

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

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

在Windows上的Apache的问题是,它不使用Windows HTTP内核模式子系统,并注册自己(这不是一个轻微的,只是一个事实)。 它自己的过程试图直接绑定到你configuration的任何IP /端口组合。 当然,如果HTTP侦听器服务正在监听其他服务在端口80上注册的URI,它将被启动。

所以基本上,如果你想使用80端口,我想你需要find并杀死所有可能在那里听的东西(如果你做一个Listen 80 )你想用于Apache的IP地址。

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

最简单的解决办法,不是理想的,我相信你已经知道了,可能是configurationWindows的Apache来监听不是端口80的东西。

进一步阅读请参阅:

关于HTTP Server API – MSDN