在Ubuntu系统中,Node.js应用程序的网络连接状态可通过应用层日志记录、系统层日志关联及网络工具辅助综合排查。以下是具体步骤:
通过代码主动输出网络连接的关键信息(如请求响应、连接错误、Socket状态),是最直接的排查方式。
console模块:在代码中添加console.log或console.error,记录请求URL、响应状态码、错误消息等。例如:const http = require('http');
const server = http.createServer((req, res) => {
console.log(`[INFO] Request received: ${req.method} ${req.url}`); // 记录请求信息
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
});
server.listen(3000, () => {
console.log('[INFO] Server started on port 3000'); // 记录服务启动状态
});
winston(支持多transport、日志分级)或pino(高性能JSON日志),记录更结构化的网络日志。例如:const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'network.log' }), // 写入文件
new winston.transports.Console() // 输出到控制台
]
});
const http = require('http');
const server = http.createServer((req, res) => {
logger.info({ url: req.url }, 'Request received'); // 结构化日志
res.end('Hello World\n');
});
server.listen(3000, () => {
logger.info('Server started on port 3000');
});
net模块记录客户端连接、断开、错误等事件:const net = require('net');
const logger = require('pino')();
const server = net.createServer((socket) => {
logger.info('Client connected'); // 客户端连接
socket.on('data', (data) => logger.info(`Data received: ${data}`));
socket.on('end', () => logger.info('Client disconnected')); // 客户端断开
socket.on('error', (err) => logger.error(`Socket error: ${err.message}`)); // Socket错误
});
server.listen(3000, () => logger.info('Server listening on port 3000'));
通过以上日志,可快速定位连接失败、超时、端口占用等问题。Ubuntu的系统日志(syslog、kern.log)会记录网络层面的异常(如DNS解析失败、防火墙拦截、路由问题),可与Node.js日志结合分析。
journalctl命令查看与Node.js服务相关的日志(需服务以systemd管理):sudo journalctl -u your-node-service.service -f # 实时跟踪服务日志
sudo tail -f /var/log/syslog | grep -i network # 过滤网络相关日志
sudo tail -f /var/log/kern.log | grep -i error # 查看内核错误日志
常见网络错误包括:ECONNREFUSED(目标端口未开放)、ETIMEDOUT(连接超时)、ENOTFOUND(域名解析失败)。通过命令行工具快速测试网络连接状态,确认问题是否出在系统层面:
ping命令检查目标主机是否可达:ping example.com # 测试域名连通性
ping 8.8.8.8 # 测试IP连通性
traceroute(或tracepath)查看数据包到目标主机的路径:traceroute example.com # 显示路由跳数及延迟
telnet或nc(netcat)测试目标端口是否开放:telnet example.com 80 # 测试HTTP端口
nc -zv example.com 443 # 测试HTTPS端口(-z表示扫描,-v表示详细)
ss(替代netstat)查看当前连接、监听端口:ss -tulnp | grep node # 查看Node.js进程的网络连接
若ss显示大量TIME_WAIT或CLOSE_WAIT状态的连接,可能需调整Node.js的连接池配置。确保Ubuntu防火墙(ufw或iptables)未阻止Node.js应用的网络访问:
sudo ufw status # 查看ufw规则(默认允许SSH、HTTP等)
sudo ufw allow 3000/tcp # 允许TCP端口3000
sudo ufw reload # 重新加载规则
sudo iptables -L -n | grep node # 过滤与Node.js相关的规则
通过以上步骤,可从应用层日志、系统层日志、网络工具验证三个维度全面检查Ubuntu下Node.js应用的网络连接状态,快速定位并解决问题。