默认情况下安装了IIS服务器角色的Windows系统,其80端口就被占用了。但是占用80端口的进程却不是WWW Service更不是IIS Admin Sevice,而是处于kernel地位的Http.sys。通过命令netstat -ano可以轻易发现占用80端口的是PID为4的System进程。该进程是Winodws NT系统的内核进程的别名。硬件系统启动并完成引导后载入的Windows系统内核和其他重要的系统文件,其中包含http.sys。http.sys准确来说是实现http协议的组件,不是一个Windows服务,在系统进程中无法找到,在系统的服务中也无法找到,但却是IIS的重要组件WWW Service所依的关键组件。下图展示了IIS的Http的请求架构,更多关于IIS的架构可以查阅这里。
回到主题,http.sys作为kernel地位的组件可不是IIS专属的,许多面向Windows应用和服务都可以调用http.sys的API进行编程,带来了很多方便。但是对于诸如Apache和Nginx这些诞生于Linux的开源软件移植到Windows平台时,就不那么有趣了,他们不使用http.sys的API。那么问题来了,不使用共同的中间件,出现硬件资源冲突在所难免。如果可以确保改系统只用于运行Apache和Nginx这些软件,那可以简单的使用命令net stop http的停掉http.sys。但是依赖http.sys的应用和服务太多了,而且有时我们希望他们能够共存,并解决端口冲突的问题。
那么比较好的解决方案是:限制http.sys监听80端口的ip地址,让http.sys只监听在列表中的IP的80端口,而其他的IP地址的80端口给Apache和Nginx使用。如下:
PS C:\Users\administrator.cloud> netsh netsh>http netsh http>add iplisten 172.16.1.1 IP address successfully added netsh http>show iplisten IP addresses present in the IP listen list: ------------------------------------------- 172.16.1.1 netsh http>delete iplisten 172.16.1.1 IP address successfully deleted netsh http>quit