ATS无法缓存QQ音乐的音频文件问题
昨天運維報告江蘇移動25上的緩存服務器無法緩存帶有防盜鏈的音頻文件,訪問日志access.log中大量報如下錯誤
1430129072.554 677 206 [18:04:32] 100.113.23.233 "GET http://cc.stream.qqmusic.qq.com/463238.m4a?vkey=19FB11C8395A01D9CE783CFCFEDF2140EA9436C20B5BD93227AD1BC51455824F&guid=000000002e4c4b0cffffffffeff7fde3&fromtag=57 HTTP/1.1" 103374 "119.188.138.106" TCP_MISS:DIRECT http://cc.stream.qqmusic.qq.com/463238.m4a?vkey=19FB11C8395A01D9CE783CFCFEDF2140EA9436C20B5BD93227AD1BC51455824F&guid=000000002e4c4b0cffffffffeff7fde3&fromtag=57 "QQMusic 5000025(android 4.4.2)" audio/mp4
1430129072.653 495 206 [18:04:32] 10.32.51.88 "GET http://cc.stream.qqmusic.qq.com/M500004KpNVr0EdY0v.mp3?vkey=F24195287147666C57B468215518D8A79F31C52A85928D0C45C47762FA1FBDB5&guid=CDF0EFB91301874173DACC6DB5DB719F HTTP/1.1" 31417 "119.188.138.106" TCP_MISS:DIRECT cc.stream.qqmusic.qq.com "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.00; MP222)" audio/mpeg
1430129072.721 2237 206 [18:04:32] 112.3.203.4 "GET http://cc.stream.qqmusic.qq.com/463238.m4a?vkey=886E06F11EBF8ECB373A6A46CDEA633E3438368FC792736E3A78C8D9E05B6F0A&guid=0000000002f96916da5843ece9fb27fe&fromtag=57 HTTP/1.1" 103374 "119.188.138.106" TCP_MISS:DIRECT http://cc.stream.qqmusic.qq.com/463238.m4a?vkey=886E06F11EBF8ECB373A6A46CDEA633E3438368FC792736E3A78C8D9E05B6F0A&guid=0000000002f96916da5843ece9fb27fe&fromtag=57 "QQMusic 5010100(android 4.2.2)" audio/mp4
1430129072.964 124 206 [18:04:32] 10.32.51.88 "GET http://cc.stream.qqmusic.qq.com/M500004KpNVr0EdY0v.mp3?vkey=F24195287147666C57B468215518D8A79F31C52A85928D0C45C47762FA1FBDB5&guid=CDF0EFB91301874173DACC6DB5DB719F HTTP/1.1" 2744 "119.188.138.106" TCP_MISS:DIRECT cc.stream.qqmusic.qq.com "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.00; MP222)" audio/mpeg
要求盡快解決之,因為如果解決這個問題會導致緩存效果大幅提高。我確認的問題是,使用上面的動態url(必須完整帶上vkey,guid,fromtag參數)可以下載,但是達不到緩存效果,因為url在動態變化。
二、問題分析
如何盡快解決該問題呢?
下面是我記錄的解決這個問題的思路:
由上分析可見,這是一個防盜鏈url的緩存問題,并且我們當前開發的視頻插件使不上,因為視頻插件是結合前方導流服務器來進行的,所以我打算考慮ATS現有的插件工具,看能否解決該問題
下面假設ATS安裝在/opt/ats目錄下面
嘗試一:使用remap rewrite url方法
如果這個方法能解決問題,將是最簡單有效的方法。下面我們需要緊接著明確不帶參數的url是否可以正常回源?
經過測試,發現對QQ音樂行不通,那么我們只能放棄。
下面我還是記錄一下這個方法的使用過程,它使用的是regex_map方法,在remap.config中添加
map ?http://cc.stream.qqmusic.qq.com/ ?http://cc.stream.qqmusic.qq.com/ @plugin=regex_remap.so @pparam=/opt/ats/etc/trafficserver/maps.reg @pparam=profile @pparam=method
然后在當前目錄下面新建一個maps.reg文件,添加
.* ?http://cc.stream.qqmusic.qq.com/$P
它的意思是,將所有連接中的?及之后的參數都去掉,只保留path部分,$P就是表示path部分。然后熱加載配置文件
traffic_line -x
經過測試可行,參見參考文獻[2]
這個問題我遇到的坑是,重寫后的url無法訪問,返回403 Forbidden錯誤,截圖如下
嘗試二:使用cacheurl模塊方法
這是個不得已而為之的方法,能解決類似情況下的絕大多數問題,但是也有些缺陷(后面有說明)。使用方法如下:
在/opt/ats/libexec/trafficserver/目錄下面添加配置cacheurl.config,在里面添加一條正則匹配規則
#cacheurl.config
http://cc.stream.qqmusic.qq.com/([^\?]+)\?vkey=([^/]+)$ ?http://cc.stream.qqmusic.qq.com.TSINTERNAL/$1
然后在plugin.config中添加動態庫cacheurl.so,它已經默認安裝在/opt/ats/libexec/trafficserver/目錄下面
#plugin.config
cacheurl.so
然后熱加載配置文件
traffic_line -x
我們將會在diags.log中看到配置文件生效,并重新加載動態庫的日志信息。
注意:插件cacheurl.c代碼中默認的配置文件為cacheurl.config,它的路徑是/opt/ats/libexec/trafficserver/目錄下面。
測試效果是可行的,但是遇到如下問題
1430190910.574 289 206 [11:15:10] 183.212.124.138 "GET http://cc.stream.qqmusic.qq.com/M500003QcQR43TAUTh.mp3?vkey=B15A9619000ECAF52964C9A72FDB31092ED446D82EAEBA470FD9BED36AB70583&guid=A33A004B07F6F04A098FC82039BAEE3D HTTP/1.1" 82618 "119.188.138.106" TCP_MISS:DIRECT cc.stream.qqmusic.qq.com "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.00; MP222)" audio/mpeg
1430190910.576 173 206 [11:15:10] 100.92.186.16 "GET http://cc.stream.qqmusic.qq.com/M500000HfRl84VaTDc.mp3?vkey=4D67ACFDCEAAD5A37BA5DC88C7B3555416D36DFE2C729CCF39FFD536BF477223&guid=37FC22405551ED9A5D4B62E09E200B1E HTTP/1.1" 17020 "119.188.138.106" TCP_MISS:DIRECT cc.stream.qqmusic.qq.com "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.00; MP222)" audio/mpeg
1430190910.576 181 206 [11:15:10] 112.21.228.183 "GET http://cc.stream.qqmusic.qq.com/M500004Fo3dp3eyNKs.mp3?vkey=FC4C91B6496669C9D8CFE0CBC56AA17F2A40CEE5AA54242424A88ED3C598238A&guid=033D4FE5F5B7EFB971042859332E1C8E HTTP/1.1" 17079 "119.188.138.106" TCP_MISS:DIRECT cc.stream.qqmusic.qq.com "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.00; MP222)" audio/mpeg
經過分析,發現是用戶訪問的url是錯誤的,上面給出的url中都不含fromtag=57參數,這將會被源站返回403 Forbidden響應,但是它會導致反復回源,如果是完整的url,是可以正常回源的。
解決的方法是,先補全url去獲取資源并緩存,后續正確和不正確的url請求,都將正確命中,另外,如果可能,要先刪除舊的錯誤緩存。下面是我的執行命令
curl -X PURGE -vx "127.0.0.1:8081" "http://cc.stream.qqmusic.qq.com/M500004Fo3dp3eyNKs.mp3?vkey=FC4C91B6496669C9D8CFE0CBC56AA17F2A40CEE5AA54242424A88ED3C598238A&guid=033D4FE5F5B7EFB971042859332E1C8E&fromtag=57"
curl -vx 127.0.0.1:8081 -o /dev/null "http://cc.stream.qqmusic.qq.com/M500004Fo3dp3eyNKs.mp3?vkey=FC4C91B6496669C9D8CFE0CBC56AA17F2A40CEE5AA54242424A88ED3C598238A&guid=033D4FE5F5B7EFB971042859332E1C8E&fromtag=57"
三、測試方法
檢查cacheurl模塊是否加載, 再驗證正則規則是否生效?
curl -vx 127.0.0.1:8081 -o 463238.m4a "http://cc.stream.qqmusic.qq.com/463238.m4a?vkey=EB9DCBE77D88ED0335E7566A9FA8A3681BA1A7AD4DB5545C48CDAD9610601132&guid=ffffffffbb69dc14fffffffffb7c39fa&fromtag=57"
多執行幾次,看緩存狀態碼變化是否符合
http://blog.csdn.net/tao_627/article/details/45334177
中的描述規律?
curl -vx 127.0.0.1:8081 -o 463238.m4a "http://cc.stream.qqmusic.qq.com/463238.m4a?vkey=A3710A40FB1D1DC4A2D4ECB34DFFDFD63DAC8D5FEC53833D651DB9E0F4CBB346&guid=00000000327ec818ffffffffbfdeefc7&fromtag=57"
看是否已經緩存?
如果要清除緩存重來一遍,使用下面的命令清除
curl -X PURGE -vx "127.0.0.1:8081" "http://cc.stream.qqmusic.qq.com/463238.m4a?vkey=EB9DCBE77D88ED0335E7566A9FA8A3681BA1A7AD4DB5545C48CDAD9610601132&guid=ffffffffbb69dc14fffffffffb7c39fa&fromtag=57"
curl -X PURGE -vx "127.0.0.1:8081" "http://cc.stream.qqmusic.qq.com/463238.m4a?vkey=A3710A40FB1D1DC4A2D4ECB34DFFDFD63DAC8D5FEC53833D651DB9E0F4CBB346&guid=00000000327ec818ffffffffbfdeefc7&fromtag=57"
然后重復上面的步驟。
四、需要澄清的幾個問題
1.配置文件的熱加載
經過測試,發現添加插件和配置文件后,不需要重啟,只需要熱加載配置文件就可以。
2.cacheurl模塊會緩存錯誤的響應嗎,比如上面的403響應?
經過閱讀源碼和實際測試,發現不會。
3.緩存內容的正則刷新
在CDN環境下,如果我們緩存的資源有更新怎么辦?數量不大時,可以考慮手動或是腳本匹配更新,更好的方法是使用正則刷新插件,需要后續調研
4.records.config中pristine頭中的0或是1都沒有問題
五、再續一例
線上日志需要緩存如下帶有防盜鏈的url:
1438157082.406 38 200 [16:04:42] 100.90.19.80 "GET http://click.hd.sohu.com.cn/r.gif?url=http%3A//tv.sohu.com/20141222/n407174469.shtml&refer=http%3A//tv.sohu.com/20141222/n407174465.shtml%3Ftxid%3D72b6b32533ae9786a2b937d2736efa18&fuid=13250766992031914142&yyid=B266892CA90AD50719C9BBC792D1E64C&passport=&sid=1112261906365278&pid=434&vid=2156332&cid=2&msg=impression&rec=0_2482560_101200101_2_44_0%2C1_2325944_101200101_2_44_0%2C2_2175399_101200101_2_44_0&ab=0&formwork=30&type=100&v=maybelike_2_v20130829&landing_refer=http%3A%2F%2Fkan.sogou.com%2Fdianshiju%2Flishi--1--%2F&fuuid=59b4b887-dc77-789c-258f-00000000014ed8d7904f139d&uuid=1438157089328 HTTP/1.1" 300 "220.181.90.94" TCP_MISS:DIRECT http://tv.sohu.com/20141222/n407174469.shtml "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)" image/gif
1438157082.388 29 204 [16:04:42] 100.78.21.28 "GET http://click.hd.sohu.com.cn/ifox.gif?type=sc&expand1=4&expand2=6&expand3=78&_=1438157049&uid=11&LocalIp=192.168.1.130&MashCode=d8e84593f4d7a7ea5d0fa9264398a5aa&ChannelID=0&v=5.0.0×tamp=18446744073052556995&ost=4&osv=d8e84593f4d7a7ea5d0fa9264398a5aa&btea=bef6464d423cb12d55f50bf408d82002 HTTP/1.1" 152 "220.181.90.94" TCP_MISS:DIRECT - "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)" -
解決辦法:
在plugin.config中添加一行
cacheurl.so
在/opt/ats/libexec/trafficserver/中添加一個cacheurl.config文件,內容如下
http://click.hd.sohu.com.cn/([^\?]+)\?(.*) ?http://click.hd.sohu.com.cn.TSINTERNAL/$1
在cache.config中添加一行
dest_domain=. suffix=gif ttl-in-cache=10d
(如果在匹配規則合法,ATS沒有報錯的情況,還是無法緩存住,可以試試cache.config中的配置,這是實踐中摸索出的經驗)
六、preload腳本
為了減少回源量,提高緩存命中率,經過研究發現可以對該站點的mp3,m4a等音頻文件做預加載緩存,腳本如下:
cat access.log | grep -v '127.0.0.1' | grep 'TCP_MISS' | awk -F '"' '{print $2}' | awk '{print $2}' | grep -v 'fromtag=' | grep -v '127.0.0.1' > miss_url.log cat miss_url.log | sort | uniq -c | sort -nr | awk '{print $2}' > miss_preload.log sed -i 's/$/\&fromtag=90/g' miss_preload.log wget -SO /dev/null -e 'http_proxy=127.0.0.1:8081' -c --limit-rate=500k -i ./miss_preload.log上述腳本的思想是:
先將access.log中含TCP_MISS和framtag=的那些日志過濾出來,然后去重排序,按照訪問次數來由高到低排序,先處理次數多的url,使用wget限速下載去實現preload功能,以盡量減小對服務器的壓力
[1].http://trafficserver.apache.org/tools/via#cMsSf ? 緩存狀態查詢
[2].http://bbs.chinaunix.net/thread-3768941-1-1.html
[3].http://www.shencan.net/index.php/2013/10/15/ats-cacheurl%E6%8F%92%E4%BB%B6%E5%AE%9E%E6%88%98/ ? ? ?燦哥cacheurl
總結
以上是生活随笔為你收集整理的ATS无法缓存QQ音乐的音频文件问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ubuntu 14.04 64bit上
- 下一篇: Ubuntu 14.04 64bit上编