1. 程式人生 > >整理的一些關於apache traffic server的FAQ條目

整理的一些關於apache traffic server的FAQ條目

第一次用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功能,在營運方面並沒有投入太多。