http代理服务器(二十四)正常处理,后端不关连接怎么办【重点】
commit:5f640cd4f605d5b1b555cb402c4d00ce50c1b8d4
虽然大多数服务器都会有超时阀值来决定是否关闭与客户端的连接(在http代理服务器(二十三)由透明代理的safari引出异常处理【重点】的最后一部分【检验】可以看到证据),然后我们的代理最好不要信任
措施
1 前端(浏览器)关闭连接后,我们应当在前端的inactive中关闭后端连接(如有,!=null)
适用于ProxyHttpDecode,ProxyNoHttpsDecode,MyProxyNoHttpsDecodeInjectTLS
HttpServerJob忽略,因为代码不好写,而且最多等到httpclient read timeout阀值嘛
2 tcp代理加入so timeout,什么是 read timeout【yet,重要】,如果一段时间没有东西过来,关掉后端连接,从而也触发关闭前端连接
适用于两个tcp代理ProxyNoHttpsDecode,MyProxyNoHttpsDecodeInjectTLS
3 对于http服务器(目前有2个HttpServerJob和ProxyHttpDecode
HttpServerJob在后端返回response后会close httpclient,同时也有read timeout,到点后也会close httpclient(到后端的连接)及前端连接(在catch中),无需处理
ProxyHttpDecode没有主动关闭后端连接的设置,一切依赖于后端服务器的行为;如果后端不给response也不给FIN呢?难道一直等?所以
ProxyHttpDecode也执行2,也加入so timeout,到点关掉后端连接,同时也触发后端pipeline inactive里的关闭前端连接代码
改完之后,

原本所有后端与代理的连接,由后端close,改后出现由代理close及两边一起close的,而且还有连接失踪的,估计两边一起RST了

本地有20多条连接,两边timewait加起来只有4个,说明很多rst了,而且数量变现出随机性,下图是另一次截图


就是这个改动,但总体还是应该改的,如果后端和代理有一方要close,更希望在代理这边,因为会产生timewait
浙公网安备 33010602011771号