Nginx 重启失败的核心错误码为 errno 98,对应系统调用 bind() 返回的 eaddrinuse 状态,表明目标端口如 80 或 443 已被某个 socket 绑定且未释放。
原因分析
该错误并非 Nginx 自身报错,而是 Linux 内核在 bind() 系统调用时返回 eaddrinuse (errno 98)。根据 2026 年 4 月 9 日的 CSDN 问答资料,关键在于此端口可能被 Nginx 旧进程、残留 worker,甚至其他服务如 Apache、Node.js 或调试中的 Python HTTP Server 占用。
解决方案
1. 定位占用端口的进程
运行命令 sudo lsof -i :80 或 sudo netstat -tulpn | grep :80,把 80 替换成实际报错的端口号。如果提示命令未找到,Ubuntu/Debian 需执行 sudo apt install lsof 或 sudo apt install net-tools,CentOS/RHEL 需执行 sudo yum install lsof 或 sudo yum install net-tools。
2. 停止冲突服务或杀进程
若是另一个 Nginx 实例正在运行,执行 sudo nginx -s stop 或 sudo systemctl stop nginx。若是 Apache 占用了 80 端口,运行 sudo systemctl stop apache2 (Ubuntu) 或 sudo systemctl stop httpd (CentOS)。对于临时占用的进程,通过 lsof 输出中的 PID 和 COMMAND 列识别,再用 sudo kill -9 PID 结束。
3. 临时绕过:修改监听端口
如果只是测试或开发环境,可编辑站点配置文件如 /etc/nginx/sites-enabled/default,将 listen 80; 改为 listen 8080;,保存后运行 sudo nginx -t && sudo nginx -s reload,之后通过 http://your-server-ip:8080 访问。
注意事项
1. 残留 Worker 进程:停止旧进程后,需用 ps aux | grep nginx 确认无残留 worker 进程,有则强制结束。2. 系统日志验证:根据 2025 年 11 月 15 日的系统日志记录,失败时 systemd 状态显示 Process:10211ExecStart=/usr/sbin/nginx(code=exited,status=1/FAILURE),需结合进程上下文与网络栈状态交叉验证。
参考来源
来源:CSDN 问答 - Linux 下重启 Nginx 失败,提示"address already in use"如何解决?(2026 年 4 月 9 日)
来源:教程 - Nginx 启动报错 Address already in use 解决方法教程 (2026 年 3 月 22 日)
来源:系统日志记录 - 解决 Nginx 启动失败:端口 80 被占用问题详解 (2025 年 11 月 15 日)