Node.js调用PHP接口频繁断连的根本原因是中间设备主动回收空闲HTTP连接,需通过http.Agent配置keepAliveTimeout≥后端超时、PHP禁用输出缓冲、Nginx启用HTTP/1.1并清除Connection头来协同解决。
Node.js 调用 PHP 接口频繁断连的根本原因
不是 Node.js 或 PHP 单方面的问题,而是 HTTP 连接在空闲时被中间设备(如 Nginx、负载均衡器、云服务商 SLB、甚至运营商网关)主动回收。默认情况下,keep-alive 连接超时往往只有 60–75 秒,而 Node.js 的 http.Agent 默认 keepAliveTimeout 是 5000ms,远低于后端实际保活窗口,导致复用连接时突然收到 ECONNRESET 或 socket hang up。
用 http.Agent 配置长连接 + 心跳参数
必须显式创建并复用 http.Agent 实例,不能依赖默认 agent;关键参数要对齐后端(尤其是 Nginx 的 keepalive_timeout):
-
keepAlive: true— 启用复用 -
keepAliveMsecs: 30000— 每 30 秒发一次 TCP keepalive probe(OS 层,需系统支持) -
maxSockets: 50— 避免连接数爆炸,按压测结果调整 -
timeout: 10000— 请求级超时,和心跳无关,但影响失败感知速度 -
keepAliveTimeout: 65000— 必须 ≥ 后端 keepalive_timeout(比如 Nginx 设了 65s,这里至少设 65000)
示例:
const http = require('http');
const agent = new http.Agent({
keepAlive: true,
keepAliveMsecs: 30000,
maxSockets: 50,
timeout: 10000,
keepAliveTimeout: 65000
});
// 所有请求必须传入 agent
http.get('http://php-api.example.com/status', { agent }, (res) => {
// ...
});
PHP 端必须关闭输出缓冲 & 显式 flush
Node.js 发起的 keep-alive 请求,如果 PHP 响应未及时写出或被缓冲,连接会卡住,最终被中间层断开。常见陷阱:
立即学习“PHP免费学习笔记(深入)”;