goagent 代理无法close http链接导致网页打开缓慢和无法正常显示

Life is short , play more!
本文来自lihao's Blog,转载请注明。

自动最近换了移动的宽带后, fanqiang 就一点也不顺畅了。  gae虽然不好用了, 但是goagent + php(vps) 还是不错的。  后来goagent总是莫名其妙的挂起,所以后面又转向使用 socks over ssh.   有条件的话,还是建议大家使用socks over ssh。 基于ssh客户端即可,方便使用, 也安全。 

为什么不用 socks over ssh呢。 因为北京移动的防火墙实在是太智能了。 当我ssh 创建socks server后, 从我家里访问服务器立马被墙。 隔一段时间(一般是几分中到10-20分钟)就又恢复正常。 好恐怖好智能的样子。 还是我已经上了黑名单?  宽带中的老大哥,联通你要落后了。  再加上 移动对dns 封锁的厉害,只能用他们家的dns。 所以:-),忍吧。

继续goagent吧。 因为北京移动智能的防火墙,再智能 它应该快不到动态检测到cdn 并进行封锁 。  所以goagent 比较好的是, 通过http进行转发, 所以我们的真正的代理节点,其实是一个remote http 服务器。 所以我们在服务器前端加上cdn, 那么我们就可以通过cdn访问我们的remote代理节点。

说起来容易,加上cloudflare(这个也被北京移动给墙了) , 可以用的。 只是用goagent 访问某些页面 挂起的问题还仍然存在。 仔细debug了一下, 发现内容都已经返回,但是http 链接仍然没有断掉。 很奇怪。 继续深入, 发现 proxy.py 中判断链接是否close的地方,很是不解,为什么判断到response.getheader(‘Transfer-Encoding’) 就认为可以close了呢?

#handler.close_connection = bool(response.getheader(‘Transfer-Encoding’))

这里我先把所有的连接都改为close。 原因, 即使有chunk size的时候, 也是 remote代理服务器(非goagent localserver)等待并获得素有的chunk size后, 然后返回给 goagent local server。 所以从local server 处来看,这时候把返回的response 解密后, 返回给 browser。 这时候给browser都应该是close 链接的。  除非特殊情况, http 长链接推送的情况。  (备注: 笔者认为, 因为下面read data的时候,当null 的时候也是会退出此次http 请求内容获取,所以 将 close_connection=True 并没有什么严重问题, 反而进行判断 header进行close的方式是肯定有问题的,会经常挂起)

619 handler.close_connection = True
620 #print “close connection?”
621 #print handler.close_connection
622 while True:
623 data = response.read(8192)
624 if not data:
625 break
626 handler.wfile.write(data)
627 #print “========response body here =========”
628 #print data
629 del data

修改过后, 重新启动 goagent, :-)。 速度又恢复了到很快的状态。 cdn 和 goagent是个好东西。

 

画个简单的架构图:

cdn –>  remote proxy server (goagent的server部分,理论上一切http server都可以,只要有对应的实现代码)  –> local proxy server ( goagent local 部分)  –> browser

浏览器填入的代理地址当然是 local proxy server .   当然local proxy server也可以不是local的哦。


发表评论

电子邮件地址不会被公开。 必填项已用*标注