最近上海电信限制用户海外访问的事件也是在微博上受到了很多人的关注,一众上海电信的用户纷纷表示要出走联通和移动,原因就是因为上海电信访问国外网站的速度变得非常慢,丢包率极高,网络不稳定,无论是正常的国外网站的服务使用、外资企业的正常业务,到*等各个方面都受到了极大的影响,具体的表现可以参考一篇长微博:上海电信海外访问受限
上海电信海外访问丢包率较高的原因应该就是上海电信的出口带宽无法承受大量用户提速的负荷,当然也可能是上海电信为了其旗下的出国加速服务预先埋下的伏笔,之前在Scott的技术分享中提到过一套利用tcp反向代理来绕过上海电信出口的瓶颈点来达到正常*的方案,本文则是基于这套方案,利用Haproxy来实现HTTP和TCP的反向代理,来绕过上海电信海外访问的瓶颈点。
HAProxy简介
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
以上来自度娘百科的简介,而在HAProxy官网1 的描述中则提到了其是一个面向TCP和HTTP应用程序的快速可靠的高可用性、负载均衡和代理解决方案,其支持各种负载均衡调度算法,单位时间可以处理的最大请求数为20000个,可以同时维护40000-50000个并发连接,最大数据处理能力为10Gbps。
事实上在本文的需求仅仅是需要一个四层(TCP)或者七层(HTTP)的反向代理,动用到如此高性能的四层七层兼用的负载均衡器HAProxy其实是有些杀鸡用牛刀的,但是相比其他的解决方案(比如用Nginx的HTTP反向代理和TCP反向代理模块),HAProxy的表现会更为出色一些,所以不妨采用HAProxy来进行一下尝试。
HAProxy的安装
HAProxy是一个软件级负载均衡器,其可以运行在各大Linux和Unix衍生的操作系统上,且支持众多的平台架构,其支持:
- Linux 2.4 on x86, x86_64, Alpha, Sparc, MIPS, PARISC
- Linux 2.6 / 3.x on x86, x86_64, ARM, Sparc, PPC64
- Solaris 8/9 on UltraSPARC 2 and 3
- Solaris 10 on Opteron and UltraSPARC
- FreeBSD 4.10 - 10 on x86
- OpenBSD 3.1 to -current on i386, amd64, macppc, alpha, sparc64 and VAX (check the ports)
- AIX 5.1 - 5.3 on Power™ architecture
其安装的方法也非常简单,在各类支持包管理器的Linux发行版本上都可以直接用包管理器(apt-get,yum等)直接安装haproxy包。
如果不想使用包管理器的话,也可以到官网上直接git clone一份最新的源码,或者下载最新打包好的源码,HAProxy是基于C语言实现的,利用gcc、make配合makefile等就可以进行编译安装,安装方法和安装其他软件没有什么大的区别。
由于最终目的是要绕过上海电信的海外访问的瓶颈,所以需要选择一台位于国内其他地域或者其他网络(联通、移动)机房的VPS或者其他服务器来安装HAProxy,这里选用了一台测试的Ubuntu 14.04.2 LTS的VPS,其IP为54.223.229.220,是位于北京的一台AWS机房内的VPS主机,在其上执行:
sudo apt-get install haproxy
即可完成HAProxy的安装。
配置HTTP反向代理实现绕过瓶颈访问单个网站
这里利用HAProxy的HTTP负载均衡的功能配置单个网站的反向代理,这里选用的是Sony的Playstation日本官网:www.jp.playstation.com
首先可以看一下在上海电信的环境下该域名的丢包率:
丧心病狂的有44%的丢包率,链路状况令人担忧,正常访问非常的慢。
然后看一下在VPS上的丢包率:
几乎不丢包,令人满意。
修改/etc/haproxy/haproxy.cfg文件,在原有内容基础上添加以下内容:
frontend http-in
bind 0.0.0.0:80
mode http
log global
option httplog
option httpclose
option forwardfor
default_backend playstation_jp
backend playstation_jp
balance roundrobin
option httpchk GET /
server web1 203.216.142.171:80 check inter 1500 rise 3 fall 3 maxconn 5000 weight 1
其中frontend段负责配置haproxy监听的端口,反向代理的模式以及应该交给哪个后端进行处理。这里配置为http反向代理模式,并直接默认交给playstation_jp后端处理。
而backend段则负责处理负载均衡的策略等配置,这里设置负载均衡的算法是轮询(roundrobin),判断后端服务器是否在线的方式是利用http请求/地址,同时配置了一台后端的服务器,其IP是203.216.142.171(即www.jp.playstation.com解析出的地址),端口为80端口,转发cookie,同时其每1500ms检查一次后端是否在线,连续3次成功判定为在线,连续3次失败判定为离线,最多连接数为5000,最后给出了该服务器的权重为1。
修改完设置后,执行命令:
sudo haproxy -f /etc/haproxy/haproxy.cfg
即可启动haproxy。
由于索尼PS官网的网站是验证hostname的,所以无法直接通过IP进行访问,最后设置一下hosts,将索尼官网的域名解析到VPS的主机IP 54.223.229.220上,即在C:\Windows\System32\drivers\etc\hosts文件中添加如下一行:
54.223.229.220 www.jp.playstation.com
然后浏览器中访问该页面:
可以加载出首页,并且加载速度也令人满意,绕过了上海电信的坑爹出口。
配置TCP反向代理实现绕过瓶颈连接上*服务
利用HTTP代理的方式可以为单个网站(域名)解决问题,但是我们日常上网肯定不可能把自己常上的国外网站一个个都配置上反向代理,配置繁琐而且不够实用,事实上一般大家现在访问国外网站时都会使用一些实用的*的方式,比如SSH啊VPN啦*等,这些方式由于访问国外网站质量的下降使得可用性大减,而这些方法实质上都是TCP层以上的应用程序,利用HAProxy的tcp反向代理的功能,可以帮助这些*的服务免于被上海电信的瓶颈干扰,从而使得整体的访问体验得到提升。
这里用HAProxy搭建一个*服务器的反向代理,继续修改/etc/haproxy/haproxy.cfg文件,在原有内容基础上添加以下内容:
frontend ss-in
bind 0.0.0.0:50006
mode tcp
log global
option tcplog
default_backend ss_backen
backend ss_backen
mode tcp
option tcplog
balance roundrobin
server ss_server [* 服务端的地址]:[服务端端口] maxconn 5000 weight 1
timeout connect 1s
timeout queue 5s
timeout server 3600s
这里前后端都配置了mode tcp,表示这是tcp层的负载均衡器,HAProxy不需要解包到应用层,同时也失去了一些应用层负载均衡特有的特性,但是这些特性对于现在的需求并不必要。
重启haproxy:
haproxy -f /path/to/haproxy.conf -sf [已经启动的haproxy的pid]
这样就在50006端口开启了tcp层的反向代理,然后设置一下本地的*客户端:
设置浏览器的代理服务器并访问可以查看ip的网站:
反向代理生效了,并成功建立了与原有的*服务器的通讯,尝试进行一些国外网站的访问也比之前流畅的许多,可以有效绕过上海电信的坑爹出口。