用 Apache Traffic Server 快速搭建反向代理

2012-03-03 19:35

一、介绍

Apache Traffic Server (ATS) 是 2010 年开源出来的 HTTP 代理和缓存服务器软件。Traffic Server (TS) 最早是 Inktomi 公司商业产品,后来 Inktomi 被 Yahoo 收购,TS  就一直在 Yahoo 内部使用,直到 10 年成为 Apache 基金会的开源项目。ATS 相比其他代理软件,其特点是高性能,能充分利用系统资源,并且有完善的插件开发 SDK,能针对自己的需求开发相应的模块。最近我在研究这个软件,以后再作更多介绍。

这次的主题是快速搭一个反向代理,直接举例来说,比如由于网络原因,我无法直接访问某域名的图片(static.ak.fbcdn.net),但是我有台服务器 (vps) 能访问。这种情况下在 vps 上装一个反向代理软件,就能通过 vps (假设域名为 fb.wkl.me ) ,让它来帮我访问 static.ak.fbcdn.net 了。之所以用 ATS 来搭,是因为我觉得它配置相对简单,也可能是我对其他软件不熟悉的原因,有些选项没找着文档。

二、安装

wget http://www.apache.org/dist//trafficserver/trafficserver-3.0.4.tar.bz2
tar jxvf trafficserver-3.0.4.tar.bz2
cd trafficserver-3.0.4
./configure –prefix=/home/vps/ats/
make
sudo make install

configure 过程中可能会提醒缺少第三方库,装上即可,如 ubuntu 下的 tcl-dev、libexpat-dev

三、配置

基础配置

cd /home/vps/ats
sudo vim etc/trafficserver/records.config # 主配置文件

可能会涉及到的选项:

CONFIG proxy.config.http.server_port INT 8080
# 监听的端口,这里我们用默认的 8080

CONFIG proxy.config.url_remap.remap_required INT 1
# 只允许访问配置的 remap 规则,默认即可,正向代理需要关闭此项

CONFIG proxy.config.url_remap.pristine_host_hdr INT 0
# 代理时保留 host,注意我们关闭了此项,稍后再介绍

映射规则配置

sudo vim etc/trafficserver/remap.config

添加如下两行:

map http://fb.wkl.me:8080/   http://static.ak.fbcdn.net/
reverse_map http://static.ak.fbcdn.net/    http://fb.wkl.me:8080/

#第一行 map 规则定义了一个 channel,以及此 channel 对应的后端源站(Origin Server, OS)。关于 channel 的概念,类似 httpd/nginx 的 “虚拟主机”,即 server name / host,这里是带端口的虚拟主机,若为 80 可省略。刚才提到的 pristine_host_hdr 选项,关闭此项的目的是:让 ATS 回源时用 static.ak.fbcdn.net 作为 Host 头部;若打开此项,Host 将保持 fb.wkl.me:8080,源站往往不会识别这个 server name 的。

#第二行 reverse_map 规则用于源站返回 301/302 重定向响应的情形。没有这条规则时,假如我们访问 http://fb.wkl.me:8080/redirect_to_xxx,源站返回响应 302 FOUND,Location: http://static.ak.fbcdn.net/xxx,这时浏览器会直接去访问后面的地址,而不会经过我们的代理。当添加这条规则时,ATS 会截获 Location 响应头,将其改写为 http://fb.wkl.me:8080/xxx,浏览器将继续访问我们的代理服务器。

四、运行、测试

启动 ATS

sudo bin/trafficserver start

访问

http://fb.wkl.me:8080/rsrc.php/v2/y-/x/42NpRHYIj_U.png

测试正常..  (对应源站地址为 http://static.ak.fbcdn.net/rsrc.php/v2/y-/x/42NpRHYIj_U.png)

修改配置

sudo vim etc/trafficserver/remap.config
[做一些改动,比如注释掉用不上的 reverse_map 规则。 ]
sudo bin/traffic_line -x # 重载配置

查看运行日志

sudo tail -f var/log/trafficserver/traffic.out # 遇到运行的问题首先查看此日志

查看访问日志

sudo vim etc/trafficserver/records.config

CONFIG proxy.config.log.squid_log_is_ascii INT 1 # 打开文本格式日志

sudo bin/traffic_line -x # 重载配置

sudo tail -f var/log/trafficserver/squid.log

关于缓存

多次访问后,查看日志时我们看到请求先是 TCP_MISS,然后是 TCP_HIT,即后面的访问命中了 ATS 的缓存,这样避免了不必要的回源,节省了源站的流量,减轻了源站的压力,分流的同时加速了网站的访问。缓存的策略跟 ATS 和源站的配置相关。配置时要注意 proxy.config.http.cache.required_headers 这个选项。

重启、关闭 ATS

sudo bin/trafficserver restart # 某些特殊配置需要重启才能生效(如变更 cache 大小)

sudo bin/trafficserver stop

五、注意

这里只介绍了访问某个域名下的图片,若是想代理访问其他整个网站,特别是别人的大型网站,往往会有诸多限制。

比如我们想做某个论坛的反向代理,如 bbs.wkl.me 代理 www.discuz.net,会发现该论坛的帖子能正常访问,连接为 bbs.wkl.me/showtopic-xxx.aspx,然而登陆按钮的地址写死了(用的绝对路径)为 www.discuz.net/login.aspx,导致登陆时请求不会穿过我们的代理,代理失效。这类需求通常需要搭建正向/透明代理,这里不再展开。

又比如 discuz 论坛在发帖时会验证请求的 Referer,当发现 Referer 为 bbs.wkl.me 而非 www.discuz.net 时,发帖会失败。这时我们需要修改 http 请求头,将 Referer 替换为合法的串,可以借助官方的 header_filter 插件来修改。觉得配置繁琐的话可以用我写的精简版 add_header 插件(https://github.com/wkl/add_header)。

六、参考

  1. 官方管理员指南  http://trafficserver.apache.org/docs/
  2. header_filter 插件   http://trafficserver.apache.org/docs/trunk/admin/plugins/header_filter/index.en.html

Beginning Blogging

2011-10-25 00:38

着实无聊了,整个博客,小打小闹,略偏技术。

再说点什么好呢。