您的位置:首页 > 运维架构 > Apache

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

2012-06-27 13:14 453 查看

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

第一次用TS?

如何单机节点搭建reverse proxy模式的服务?

修改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,这样可以释放对外域名的自由度。--这个修改视个人需要。

修改storage.config文件

ts可以使用文件或者raw disk作为cache storage,具体操作请参见 storage.config文件中的注释

修改remap.config文件

根据需求在remap.config文件中添加rule,具体操作请参见remap.config 文件的注释

通过命令 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集群?

在搭建集群前,首先需要确认每个节点环境相同:

安装的系统是相同的:

发行版本相同,如都是RHEL 5.4
内核版本相同,如都是2.6.18-194.8.1.el5
ARCH相同,如都是x86_64

而且使用的ts版本是相同的,如用同一个rpm包安装

针对每个节点修改配置文件records.config,remap.config,storage.config, 除了将proxy.local.custer.type值取3选择full clustering模式外,其他操作 与"单机节点搭建reverse proxy模式的ts"操作是相同的
通过命令 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:

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

[code]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}


执行如下命令,启用http_ui的选项:

traffic_line -s proxy.config.http_ui_enabled -v 3
traffic_line -s proxy.config.http.enable_http_info -v 1

让配置生效:

traffic_line -x

测试:

echo -e "GET http://localhost/stat/ HTTP/1.0\r\n\r\n" | nc -i 1 localhost 8080

如何启用PUSH方法:

[code]PUSH方法是一种直接往TS中注入内容的方法,其为标准的HTTP协议。TS支持PUSH,
 但是出于安全等的考虑,默认关闭了PUSH方法,下面是如何启用并测试的步骤。请
 注意,如不严格限制对PUSH方法的使用,将会产生严重的安全隐患,请务必在acl
 层面进行对PUSH发起端的控制。


启用PUSH方法:

traffic_line -s proxy.config.http.push_method_enabled -v 1

修改默认的quick_filter,允许PUSH协议。quick_filter作为一个超级ACL,具有 很高的控制级别,所有其他控制都在其之后实施,因此必须放开才能够将放开PUSH方法。 去掉对PUSH的全局限制:

=traffic_line -s proxy.config.http.quick_filter.mask -v 130=

让配置生效:

=traffic_line -x=

测试,测试之前,应该配置好代理的map等其他功能,确保正确的访问没有问题,然后再测 试PUSH功能,以利于分析问题。TS代码中的tools目录下,有个push.pl可以用来 向TS 服务器push文件,也可以使用类似如下telnet方法测试:

[code]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:

[code]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用法

[code]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发起的连接:

[code]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中有详细的说明, 我们以线上需要记录非淘宝的所有请求为例:

[code]<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缓存?

网络分析:

使用两台机子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提供的外部访问的链接)。
配置客户端,编辑hosts文件,添加一条记录使得对ts1的访问转向ts2,并保 证浏览器不使用缓存。
使用客户端浏览器访问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模式用以调试模块:

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

如改为:

[code]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的配置转换文档。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: