wangduanduan / wangduanduan.github.io

Wubba Lubba dub-dub
https://wdd.js.org
27 stars 7 forks source link

哑代理 - TCP链接高Recv-Q,内存泄露的罪魁祸首 #141

Closed wangduanduan closed 5 years ago

wangduanduan commented 5 years ago

1. 问题现象

使用netstat -ntp命令时发现,Recv-Q 1692012 异常偏高(正常情况下,该值应该是0),导致应用占用过多的内存。

tcp 1692012 0 172.17.72.4:48444 10.254.149.149:58080 ESTABLISHED 27/node

问题原因:代理的转发时,没有删除逐跳首部

2. 什么是Hop-by-hop 逐跳首部?

http首部可以分为两种

逐跳首部有以下几个, 这些首部在代理进行转发前必须删除

3. 什么是哑代理?

很多老的或简单的代理都是盲中继(blind relay),它们只是将字节从一个连接转发到另一个连接中去,不对Connection首部进行特殊的处理。

这是HTTP权威指南中,关于HTTP哑代理的描述。这里这里说了哑代理会造成的一个问题。

实际上,我认为哑代理还是造成以下问题的原因

在我们自己的代理的代码中,我有发现,在代理进行转发时,只删除了headers.host, 并没有删除headers.Connection等逐跳首部的字段

delete req.headers.host

var option = {
  url: url,
  headers: req.headers
}

var proxy = request(option)
req.pipe(proxy)
proxy.pipe(res)

4. 解决方案

解决方案有两个, 我推荐使用第二个方案,具体方法参考Express 代理中间件的写法

  1. 更改自己的原有代码
  2. 使用成熟的开源产品

5. 参考文献