整理的一些關於apache traffic server的FAQ條目
第一次用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
- 修改records.config檔案
- 如何搭建TS的正向代理伺服器?
- 預設安裝伺服器後,執行:
- traffic_line -s proxy.config.reverse_proxy.enabled -v 0
- traffic_line -s proxy.config.url_remap.remap_required -v 0
- traffic_line -s proxy.config.reverse_proxy.enabled -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不會成為正向和反向代理伺服器的對外域名)
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方法:
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方法測試:
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.
- 啟用PUSH方法:
-
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中
- 標準的squid日誌可以採用直接修改records.config的方式來啟用和停用,而如果 需要定製日誌格式,則需要啟用custom 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模式用以除錯模組:
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功能,在營運方面並沒有投入太多。
- TS是面向ISP的企業級cache/proxy系統,而squid作為一個全功能的proxy/cache 系統,2者在定位上有不同,因此產生很大的分歧:
-