ntoskrnl.exe 占用 80 端口导致 nginx 启动报错

原创 nginx

最近在学习 Nginx 的使用,昨天启动服务的时候突然发现不能启动了,报 80 端口被占用的错误。

nginx: [emerg] bind() to 0.0.0.0:80 failed 
(10013: An attempt was made to access a socket in a way forbidden by its access permissions)

详情如图所示:

nginx-fail-80.jpg

因为之前一直是可以正常启动的,所以一开始每看启动界面的日志,导致我好几次都不能正常访问请求,纳闷了好一整子。

端口被占用的问题其实很好解决,根据占用端口找到进程 ID,根据进程 ID 找到进程,然后杀掉进程,基本就是这个思路。我是在 windows 上学习的,所以一下操作都是在 windows 上,linux 差不多,命令变化一下而已。

定位 80 端口

在 cmd 中使用 netstat -ano | findstr :80 查找 80 端口占用情况。

find-port-80.jpg

可以看到本地 80 端口的进程 ID 为 4。

定位进程

使用 tasklist | findstr 4 查找进程名称。

find-task-4.jpg

额,这就让人有点头大了,这是个系统服务。在任务管理其中查看具体的可执行文件为 C:\Windows\System32\ntoskrnl.exe,在系统目录。

task-pid-4.jpg

对于这个服务,百科的解释是:

ntoskrnl.exe 是 Windows 操作系统的一个重要内核程序文件,里面存储了大量的二进制内核代码,用于调度系统。在系统经过预启动和启动阶段后进入内核调用阶段时由 Ntldr 调用 ntoskrnl.exe, 在 Windows XP 系统中 ntoskrnl.exe 存储了启动 logo 画面。 调用 ntoskrnl.exe 文件时将由 ntdetect.com 收集的硬件信息传递给它,同时被调用的还有 hal.dll 文件。在正常情况下,在任务管理器是以"System"的名字出现的。

肯定不能直接结束系统进程的。根据经验猜测,占用 80 端口的进程应该和 http web 有关,或者是系统有 IIS 服务,这是 .NET 的服务容器,直接在服务中搜索 iishttpweb 等关键字进行排查。结果发现是一个叫 World Wide Web 发布服务 的服务在占用 80 端口。

world-wide-web-publish-service.jpg

服务描述:

通过 Internet Information Services 管理器提供 Web 连接和管理

查询了一下这个服务,果然是和 iis 有关,win10 真的是越来越坑了,我从来没有安装过这个 iis,估计是前几天系统升级给我整来的。

右键服务,选择属性,把 启动类型 改为手动或这禁用,然后点击按钮停止服务。

world-wide-web-publish-service-prop.jpg

如果你需要 iis 服务,那只能更改端口或者手动启动。

验证

定位到问题并且解决之后,重新启动 nginx 服务,验证是否成功。

nginx-success-cap.jpg

OK,好了。

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论