Ubuntu JS日志中识别并解决网络问题的实用流程
一 定位入口与日志来源
- 应用日志:优先查看 Node.js 应用自身的输出与文件日志。使用 console.log 或更完善的日志库(如 Winston、Morgan、Pino)输出请求与错误;若使用 PM2,用 pm2 logs 实时查看;若经由 Nginx,同时检查 /var/log/nginx/access.log 与 error.log;前端问题打开浏览器 开发者工具 → 控制台/网络 观察请求与响应状态。
- 系统日志:用 journalctl -u your-service-name 查看服务日志;实时跟踪系统层面网络事件用 sudo tail -f /var/log/syslog,必要时查看 /var/log/kern.log、/var/log/dmesg。
- 网络工具:先做连通性与解析验证(如 ping、nslookup/dig、traceroute/mtr),再检查路由与端口可达(ip route、telnet/nc),必要时抓包分析(tcpdump、Wireshark)。
二 从日志识别常见网络错误
- 连接被拒绝(ECONNREFUSED):目标主机端口未监听或被防火墙拒绝,常见于服务未启动、端口不对或安全组/本机防火墙拦截。
- 超时(ETIMEDOUT):链路不通或远端无响应,可能是网络中断、NAT/防火墙丢包、目标过载。
- 地址不可用(EADDRNOTAVAIL):应用绑定了本机不存在或未启用的 IP。
- 地址已被占用(EADDRINUSE):端口被其他进程占用,需释放或更换端口。
- 权限被拒绝(EACCES):绑定 1024 以下端口 无 root 权限,或日志/目录无写权限。
- DNS 解析失败:日志出现无法解析域名,伴随 ENOTFOUND 或请求 URL 为 IP 时正常而域名失败。
- 结合日志结构解读:关注 时间戳、日志级别、源文件:行号、错误消息、堆栈,快速定位到出错模块与调用链。
三 从系统层面快速验证
- 接口与地址:用 ip a 确认网卡 UP 且有 IPv4/IPv6;查看默认路由 ip route 是否正确。
- 连通与解析:对目标域名执行 ping -c 4 ;用 nslookup/dig 验证 DNS;用 traceroute/mtr 定位延迟/丢包节点。
- 端口与服务:用 telnet 或 nc -vz 验证端口可达;若服务在本地,确认进程监听 0.0.0.0(而非仅 127.0.0.1)。
- 防火墙与安全组:检查 sudo ufw status 或 iptables -S;云上实例同时核对 安全组 入站/出站规则。
- 抓包取证:在问题复现时执行 sudo tcpdump -i -n port 或写入文件 -w capture.pcap,用 Wireshark 分析 TCP 三次握手、重传、RST 等。
四 针对性修复与加固
- ECONNREFUSED:确认目标服务已启动并监听正确端口;检查本机/对端 防火墙 与 云安全组;必要时更换端口或修复服务配置。
- ETIMEDOUT:复核网络路径(mtr 长时采样)、联系对端确认负载/限流;在客户端适当 增加超时 并实现 重试与退避。
- EADDRINUSE:查找占用进程 lsof -i : 并释放,或改用未占用端口;PM2 可用 –name 管理实例避免冲突。
- EADDRNOTAVAIL:绑定 0.0.0.0 或本机有效 IP;云主机确认网卡与 VPC 子网配置正确。
- EACCES(端口/文件):绑定 1024 以下端口 使用 sudo 或 setcap 授权;确保日志目录可写(如 chown/chmod)。
- DNS 异常:编辑 /etc/resolv.conf 或 nmcli 设置可用 DNS(如 8.8.8.8、1.1.1.1);验证 /etc/nsswitch.conf hosts 顺序。
- 前端 JS 网络错误:在浏览器 Network 面板查看 status、response、CORS 与 mixed-content;服务端补充 CORS 头或改用 HTTPS。
- 日志与可观测性:在 Node.js 中结构化记录 请求ID、URL、method、status、耗时、错误堆栈;使用 Winston/Morgan/Pino 输出到文件并结合 ELK/Graylog/Splunk 或 Prometheus/Grafana 做监控告警。
五 一键排查清单与最小示例
- 排查清单
- 应用日志:是否有 ECONNREFUSED/ETIMEDOUT/ENOTFOUND 等关键词与堆栈。
- 服务状态:确认进程存活、监听端口与地址正确(如 0.0.0.0:3000)。
- 系统日志:journalctl -u -f、tail -f /var/log/syslog 观察网络相关报错。
- 连通解析:ping、nslookup/dig、traceroute/mtr 逐跳定位。
- 端口可达:telnet/nc 验证远端端口;必要时 tcpdump 抓包。
- 防火墙/安全组:ufw/iptables 与云上 安全组 规则放行。
- DNS:/etc/resolv.conf 或 nmcli 更换可用 DNS。
- 前端:浏览器 开发者工具 → 网络 检查 CORS/HTTPS/mixed-content。
- 可观测性:补充 结构化日志 与 监控告警,便于复发时快速定位。
- 最小可复现实例(用于验证网络与日志)
- 服务端(Node.js,端口 3000)
- 代码:
- const http = require(‘http’);
- const server = http.createServer((_, res) => res.end(‘OK’));
- server.listen(3000, ‘0.0.0.0’, () => console.log(‘Listening on 0.0.0.0:3000’));
- 运行与日志:node app.js > app.log 2>&1
- 客户端验证:curl -v http://localhost:3000 或在另一台机器 curl http://<服务器IP>:3000
- 观察要点:服务端日志是否打印监听;客户端是否返回 200;若失败,按清单逐项验证连通、端口与防火墙。