Express.js(Node.js)服务器闲置后无法发起外部API请求
可能的问题及解决方案
1. TCP长连接复用失效
外部API服务器通常会主动关闭闲置超过特定时长(比如45-60分钟)的TCP连接,但Node.js的HTTP客户端(包括axios、http模块)默认会复用长连接。如果客户端尝试复用已被服务器关闭的连接,就会出现请求挂起超时的情况。
解决方法:
- 禁用HTTP长连接,强制每次请求创建新连接;
- 配置客户端连接池的闲置超时时间,自动销毁过期连接。
示例(Axios配置):
const axios = require('axios'); const http = require('http'); const https = require('https'); // 禁用长连接,设置闲置socket30秒后销毁 const httpAgent = new http.Agent({ keepAlive: false, freeSocketTimeout: 30000 }); const httpsAgent = new https.Agent({ keepAlive: false, freeSocketTimeout: 30000 }); const apiClient = axios.create({ httpAgent, httpsAgent, timeout: 10000 // 请求超时时间 });
2. DNS缓存过期或失效
Node.js默认会缓存DNS查询结果,若外部API的域名解析地址在闲置期间发生变更,客户端可能仍在使用旧的IP地址发起请求,导致超时。
解决方法:
- 手动控制DNS解析,每次请求前重新获取目标域名的IP;
- 缩短DNS缓存的TTL时间。
示例(手动解析DNS后发起请求):
const dns = require('dns').promises; const http = require('http'); async function sendExternalRequest() { // 实时解析域名IP const [ip] = await dns.resolve4('your-external-api-domain.com'); const options = { hostname: ip, port: 443, // 或80 path: '/api/your-endpoint', method: 'POST', headers: { 'Host': 'your-external-api-domain.com', // 必须指定Host头匹配域名 'Content-Type': 'application/json' }, timeout: 10000 }; return new Promise((resolve, reject) => { const req = http.request(options, (res) => { // 处理响应逻辑 let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => resolve(JSON.parse(data))); }); req.on('timeout', () => { req.destroy(); reject(new Error('Request timed out')); }); req.on('error', reject); req.write(JSON.stringify(yourRequestBody)); req.end(); }); }
3. PM2进程资源泄漏或状态异常
长时间闲置后,Node.js进程可能积累未释放的资源(如socket句柄、内存),或PM2的进程管理策略导致进程状态异常,进而影响请求处理。
解决方法:
- 监控进程内存和连接数,排查资源泄漏:用
process.memoryUsage()定期输出内存数据,用netstat -an | grep ESTABLISHED查看连接状态; - 配置PM2定期重启进程作为临时修复:在PM2配置文件中添加
cron_restart: '0 */1 * * *'(每小时重启一次); - 检查PM2的
cluster模式配置,确保进程负载均衡正常。
4. 事件循环阻塞
闲置期间若存在未清理的定时器、异步任务积累,可能导致Node.js事件循环阻塞,无法及时处理新的外部API请求。
解决方法:
- 用
node --inspect调试事件循环,查看闲置后的事件循环延迟; - 检查代码中是否有未清除的
setInterval、未移除的事件监听器,及时清理无用的异步资源。
内容的提问来源于stack exchange,提问作者Carlos Gonzalez
相关产品推荐
相关产品推荐

