我有两台运行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