解除80端口占用
80端口被占,解除是端口每个Web开发者的老朋友。你刚启动Nginx,占用屏幕上就跳出那句经典的解除报错:bind() to 0.0.0.0:80 failed。血往脑门上涌。端口别急着砸电脑,占用八成是解除某个进程悄悄抢了你的地盘。
先查是端口谁干的。Windows上打开命令提示符,占用输入netstat -ano | findstr :80。解除Linux和Mac用lsof -i :80或netstat -tulpn | grep :80。端口你会看到一个PID,占用那串数字就是解除罪魁祸首的身份证。我见过最离谱的端口一次,是占用某款国产软件的后台服务,连个图标都没有,装了就赖在80端口不走。
拿到PID后,Windows用tasklist | findstr [PID]看它叫什么名字,Linux用ps -p [PID] -o comm=。然后就是杀。Windows下taskkill /F /PID [PID],Linux则是kill -9 [PID]。干脆利落。但这里有个坑——有些进程杀了会自动重启,比如IIS或某些系统服务。你得找到它的服务名,在服务管理器里彻底停掉,再把启动类型改成“手动”。
要是查出来是系统自己占用的呢?Windows上最常见的是http.sys,它负责处理HTTP请求。微软的IIS、SQL Server Reporting Services、甚至Skype都可能挂靠在这上面。你明明没开IIS,它却默默监听着80端口。这时候用net stop http停掉HTTP服务,再sc config http start= disabled禁用。但小心,这会连带影响一些依赖HTTP服务的功能。我吃过亏,停完以后Windows更新报错,折腾半天才恢复。
Linux上80端口被系统占用的概率低些,但Apache和Nginx自己会抢。你装了两个Web服务器,一个没停干净就启动另一个,端口冲突是必然的。有个技巧:用fuser -k 80/tcp直接强杀占用80端口的进程。这命令暴力但有效,适合开发环境。生产环境就别这么玩了,先看配置再说。
有时候查出来是Docker容器占用的。你跑了个映射80端口的容器,忘了停,新容器自然起不来。docker ps看哪些容器在跑,docker stop停掉无关的。要是容器太多懒得找,直接docker ps -q | xargs docker stop全停,再重新启动需要的。粗暴,但省事。
还有个容易忽略的:代理软件。Shadowsocks、V2Ray这类工具如果开了全局模式,可能监听80端口做透明代理。你查半天发现是个Python进程,名字叫ss-local,一脸懵。这种情况直接改代理软件的监听端口,或者关掉全局模式,让出80端口给Web服务。
最后说个土办法。如果你只是本地调试,根本不需要非用80端口不可。改Nginx配置里的listen 8080;,访问时带个端口号,照样跑得欢。我有时候故意用8080或3000端口开发,就是为了避开这些破事。80端口留给正式服务器,各干各的,互不干扰。
解除80端口占用,说难不难,说简单也不简单。核心就是三步:查PID、认进程、杀进程。但系统环境千差万别,总有些妖魔鬼怪藏在暗处。多试几次,记下常用的命令,下次再遇到,三十秒内解决战斗。
