Nginx 启动报 bind() failed (98: Address already in use) 怎么办?

80 端口被占用导致 Nginx 起不来:用 ss -tulnp 或 lsof -i :80 找到占用进程(常是 Apache、旧 nginx、其他服务),停掉或改端口;也可能是配置里重复 listen。本文给排查步骤。

最佳实践
Nginx 启动报 bind() failed (98: Address already in use) 怎么办?封面

错误含义:Nginx 要绑定 80 端口(IPv6 的 [::]:80 通常同时覆盖 IPv4),但该端口已被别的进程占用。处理两步:①sudo ss -tulnp | grep :80 找到占用者;②停掉冲突进程或改 Nginx 监听端口。别忘了还有一种情况:配置文件里同一端口被重复 listen 或旧的 Nginx 进程没退干净。

第一步:找出占用者

sudo ss -tulnp | grep :80
# 或
sudo lsof -i :80

输出会告诉你是谁:常见面孔——

占用者 说明 处理
apache2/httpd 装了 Apache 抢端口 systemctl stop apache2 && systemctl disable apache2
nginx(旧进程) 之前的 nginx 没退干净 sudo pkill -f nginx 后再 start
其他应用(node/tomcat…) 应用占了 80 改应用端口,或让 Nginx 换端口
容器 docker 映射了 80 docker ps 找到后停容器或改映射

第二步:对症处理

停掉冲突服务(以 Apache 为例):

sudo systemctl stop apache2
sudo systemctl disable apache2    # 防止开机再抢
sudo systemctl start nginx

Nginx 自己残留:

sudo pkill -9 nginx
sudo systemctl start nginx

换端口:改站点配置 listen 8080;nginx -t && systemctl reload nginx

配置错误的情况

端口没被占也报这个错时,检查配置里重复绑定:

grep -r "listen" /etc/nginx/

同一 server 块重复 listen 80;、或 IPv4/IPv6 写法冲突(listen 80; + listen [::]:80; 在某些系统上重复绑定),删掉重复行。

预防

  • 服务器装 Web 服务前先规划端口归属
  • 用 systemctl 管理服务,避免手动 nginx 与 systemctl 混用导致残留进程

观测云对照

端口冲突事件前置发现。 DataKit 采集主机端口监听与服务状态,Nginx 启动失败这类事件配合日志告警,第一时间知道"服务没起来"而不是等用户发现站点挂了。

常见问题(FAQ)

Q:ss 显示端口被 PID 占用但 ps 查不到进程名?
A:加 sudo;内核线程或已退出但 socket 未释放(TIME_WAIT 大量堆积)的情况少见,可尝试等待或重启网络栈。

Q:改了端口还是不行?
A:确认所有 server 块都改了、配置已 reload(reload 不会释放旧监听,极端时 restart)。

Q:IPv6 禁用环境下怎么写?
A:只留 listen 80; 并删除 listen [::]:80;,或配置 listen [::]:80 ipv6only=on; 避免双栈重复绑定。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台