今天在启动项目的时候,发现无法正常访问,经过排查,锁定是nginx的问题,虽然通过cmd使用start nginx
指令不会报错,但是当运行nginx -s stop
指令的时候,发现了error信息:
这个报错信息表示nginx并没有启动,运行
nginx
指令进一步排查这次我们又发现了一个emerg:
nginx: [emerg] bind<> to 0.0.0:80 failed <10013: An attempt was made to access a socket in a way forbidden by its access permissions
根据这个错误信息显示,是本地电脑的80端口被占用了,导致nginx无法正常启动。
问题出现的原因找到了,接下来的思路就很清晰了:
1.找出来究竟是谁占用了80端口
2.干掉它
首先打开cmd,注意:为了防止不必要的错误,这时候请直接用管理员的身份打开。
运行指令
netstat -ano
这个指令会罗列出当前所有端口的占用情况,并显示出每占用端口的进程的PID,
我这台电脑显示,80端口被一个PID为4的进程占用着。
接下来使用指令
taskkill /pid 4
(请根据自己的情况把4替换成自己电脑上显示的进程的PID),结果如下:
好吧,如果没能成功,但这个提示还是非常人性化的,根据提示,使用
taskkill /F /pid 4
再次尝试:强制删除竟然都不行了,进行到这里,貌似已经被这个问题卡住了。
在网络上搜索了很多解决方法,基本都和上面所讲的一样,对我现在的情况来说都已经证明无效了
网上有一种解决办法是改变nginx的运行端口,但是此时我们是要去解决问题,而不是逃避问题,所以此种方案pass掉。
kill进程的方法除了cmd,还可以通过使用任务管理器。
打开任务管理器,选择进程,会有PID一列,如果没有的话,点击工具栏中的“查看”=>“选择列”,然后把PID勾选上就可以了。
此时我们看到PID为4的进程名称为system
我们在这一行右键,点击“结束进程”,发现竟然还是没有效果,这真是我遇到过最坚挺的进程了。
去网上搜索之后,system进程是系统服务进程,系统服务都会由这个进程来启动。了解到是http的系统服务,先尝试在dos中搜索services.msc查看系统服务,没有找到对应的名称,于是再去cmd中尝试关闭一下http看看
net stop http
经过对话和等待,界面显示HTTP服务已成功停止
接下来我们使用指令来单独看看80端口是否还有进程
netstat -ano | findstr 0.0.0.0:80
再通过
netstat -ano
查看一下端口列表,再三确认,都看不到80端口的占用情况,接下来start nginx
,并且使用nginx
查看:这次也没有报错信息了。
再次启动项目,一切正常。