Node 8.0引入了一个breaking change——server.keepAliveTimeout按照文档的说法

A value of 0 makes the http server behave similarly to Node.js versions prior to 8.0.0, which did not have a keep-alive timeout.

这一版本之前是没有keep-alive超时的8.0之后有了默认5秒的超时

举个例子如果你用Node.js实现了个HTTP服务器没有手动设置server.keepAliveTimeout那么它运行在Node 8.0和之前的版本会有差异Node 8.0之前的版本运行的时候如果客户端的请求是keep-alive服务器会一直等待客户端的下一个请求直到天荒地老或者客户端主动关闭连接而在Node 8.0及之后的版本运行的时候只要客户端没有在5秒之内发起下一个请求服务端就会主动关闭连接

如果你的网站是用Node.js写的并且前面没有类似Nginx之类的反向代理的话那么这个默认的keep-alive timeout显然太短了你的访客很难在5秒之内发起下一个连接连接也就很难被复用了

更糟糕的是当前面有反向代理而且反向代理支持keep-alive反向代理服务器往往会维护一个连接池保持keep-alive的连接可能被设置成最多64个或者128QPS比较低的时候很难在5秒内使用同一个连接两次这种情况下很有可能反向代理刚拿出某个连接尝试写数据发起请求的时候连接恰好被服务器断开了从而写失败

示例图
示例图

因此在用Node.jsHTTP服务器的时候不论是直接暴露到公网还是经过反向代理都需要注意不要被server.keepAliveTimeout的默认值坑了