使用Traffic Server实现高性能反向代理

使用Traffic Server实现高性能反向代理

Apache Traffic Server (亦称作Traffic Server, ATS, TS) 是一个高性能双向代理, 缓存, CDN服务器。今天,我来介绍如何用Traffic Server简单方便地配置反向代理与缓存服务器,实现对任意网站的反向代理。下一篇文章,我将介绍如何使用Traffic Server搭建一个高效的CDN系统。

本文作者为香菇肥牛,原文链接为https://qing.su/article/traffic-server-reverse-proxy.html

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各自的优缺点可以查看这个讨论:https://www.bizety.com/2016/01/07/nginx-vs-varnish-vs-apache-traffic-server-high-level-comparison/

2, 安装Traffic Server

安装Traffic Server之前,请确保您的VPS/独服上没有安装其他的Web服务器程序,否则会发生冲突。本文的操作环境为Ubuntu 20.04 LTS 64 bit. 其他操作系统的安装与配置方法类似。Traffic Server将使用编译方式安装,当前版本为8.0.8。若您使用系统自带的包管理器安装,则版本可能较老,请注意设置上可能会有所差异。

请前往https://www.apache.org/dyn/closer.cgi/trafficserver下载最新版本的安装包。

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

编译安装Traffic Server:

cd trafficserver-8.0.8
./configure --enable-experimental-plugins
make
make install

其中,–enable-experimental-plugins参数这里可以不加。

安装完毕后,为配置文件创建一个符号链接,便于管理:

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 1
CONFIG proxy.config.http.cache.ignore_client_cc_max_age INT 1
CONFIG proxy.config.http.normalize_ae_gzip INT 1
CONFIG proxy.config.http.cache.cache_responses_to_cookies INT 1
CONFIG proxy.config.http.cache.cache_urls_that_look_dynamic INT 1
CONFIG proxy.config.http.cache.when_to_revalidate INT 0
CONFIG proxy.config.http.cache.required_headers INT 2
CONFIG proxy.config.http.cache.ignore_client_no_cache INT 1

其中的参数设置我将在下一篇搭建CDN的教程中具体介绍。对于一个简单高效的反向代理实例,上面这些设置一般能够满足需求。

再编辑文件storage.config. 在这里我们可以设置分配给服务器用来储存缓存内容的空间。我们这里设置为2 GB.

var/trafficserver 2048M

5, 配置SSL证书

我们可以在Traffic Server中配置SSL证书,实现网站的安全访问。如果您反代的是自己的源站,那么我建议您去掉源站的SSL证书,这样可以减轻源站的负载。源站是否配置SSL对于前端反代站的设置没有任何影响。

首先,我们新建一个目录,用于储存所有的SSL证书。

mkdir /etc/trafficserver/ssl
chown nobody /etc/trafficserver/ssl
chmod 0760 /etc/trafficserver/ssl

然后,将对应域名的私钥和证书放在这个文件夹中。如果您的反代站域名和源站域名一样(比如CDN),您可以直接复制源站的证书。如果不一样,您需要为反代站的域名申请SSL证书。我们假设反代站私钥地址为/etc/trafficserver/ssl/proxy.qing.su.key, 反代站证书地址为/etc/trafficserver/ssl/proxy.qing.su.crt.

编辑文件records.config, 指明SSL证书存放目录。添加下面的行:

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证书。下一篇教程,我们将介绍使用Traffic Server实现CDN功能。如果您遇到任何问题,欢迎在这里留言和我讨论。