整理的一些关于apache traffic server的FAQ条目

孔光赫
2023-12-01

http://people.apache.org/~zym/trafficserver/FAQ.html

第一次用TS?

  • 如何单机节点搭建reverse proxy模式的服务?
    1. 修改records.config文件
      • CONFIG proxy.config.cluster.ethernet_interface STRING eth0, 根据机器的配置将eth0修改为实际的网络接口(后续版本或RPM包中已经改为lo, 如不用到cluster模式,将不再需要单独再改)。
      • CONFIG proxy.config.http.server_port INT 8080,根据自己环境将 8080改为80或3128等端口。
      • CONFIG proxy.config.url_remap.pristine_host_hdr INT 1,值改 为0,这样可以释放对外域名的自由度。--这个修改视个人需要。
    2. 修改storage.config文件
      • ts可以使用文件或者raw disk作为cache storage,具体操作请参见 storage.config文件中的注释
    3. 修改remap.config文件
      • 根据需求在remap.config文件中添加rule,具体操作请参见remap.config 文件的注释
    4. 通过命令 service trafficserver start 或 trafficserver start 启动ts。 ps aux | grep traffic 如果启动成功应该显示三个进程 traffic_cop,traffic_manager和traffic_server
  • 如何搭建TS的正向代理服务器?
    • 默认安装服务器后,执行:
      • traffic_line -s proxy.config.reverse_proxy.enabled -v 0
      • traffic_line -s proxy.config.url_remap.remap_required -v 0
    • 执行配置reload: traffic_line -x 即可将TS从反向代理服务器改为正向代理服务器。
  • 如何搭建full clustering模式的ts集群?
    1. 在搭建集群前,首先需要确认每个节点环境相同:
      1. 安装的系统是相同的:
        • 发行版本相同,如都是RHEL 5.4
        • 内核版本相同,如都是2.6.18-194.8.1.el5
        • ARCH相同,如都是x86_64
      2. 而且使用的ts版本是相同的,如用同一个rpm包安装
    2. 针对每个节点修改配置文件records.config,remap.config,storage.config, 除了将proxy.local.custer.type值取3选择full clustering模式外,其他操作 与"单机节点搭建reverse proxy模式的ts"操作是相同的
    3. 通过命令 trafficserver start 启动每个节点上的ts
  • ts常用操作命令
    • 启动|停止|重启动ts:trafficserver {start|stop|restart}
    • 清空cache: traffic_server -Cclear ( 该命令在ts停止时执行 )
    • 查看cache是否清空: traffic_line -r proxy.process.cache.bytes_used
    • 查看配置的cache大小: traffic_line -r proxy.process.cache.bytes_total
    • 查看集群中的节点数: traffic_line -r proxy.process.cluster.nodes

安全与认证方面

  • 为什么TS不支持用户认证?
    • Apache Traffic Server在雅虎贡献给Apache之前,是商业软件,因此其认证模块 涉及了很多相关的许可与知识产权,这些属于无法在短期内解决的问题,因此其用户认 证模块被完全放弃。
    • 开发团队会在适当的时候重建认证模块

配置与使用

  • 如何防止图片盗链:

    • 图片盗链可以在remap.config中使用map_with_referer的方式来控制,默认的配置 文件中有关于map_with_referer的详细说明,并配有例子。我们常用的正则匹配格式 为:

      http://pics.taobaocdn.com/bao/album/wp/pic_fobbiden.png ~* ^http://[^/]+.(baidu|taobao|alibaba|alipay|google|search.msn).com(.cn|)/

      代表的意义为:如来源请求不是从后面这些网站来的,则给它返回一个禁止使用的图片。

    • 需要全局启用refer检查: traffic_line -s proxy.config.http.referer_filter -v 1

    • 如何在remap中使用基于IP地址的ACL控制?
    • TBD

功能与特性方面

  • Apache Traffic Server支持Socket5代理吗?
    • Apache Traffic Server设计有支持Socket4和Socket5代理的模块,并且能够在 代理中使用本地的http缓存服务。
    • 目前功能并没有得到任何测试,代码没人关心。如需要可需要做点工作才好, Apache Traffic Server是一个极好的Socket代理服务器料。
  • FTP代理能支持吗?
    • Apache Traffic Server目前不支持FTP代理。
    • 老代码中有FTP转为HTTP服务的设计,可以用HTTP协议反向代理FTP内容。
  • Apache Traffic Server能对流媒体作cache吗?
    • 目前不能。
    • Inktomi设计TrafficServer之初,系统是为能够同时支持流媒体和HTTP服务而设计 的,产品也完整的实现了Quicktime、Real、MMS为主的流媒体协议,但是由于这些 协议支持的相关的代码都需要其他公司的商业授权,无法开源,同时也因为代码都是10年 前的,支持的协议版本已经完全赶不上时代了,因此也在开源的时候整个模块砍掉了。
    • 目前核心代码仍然能够支持流媒体协议,即Apache Traffic Server的核心系统层, 具备同时支撑2种主要协议(HTTP协议和MIXT协议,MIXT协议即为流媒体的抽象协议) 的能力。因此重建流媒体也是有可能的,欢迎有志之士参与。
  • 如何启用http_ui:

    1. 修改remap.config,增加如下配置:(使用localhost是因为大多数情况下, localhost不会成为正向和反向代理服务器的对外域名)

      map http://localhost/cache-internal/ http://{cache-internal}
      map http://localhost/cache/ http://{cache}
      map http://localhost/stat/ http://{stat}
      map http://localhost/test/ http://{test}
      map http://localhost/hostdb/ http://{hostdb}
      map http://localhost/net/ http://{net}
      map http://localhost/http/ http://{http}
      
    2. 执行如下命令,启用http_ui的选项:

      • traffic_line -s proxy.config.http_ui_enabled -v 3
      • traffic_line -s proxy.config.http.enable_http_info -v 1
    3. 让配置生效:
      • traffic_line -x
    4. 测试:
      • echo -e "GET http://localhost/stat/ HTTP/1.0\r\n\r\n" | nc -i 1 localhost 8080
  • 如何启用PUSH方法:

    PUSH方法是一种直接往TS中注入内容的方法,其为标准的HTTP协议。TS支持PUSH,
     但是出于安全等的考虑,默认关闭了PUSH方法,下面是如何启用并测试的步骤。请
     注意,如不严格限制对PUSH方法的使用,将会产生严重的安全隐患,请务必在acl
     层面进行对PUSH发起端的控制。
    
    1. 启用PUSH方法:
      • traffic_line -s proxy.config.http.push_method_enabled -v 1
    2. 修改默认的quick_filter,允许PUSH协议。quick_filter作为一个超级ACL,具有 很高的控制级别,所有其他控制都在其之后实施,因此必须放开才能够将放开PUSH方法。 去掉对PUSH的全局限制:
      • =traffic_line -s proxy.config.http.quick_filter.mask -v 130=
    3. 让配置生效:
      • =traffic_line -x=
    4. 测试,测试之前,应该配置好代理的map等其他功能,确保正确的访问没有问题,然后再测 试PUSH功能,以利于分析问题。TS代码中的tools目录下,有个push.pl可以用来 向TS 服务器push文件,也可以使用类似如下telnet方法测试:

      zym6400 trafficserver # telnet localhost 80
      Trying 127.0.0.1...
      Connected to localhost.localdomain.
      Escape character is '^]'.
      PUSH http://cdn.zymlinux.net/trafficserver/2 HTTP/1.0
      Content-length: 217
      
      HTTP/1.0 200 OK
      Content-type: text/plain
      Content-length: 1
      Date: Sun, 13 Mar 2011 02:20:26 GMT
      Last-Modified: Sun, 13 Mar 2011 02:20:26 GMT
      Cache-Control: max-age=3600
      Expires: Sun, 13 Mar 2011 03:20:26 GMT
      
      1
      HTTP/1.0 201 Created
      Date: Sun, 13 Mar 2011 03:10:01 GMT
      Via: http/1.1 zymtest1.corp.aliyk.com (ApacheTrafficServer/2.1.7-unstable [c s f ])
      Server: ATS/2.1.7-unstable
      Content-Length: 0
      
      Connection closed by foreign host.
      zym6400 trafficserver # telnet localhost 80
      Trying 127.0.0.1...
      Connected to localhost.localdomain.
      Escape character is '^]'.
      GET http://cdn.zymlinux.net/trafficserver/2 HTTP/1.0
      
      HTTP/1.0 200 OK
      Content-type: text/plain
      Content-length: 1
      Date: Sun, 13 Mar 2011 02:20:26 GMT
      Last-Modified: Sun, 13 Mar 2011 02:20:26 GMT
      Cache-Control: max-age=3600
      Expires: Sun, 13 Mar 2011 03:20:26 GMT
      Age: 3001
      Via: http/1.0 zymtest1.corp.aliyk.com (ApacheTrafficServer/2.1.7-unstable [cHs f ])
      Server: ATS/2.1.7-unstable
      
      1Connection closed by foreign host.
      
  • SplitDNS:

    SplitDNS 是一个很好的工具,其本意是根据hostname不同,对dns解析服务
    分情况处理。其基本原理是设置个hostname匹配规则,指定相应的dns server。
    使用这个方式,配合dns server的一些设置,将可以实现很多有意思的效果:
    
    • 有些公司有所谓的内外网的网络结构,以对一些关键的服务进行区分。TS可以配合这种模式, 使用SplitDNS完成源服务器的配置,更好的利用这种环境。这样的环境中,服务域名被外网 DNS服务器解析到TS服务器,被内网DNS服务器解析到源服务器,这样外部用户将可以用TS的 高效cache,内部开发维护人员可以屏蔽cache,直接使用源服务器。这样在TS作网站加速时, 设置TS使用内网DNS服务器就可以了:

      • 假设我们有一个域名www.example.com,我们对外解析服务是通过dns服务器1.2.3.1-3 完成的。域名解析为1.2.4.1。1.2.4.1即为我们的TS服务器。
      • 而假设我们源服务器为1.2.5.1,并且也需要用www.example.com来访问,则
      • 我们需要remap: map http://www.example.com/ http://www.example.com
      • 则我们需要在TS上对www.example.com的IP地址进行配置,需要引导TS找到真正的源 服务器。假设我们有2个内部dns服务器,如1.2.3.10-11,作为开发测试等内部服务器的 dns解析服务器,其解析www.example.com到1.2.5.1,www.example.com的源服务器。
      • 则我们可以在TS上启用SplitDNS,让TS使用1.2.3.10-11来解析www.example.com。
      • 配置如下:
        • traffic_line -s proxy.config.dns.splitDNS.enabled -v 1
        • 修改splitdns.config,添加如下内容:

          dest_domain=www.example.com named="1.2.3.10;1.2.3.11"

    • 精确定义相关的dns服务器设置,避免经过本地的dns resolver的cache/过滤。

      dns的cache后,其dns条目的ttl等,都会受到本地cache的影响。而TS的内部有hostdb 用来作为dns缓存,其最佳处理是能够直接接受授权服务器的dns解析,这样能够屏蔽一些 问题,并能够比较好的控制ttl等。使用SplitDNS,可以将example.com的解析服务器 指向到其授权域服务器192.0.34.43与193.0.0.236。这种用法的效果就是把TS自身的普通 dns解析服务变成了快速的递归解析服务器。

      • 配置如下:
        • =traffic_line -s proxy.config.dns.splitDNS.enabled -v 1=
        • 修改splitdns.config,添加如下内容:

          dest_domain=example.com named="192.0.34.43;193.0.0.236"

          dest_domain=google.com named="216.239.32.10;216.239.34.10;216.239.36.10;216.239.38.10"

  • prefetch用法

    PreFetch是思想是,在特定用户访问特定网站的时候,解析其html文档,提取其
    中的image js ccs的资源文件,并立即回源fetch。一般来讲,这个过程应先
    于用户端发起连接,所以定名prefetch。
    
    • 使用场景:
      • 内部访问url后,然TS将网站所有的url进行重新提前发布。
      • 可以编造一个特意的URL,给ts作为prefetch的目标,成为类似cache推送的功能。
    • 使用限制:
      • prefetch只能对发起端ip进行选择,无法同时控制目的网站,因此要控制好你的child ip。
      • 只能对不进行encode的html文件进行解析,因此如压缩的网页就不能解析了。
    • 启用方法:
      • TS目前的发布里,并没有将默认的prefetch.config带上,因此你需要从TS的源码 里找一个这个文件,并放在TS的配置文件目录里。
      • 修改prefetch.config,设定你的prefetch_children,即发起端的ip地址。
      • 设置设置records.config中 proxy.config.prefetch.prefetch_enabled = 1 (这个应该是新建,建议用traffic_line -s操作)
      • 重启服务
    • debug方法:
      • prefetch代码使用的debug regex可以用:Prefetch.*
      • 访问日志中可以看到类似的127.0.0.1发起的连接:

        1307196090.325 516 10.62.241.5 TCP_MISS/200 4851 GET http://zymlinux.net/ - DIRECT/zymlinux.net text/html -
        1307196090.356 24 127.0.0.1 TCP_MISS/200 617 GET http://zymlinux.net/icons/text.gif - DIRECT/zymlinux.net image/gif -
        1307196090.378 26 127.0.0.1 TCP_MISS/200 633 GET http://zymlinux.net/icons/unknown.gif - DIRECT/zymlinux.net image/gif -
        1307196090.382 61 127.0.0.1 TCP_MISS/200 536 GET http://zymlinux.net/icons/blank.gif - DIRECT/zymlinux.net image/gif -
        1307196090.407 66 127.0.0.1 TCP_MISS/200 613 GET http://zymlinux.net/icons/folder.gif - DIRECT/zymlinux.net image/gif -
        
  • 如何使用logs_xml.config来定制日志:

    • 标准的squid日志可以采用直接修改records.config的方式来启用和停用,而如果 需要定制日志格式,则需要启用custom log:
      • traffic_line -s proxy.config.log.custom_logs_enabled -v 1
    • logs_xml.config的格式在文件中有例子,并且在admin guide中有详细的说明, 我们以线上需要记录非淘宝的所有请求为例:

      <LogFormat>
        <Name = "taobao"/>
        <Format = "combined [%<cqtn>] %<chi> %<phi> 81 %<ttms> \"%<{Referer}cqh>\" \"%<cqtx>\" %<pssc> %<cqhl> %<psql> %<psct> %<crc> \"%<{User-Agent}cqh>\"" />
      </LogFormat>
      
      <LogFilter>
          <Name = "not_taobaocdn.com"/>
          <Condition = "shn CASE_INSENSITIVE_CONTAIN taobaocdn.com"/>
          <Action = "REJECT"/>
      </LogFilter>
      
      <LogFilter>
          <Name = "not_taobao.com"/>
          <Condition = "shn CASE_INSENSITIVE_CONTAIN taobao.com"/>
          <Action = "REJECT"/>
      </LogFilter>
      
      <LogObject>
        <Format = "taobao"/>
        <Filename = "tb_squid"/>
        <Filters = "not_taobaocdn.com,not_taobao.com"/>
        <CollationHosts = "console1.cn63:8085"/>
      </LogObject>
      
    • 我们定义了一个自定义的日志格式taobao

    • 我们定义了2个反的过滤条件
    • 定义了一个日志收集方式:将满足非taobao.com非taobaocdn.com的访问日志记录 到远程机器console1.cn63上的tb_squid.log中
  • 小问题

    • 在Red Hat手工配置ts stable 3.0版本时,启动时通过ps aux | grep traf查看, 发现只有traffic_cop进程,其他两个进程没有启动成功?

      • 这个问题因版本而异,对于ts stable 3.0版本,需要在records.config中正确 指定网络接口,即修改proxy.config.cluster.ethernet_interface为自己机 器配置的网络接口。开发版不存在这个问题,配置时不需要正确指定网络接口。
    • redhat 5下,为什么无法直接在storage.config下使用物理设备如/dev/sdb?

      • 使用ls -l /dev/sdb查看相应的权限位,可以看到brw------- root root,而 trafffic_server进程是以nobody的用户执行的,其附加用户组中有root,可见 以trafficserver权限不能够读写/dev/sdb。解决方法可以用 =chmod g+rw /dev/sdb= 赋予root组以读写权限即可。
      • /etc/udev/rules.d下,配置一个文件 99-trafficserver.rules,内容如下:

        KERNEL=="sd[b-z]*", MODE="0660",OWNER="root", GROUP="root"

    • 如何限制某些敏感信息的访问,防止信息泄漏,如http_ui接口只对公司网络开放:

      • 在remap.config中,相应的map规则后面追加类似内容 @action=allow @src_ip=10.13.43.23 @method=PUT @method=GET, 则只有10.13.43.23地址发送过来的PUT/GET类型的http请求,请求这个规则中的内 容,才会允许,其他任何例外请求,都会返回一个类似”You are not allowed to access the document.“内容的403禁止访问错误。
      • 完整例子如:map http://cdn.zymlinux.net/stat/ http://{stat} @action=allow @src_ip=10.13.43.23 @method=PUT @method=GET
      • 详细参考见 remap.config中的注释说明
    • 如何确定文件是被ts缓存?

      • 网络分析:
        1. 使用两台机子ts1和ts2。在ts1上配置apache,并在/var/www.html/上编 辑得到几个文件如b.html,test.jpg等等。之后使用tcpdump监听ts1 80 端口的tcp通讯。在ts2配置ts,清空cache并以反向代理模式启动ts,配置 remap.config文件,添加规则“map ts1_url ts1_url” (ts1_url代表ts1提供的外部访问的链接)。
        2. 配置客户端,编辑hosts文件,添加一条记录使得对ts1的访问转向ts2,并保 证浏览器不使用缓存。
        3. 使用客户端浏览器访问ts1上的文件b.html两次,通过wireshark分析tcpdump 从ts1上抓的包。如果ts2只从ts1上取了一次b.html,则说明文件被ts2缓存。
      • 分析ts的返回密码:
        • 配置TS让返回的头里带via:traffic_line -s proxy.config.http.insert_response_via_str -v 1
        • 解密
        • 返回via密码中含有cH即为缓存命中。
    • 如何删除被ts缓存的特定文件?

      • trafficserver的文档中接受删除指定文档时在其提供的web界面接口中进行的。 当然也可以使用curl工具来发送PURGE请求来进行删除
    • 如何确定Apache Traffic Server正常工作在全HASH的cluster模式下?

      • netstat 看网络连接:netstat -lant | grep 8086,本机应有8086端口处于 监听状态,同时如有其他cluster 成员,会有成员连接到本机的8086或本机连接到 成员8086端口的tcp连接已经建立。
      • 显示成员数量: traffic_line -r proxy.process.cluster.nodes
    • 如何启用debug模式?

      • 修改records.config的如下2行,可以启用ts的debug模式用以调试模块:

        CONFIG proxy.config.diags.debug.enabled INT 0
        CONFIG proxy.config.diags.debug.tags STRING cache.*|cluster.*|chan.*
        

        如改为:

        CONFIG proxy.config.diags.debug.enabled INT 1
        CONFIG proxy.config.diags.debug.tags STRING dns*
        

        即可调试dns相关模块的情况。

      • 有多少模块?很多,在源代码里执行: grep -ioR 'Debug([a-zA-Z-"]*\,' * | awk -F ( '{print $2}' | sed 's/"//g' | sed 's/,//' | sort -u_ 可以看到

    • TS与Squid有什么异同?

      • TS是面向ISP的企业级cache/proxy系统,而squid作为一个全功能的proxy/cache 系统,2者在定位上有不同,因此产生很大的分歧:
        • TS核心功能将趋向于简化,如目前已经砍掉了认证模块。Squid趋向于功能越 来越多、配置越来越复杂。
        • TS的开发开始就为大规模运维考虑,因此有很多高效运维方面的设计,如能够 使用traffic_shell来像管理交换机一样管理ts等。squid趋向于完善自己 的cache功能,在营运方面并没有投入太多。
        • https://cwiki.apache.org/TS/squidconfigtranslation.html 是官方的squid到ts的配置转换文档。
 类似资料: