使用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下载最新版本的安装包。

1
2
wget https://mirrors.ocf.berkeley.edu/apache/trafficserver/trafficserver-8.0.8.tar.bz2
tar xjf trafficserver-8.0.8.tar.bz2

安装必要的依赖环境与编译器:

1
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:

1
2
3
4
cd trafficserver-8.0.8
./configure --enable-experimental-plugins
make
make install

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

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

1
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, 找到下面这行:

1
CONFIG proxy.config.http.server_ports STRING 8080 8080:ipv6

将其修改为:

1
CONFIG proxy.config.http.server_ports STRING 80 443:ssl

如下图所示。

再找到下面这行,将0改为1:

1
CONFIG proxy.config.url_remap.pristine_host_hdr INT 0

如下图所示。

然后编辑文件remap.config.  所有的反代/映射规则都写在这个文件中。在文件末尾添加下面的行:

1
2
3
4
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, 设置下面的行:

1
2
3
4
5
6
7
8
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.

1
var/trafficserver 2048M

 

5, 配置SSL证书

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

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

1
2
3
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证书存放目录。添加下面的行:

1
2
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.  添加下面的行:

1
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启用我们对配置文件做出的修改。

1
traffic_ctl config reload

载入配置文件的过程中您可能遇到下面这样的报错:

1
traffic_ctl: error while loading shared libraries: libtsmgmt.so.8: cannot open shared object file: No such file or directory

执行下面的命令即可:

1
ldconfig

如果载入配置文件的过程中遇到了下面这样的错误:

1
traffic_ctl: server start failed: [5] Error establishing socket connection.

这种情况一般是Traffic Server没有启用。您可以执行traffic_manager运行Traffic Server, 或者使用下面的命令运行:

1
trafficserver start

运行Traffic Server之后,访问我们的反代站网址,应该已经可以正常显示源站内容了。如果是一个动态网站,那么该站点的交互功能,比如表单、用户登录、评论等功能都应该可以正常使用了。比如,我随手用域名yaofan.shop反代了一下全球主机交流论坛的网站hostloc.com,  反代的站点和源站完全一样,可以正常注册,登录和评论。

 

综上,我们使用Apache Traffic Server轻松实现了对源站的反向代理,并配置了缓存系统和SSL证书。下一篇教程,我们将介绍使用Traffic Server实现CDN功能。如果您遇到任何问题,欢迎在这里留言和我讨论。本文作者为香菇肥牛,原文链接为https://qing.su/article/traffic-server-reverse-proxy.html, 转载需注明原文链接。谢谢!

26 thoughts on “使用Traffic Server实现高性能反向代理”

    • Google比较麻烦,需要设置特殊的headers, 建议直接用Nginx现成的谷歌反代一键包来安装

      --add-module=/home/username/nginx/ngx_http_substitutions_filter_module \
      --add-module=/home/username/nginx/ngx_http_google_filter_module
      Reply
  1. Thanks for some other informative web site. Where else may I am getting that kind of information written in such an ideal manner?
    I have a undertaking that I’m just now running on, and I’ve been on the look out for such
    info. asmr 0mniartist

    Reply
  2. Its like you read my mind! You seem to grasp so much approximately this, like
    you wrote the e-book in it or something. I believe that you can do with some percent to power
    the message house a bit, however instead of that, that is wonderful blog.
    A great read. I will definitely be back. 0mniartist asmr

    Reply
  3. I have been browsing on-line more than three hours nowadays,
    yet I never found any attention-grabbing article like yours.
    It’s pretty value enough for me. Personally, if all website owners and bloggers made excellent content as
    you probably did, the net shall be a lot more helpful than ever before.

    Reply
  4. Howdy! This post couldn’t be written any better!
    Looking at this article reminds me of my previous roommate!
    He continually kept talking about this. I will forward this information to him.
    Fairly certain he will have a good read. Many thanks for sharing!

    Reply
  5. When someone writes an article he/she retains the image of a user in his/her brain that how a user can be aware of it.
    Thus that’s why this paragraph is amazing.

    Thanks!

    Reply

Leave a Comment