Apache Traffic Server (亦称作Traffic Server, ATS, TS) 是一个高性能双向代理, 缓存, CDN服务器。今天,我来介绍如何用Traffic Server简单方便地配置反向代理与缓存服务器,实现对任意网站的反向代理。
1 Apache Traffic Server简介
Apache Traffic Server由Yahoo于2009年开源,经过现在已经成为了非常成熟的代理/缓存/CDN系统。早在2009年,雅虎使用Traffic Server就可以用150台服务器实现每天400 TB的高速流量分发。经过多年的发展,ATS已经用于非常多的商业CDN分发与大型网络。Traffic Server与Nginx, Varnish三者几乎称霸了世界上所有CDN运营商,而Traffic Server又是这三者之中使用量最大的。与Nginx相比,Traffic Server拥有同样优异的性能显著的更多的功能,更丰富的接口,以及高度自定义的配置。与Varnish相比,Traffic Server对于高并发高负载的处理更为出色。
使用Traffic Server的CDN/大型网络有Apple, Comcast, Yahoo, Akamai, 以及国内的又拍云等。Traffic Server, Nginx, Varnish各自的优缺点可以查看这个讨论:Nginx vs Varnish vs Apache Traffic Server - High Level Comparison - Bizety
2、安装Traffic Server
安装Traffic Server之前,请确保您的VPS/独服上没有安装其他的Web服务器程序,否则会发生冲突。本文的操作环境为Ubuntu 20.04 LTS 64 bit. 其他操作系统的安装与配置方法类似。Traffic Server将使用编译方式安装,当前版本为8.0.8。若您使用系统自带的包管理器安装,则版本可能较老,请注意设置上可能会有所差异。
请前往Apache Downloads下载最新版本的安装包。
wget https://mirrors.ocf.berkeley.edu/apache/trafficserver/trafficserver-8.0.8.tar.bz2
tar xjf trafficserver-8.0.8.tar.bz2
安装必要的依赖环境与编译器:
apt install automake libtool pkg-config libmodule-install-perl gcc g++ libssl-dev tcl-dev libpcre3-dev libcap-dev libhwloc-dev libncurses5-dev libcurl4-openssl-dev flex autotools-dev bison debhelper dh-apparmor gettext intltool-debian libbison-dev libexpat1-dev libfl-dev libsigsegv2 libsqlite3-dev m4 po-debconf tcl8.6-dev zlib1g-dev
cd trafficserver-8.0.8
./configure --enable-experimental-plugins
make
make install
其中,–enable-experimental-plugins参数这里可以不加。编译安装Traffic Server:
安装完毕后,为配置文件创建一个符号链接,便于管理:
ln -s /usr/local/etc/trafficserver /etc/trafficserver
执行完毕后,所有的Traffic Server配置文件都在/etc/trafficserver目录中。我们接下来需要配置这个目录中的多个文件。
3、配置URL映射规则
为了实现反代,我们需要配置URL映射规则,这样Traffic Server就能按照我们的指令来进行替换。
下面我们将用proxy.qing.su和origin.qing.su这两个域名为例。假设源站域名为origin.qing.su, 源站在另一台服务器上。我们想用proxy.qing.su这个域名来反代源站origin.qing.su.
编辑文件 records.config, 找到下面这行
CONFIG proxy.config.http.server_ports STRING 8080 8080:ipv6
将其修改为
CONFIG proxy.config.http.server_ports STRING 80 443:ssl
如下图所示
再找到下面这行,将0改为1:
CONFIG proxy.config.url_remap.pristine_host_hdr INT 0
如下图所示
然后编辑文件remap.config. 所有的反代/映射规则都写在这个文件中。在文件末尾添加下面的行:
redirect http://proxy.qing.su/ https://proxy.qing.su/
map https://proxy.qing.su/ https://origin.qing.su/
reverse_map https://origin.qing.su/ https://proxy.qing.su/
map / https://origin.qing.su/
保存退出即可。
4、配置缓存规则
通过缓存的配置,我们能够节省服务器资源,且使得访问速度得到提升。编辑文件records.config, 设置下面的行:
CONFIG proxy.config.http.cache.http INT 1CONFIG
proxy.config.http.cache.ignore_client_cc_max_age INT 1CONFIG proxy.config.http.normalize_ae_gzip INT 1CONFIG
proxy.config.http.cache.cache_responses_to_cookies INT 1CONFIG
proxy.config.http.cache.cache_urls_that_look_dynamic INT 1CONFIG
proxy.config.http.cache.when_to_revalidate INT 0CONFIG
proxy.config.http.cache.required_headers INT 2CONFIG
proxy.config.http.cache.ignore_client_no_cache INT 1
再编辑文件storage.config. 在这里我们可以设置分配给服务器用来储存缓存内容的空间。我们这里设置为2 GB.其中的参数设置我将在下一篇搭建CDN的教程中具体介绍。对于一个简单高效的反向代理实例,上面这些设置一般能够满足需求。
5、配置SSL证书
我们可以在Traffic Server中配置SSL证书,实现网站的安全访问。如果您反代的是自己的源站,那么我建议您去掉源站的SSL证书,这样可以减轻源站的负载。源站是否配置SSL对于前端反代站的设置没有任何影响。
首先,我们新建一个目录,用于储存所有的SSL证书。
mkdir /etc/trafficserver/ssl
chown nobody /etc/trafficserver/ssl
chmod 0760 /etc/trafficserver/ssl
编辑文件records.config, 指明SSL证书存放目录。添加下面的行:然后,将对应域名的私钥和证书放在这个文件夹中。如果您的反代站域名和源站域名一样(比如CDN),您可以直接复制源站的证书。如果不一样,您需要为反代站的域名申请SSL证书。我们假设反代站私钥地址为/etc/trafficserver/ssl/proxy.qing.su.key, 反代站证书地址为/etc/trafficserver/ssl/proxy.qing.su.crt.
CONFIG proxy.config.ssl.server.cert.path STRING /etc/trafficserver/ssl/
CONFIG proxy.config.ssl.server.private_key.path STRING /etc/trafficserver/ssl/
保存退出。然后编辑文件ssl_multicert.config. 添加下面的行:
dest_ip=88.88.88.88 ssl_cert_name=proxy.qing.su.crt ssl_key_name=proxy.qing.su.key
其中,88.88.88.88为源站IP. 如果您有多个源站IP, 就添加多行。如果想要匹配所有IP, 可以用通配符*来匹配。这样,我们就指明了每个源站对应的SSL证书的文件名。
6、运行Traffic Server
每次修改配置文件后,需要重新载入配置文件,使得Traffic Server启用我们对配置文件做出的修改。
traffic_ctl config reload
载入配置文件的过程中您可能遇到下面这样的报错:
traffic_ctl: error while loading shared libraries: libtsmgmt.so.8: cannot open shared object file: No such file or directory
执行下面的命令即可:
ldconfig
如果载入配置文件的过程中遇到了下面这样的错误:
traffic_ctl: server start failed: [5] Error establishing socket connection.
这种情况一般是Traffic Server没有启用。您可以执行traffic_manager运行Traffic Server, 或者使用下面的命令运行:
trafficserver start
运行Traffic Server之后,访问我们的反代站网址,应该已经可以正常显示源站内容了。如果是一个动态网站,那么该站点的交互功能,比如表单、用户登录、评论等功能都应该可以正常使用了。比如,我随手用域名yaofan.shop反代了一下全球主机交流论坛的网站hostloc.com, 反代的站点和源站完全一样,可以正常注册,登录和评论。
综上,我们使用Apache Traffic Server轻松实现了对源站的反向代理,并配置了缓存系统和SSL证书。