先查真实占用者再决策:用sudo lsof -i :80或sudo netstat -tulpn | grep :80定位pid和进程,区分nginx残留、apache、docker、本地服务等,按需停止或调整;同时检查nginx配置中重复listen或ipv4/ipv6冲突。

直接查谁在用那个端口,再决定是停它、杀它,还是让 Nginx 换个端口。关键不在改配置,而在定位真实占用者。
确认冲突端口是谁在监听
先看报错里提示的端口号(比如 80、443、8080),然后运行以下命令之一:
- 推荐用 lsof:sudo lsof -i :80(把 80 换成你实际的端口)
- 兼容性更好:sudo netstat -tulpn | grep :80
如果命令未找到,按系统安装对应工具:
- Ubuntu/Debian:sudo apt install lsof 或 sudo apt install net-tools
- CentOS/RHEL:sudo yum install lsof 或 sudo yum install net-tools
识别并处理常见占用进程
从上一步输出中看 PID 和 COMMAND 列,常见情况有:
- 另一个 Nginx 实例:执行 sudo nginx -s stop 或 sudo systemctl stop nginx;再用 ps aux | grep nginx 确认无残留 worker 进程,有则 sudo kill -9 PID
- Apache:Ubuntu 执行 sudo systemctl stop apache2,CentOS 执行 sudo systemctl stop httpd
- 本地开发服务:如 python3 -m http.server 80 或 node app.js,直接 sudo kill -9 PID
- Docker 容器:运行 docker ps 查看映射了该端口的容器,再用 docker stop 容器ID 停止
检查 Nginx 配置本身是否埋雷
有时冲突不是外部程序导致,而是配置写法问题:
- 多个 server 块都写了 listen 80; —— 检查 /etc/nginx/conf.d/ 和 /etc/nginx/sites-enabled/ 下所有启用的配置文件
- IPv4 和 IPv6 同时监听:listen 80; 和 listen [::]:80; 共存可能引发隐性冲突,可临时注释 IPv6 行测试
- HomeBrew 或源码安装的 Nginx 可能自带全局 listen 8080;,与你的后端端口撞车(如 Spring Boot 默认 8080)
用 nginx -T 输出完整生效配置,快速扫一遍所有 listen 指令位置和值。
临时绕开或长期规避
不想动其他服务?可改 Nginx 监听端口:
- 编辑站点配置(如 /etc/nginx/sites-enabled/default),把 listen 80; 改成 listen 8080;
- 保存后执行 sudo nginx -t 验证语法和端口逻辑,成功再 sudo nginx -s reload
- 开发环境建议用 8000、8080、8888 等非特权端口,避免权限和冲突问题
日常建议统一用 systemctl 管理 Nginx 启停,避免手动启停残留进程;修改配置前先备份,启动前必跑 nginx -t。











