假如想要檢查某個特定的cache文件,你可稍費工夫?qū)⑽募栟D(zhuǎn)換到路徑名。另外目錄號和L1和L2值
也是必需的。在squid的源代碼里,storeUfsDirFullPath( )函數(shù)做這個事情。可在
src/fs/ufs/store_dir_ufs.c文件里找到它。如下短小的perl腳本模擬了當(dāng)前算法:
useragent_log /usr/local/squid/var/logs/useragent.log7
這樣使用它:
% echo 000DCD06 | ./fileno-to-pathname.pl 0D/CD/000DCD06
要在第N個cache_dir里找到該文件,簡單的進入到相應(yīng)的目錄,并列出或查看該文件:
% cd /cache2 % ls -l 0D/CD/000DCD06 -rw------- 1 squid squid 391 Jun 3 12:40 0D/CD/000DCD06 % less 0D/CD/000DCD06
13.4 referer.log
可選的referer.log包含了來自客戶端請求的Referer頭部。為了使用該功能,必須在./configure時打
開--enable-referer-log選項。還必須用referer_log指令來指定一個路徑。例如:
referer_log /usr/local/squid/var/logs/referer.log
假如想禁止referer.log,則可設(shè)置文件名為none。
Referer頭部正常情況下包含一個URI,從這個URI獲取到了請求(見RFC2616的14.36節(jié))。例如,
當(dāng)web瀏覽器發(fā)布請求到某個內(nèi)嵌圖片時,Referer頭部被設(shè)置成包含該圖片的HTML網(wǎng)頁的URI。當(dāng)
你點擊HTML超鏈接時,它也被設(shè)置。某些web站點管理員使用Referer值來查找死鏈接。在使用
Squid作為代理人模式時,你也許發(fā)現(xiàn)referer.log特別有用。
referer.log格式簡單,僅有4個域。如下是一些示例:
1068047502.377 3.0.168.206 http://www.amazon.com/exec/obidos/search-handle-form/002-7230223-8205634 http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/... 1068047503.109 3.0.168.206 http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/... http://g-images.amazon.com/./images/G/01/gourmet/gourmet-segway.gif 1068047503.196 3.0.168.206 http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/... http://g-images.amazon.com/./images/G/01/marketing/cross-shop/arnold/appar... 1068047503.198 3.0.168.206 http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/... http://g-images.amazon.com/./images/G/01/marketing/cross-shop/arnold/appar... 1068047503.825 3.0.168.206 http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/... http://images.amazon.com/./images/P/B00005R8BC.01.TZZZZZZZ.jpg 1068047503.842 3.0.168.206 http://www.amazon.com/exec/obidos/ASIN/0596001622/qid=1068047396/sr=2-1/... http://images.amazon.com/./images/P/0596001622.01._PE_PI_SCMZZZZZZZ_.jpg
注意缺少Referer頭部的請求不會被記錄。這4個域描述如下:
注意的是,不像access.log,referer.log在Squid接受到完整請求時,會立刻記錄。這樣,
referer.log條目在access.log之前發(fā)生,后者等待響應(yīng)完成才記錄。
13.5 useragent.log
可選的useragent.log包含來自客戶端請求的User-Agent頭部值。為了使用該功能,必須在運行
./configure時打開--enable-useragent-log選項。還必須使用useragent_log指令來提供一個路徑
名。例如:
___FCKpd___5
User-Agent頭部正常情況下包含了發(fā)起請求的user-agent的描述。大多數(shù)情形下,該描述只是簡單
的產(chǎn)品名列表和版本信息。你應(yīng)該清楚應(yīng)用程序可以輕易的提供偽造的user-agent信息?,F(xiàn)代
user-agent提供途徑可定制該描述。甚至Squid在轉(zhuǎn)發(fā)請求里能改變這個User-Agent頭部。
useragent.log格式相對簡單,看起來如下:
3.0.168.206 [05/Nov/2003:08:51:43 -0700] "Mozilla/5.0 (compatible; Konqueror/3; FreeBSD)" 3.0.168.207 [05/Nov/2003:08:52:18 -0700] "Opera/7.21 (X11; FreeBSD i386; U) [en]" 4.241.144.204 [05/Nov/2003:08:55:11 -0700] "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/103u (KHTM..." 3.0.168.206 [05/Nov/2003:08:51:43 -0700] "Java1.3.1_01" 64.68.82.28 [05/Nov/2003:08:52:50 -0700] "Googlebot/2.1 (http://www.googlebot.com/bot.html)" 3.0.168.205 [05/Nov/2003:08:52:50 -0700] "WebZIP/4.1 (http://www.spidersoft.com)" 4.241.144.201 [05/Nov/2003:08:52:50 -0700] "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt; Hotbar 3.0)" 3.0.168.206 [05/Nov/2003:08:54:40 -0700] "Bookmark Renewal Check Agent [http://www.bookmark.ne.jp/] (Version 2.0..."
不像其他日志文件,它僅有3個域:
[10/Jun/2003:22:38:36 -0600]
13.6 swap.state
swap.state文件是目標(biāo)寫入cache目錄、或從cache目錄刪除的日志寫照。每個cache_dir有它自己
的swap.state文件。當(dāng)Squid啟動時,它讀取swap.state文件來重建cache目標(biāo)的內(nèi)存索引。這些
文件對Squid管理來說,至關(guān)重要。
默認情況下,每個cache.state文件位于它相應(yīng)的cache目錄。這樣,每個state文件自動駐留在每個
cache_dir下。這點很有用--假如你想重新排序cache_dir行,或想從cache_dir列表里刪除條目的
話。
如果想將它們放在其他位置,可使用cache_swap_log指令來做:
cache_swap_log /usr/local/squid/var/logs/swap.state
在此情況下,Squid對每個cache目錄創(chuàng)建一個swap.state文件,并增加數(shù)字后綴。例如,假如有4個
cache目錄,Squid創(chuàng)建如下日志:
/usr/local/squid/var/logs/swap.state.00 /usr/local/squid/var/logs/swap.state.01 /usr/local/squid/var/logs/swap.state.02 /usr/local/squid/var/logs/swap.state.03
在這個情形下,如果你要增加、刪除、或重排序cache_dir行,就必須手工重命名swap.state文件,
以保持事情一致。
技術(shù)上,swap.state格式是獨立于存儲機制的。然而,在當(dāng)前版本的Squid里,所有的存儲機制使用
同一種格式。swap.state文件使用修正大?。?8位)的二進制格式。各個域值以主機字節(jié)順序記錄,
這樣在不同的操作系統(tǒng)之間不便遷移。表13-3描述了swap.state日志條目的各個域的說明。
Table 13-3. swap.state entry fields
Name | Size, in bytes | Description |
op | 1 | Operation on the entry: added (1) or deleted (2). |
file number | 4 | Same as the fourth field of store.log, except it is stored in binary. |
timestamp | 4 | A timestamp corresponding to the time when the response was generated or last validated. Taken from the Date header for responses that have one. Stored as the number of seconds since the Unix epoch. |
lastref | 4 | A timestamp corresponding to the most recent access to the object. |
expires | 4 | The object's expiration time, taken from an Expires header or Cache-Control max-age directive. |
last-modified | 4 | The object's Last-Modified value. |
swap file size | 4 | The amount of space the object occupies on disk. This includes HTTP headers and other Squid-specific meta-information. |
refcount | 2 | The number of times this object has been requested. |
flags | 2 | Various internal flags used by Squid. |
key | 16 | The MD5 hash of the corresponding URI. Same as the key in store.log, except this one is stored in binary. |
Squid不斷的寫日志,假如cache非常忙,那么在一段時間后,這些日志文件可能變得很大。某些操作
系統(tǒng)甚至限制了文件的最大size(例如2G),假如寫文件超過了這個size就會報錯。為了保持日志文件
容易管理,以及讓Squid正常工作,必須定期輪轉(zhuǎn)日志。
Squid有內(nèi)建的功能用于輪轉(zhuǎn)日志??赏ㄟ^squid -k rotate命令來調(diào)用它,然后告訴Squid對每個日志
文件保持多少份舊拷貝。例如,假如設(shè)置它為7,對每個日志文件會有8個版本:1個當(dāng)前的,和7個舊
的。
舊日志文件以數(shù)字擴展來重命名。例如,當(dāng)執(zhí)行一次輪轉(zhuǎn)時,Squid重命名log.6到log.7,然后是
log.5到log.6,依此類推。當(dāng)前l(fā)og變成log.0,并且Squid創(chuàng)建一個新的空文件,命名為log。
每次執(zhí)行squid -k rotate時,Squid輪轉(zhuǎn)下述文件:cache.log, access.log, store.log,
useragent.log (假如激活), 以及referer.log (假如激活)。Squid也會創(chuàng)建最新版本的swap.state
文件。然而請注意,swap.state不會以數(shù)字擴展形式來輪轉(zhuǎn)。
Squid不會自己輪轉(zhuǎn)日志,最好的辦法是在crontab里自動執(zhí)行。例如:
0 0 * * * /usr/local/squid/sbin/squid -k rotate
假如你想編寫自己的腳本來管理日志文件,Squid提供了一個有用的模式,簡單的設(shè)置logfile_rotate
指令為0。這樣,當(dāng)你運行squid -k rotate命令時,Squid簡單的關(guān)閉當(dāng)前日志文件,并且打開新的。
如果操作系統(tǒng)允許重命名被其他進程打開的文件,則這點非常有用。下述shell腳本描述了一個思路:
#!/bin/sh set -e yesterday_secs=`perl -e 'print time -43200'` yesterday_date=`date -r $yesterday_secs +%Y%m%d` cd /usr/local/squid/var/logs # rename the current log file without interrupting the logging process mv access.log access.log.$yesterday_date # tell Squid to close the current logs and open new ones /usr/local/squid/sbin/squid -k rotate # give Squid some time to finish writing swap.state files sleep 60 mv access.log.$yesterday_date /archive/location/ gzip -9 /archive/location/access.log.$yesterday_date
13.8 隱私和安全
Squid的日志文件特別是access.log,包含了用戶的活躍記錄,因此它受隱私問題支配。作為Squid管
理員,你必須采取額外的小心來保證日志文件安全。最好的辦法是限制訪問Squid主機的人員的數(shù)量。
假如這點行不通,那么就要謹慎的檢查文件和目錄許可,確保日志文件不會被非信任的、或未授權(quán)的用
戶訪問。
也可利用client_netmask和strip_query_terms指令來保護用戶隱私。前者讓識別access.log里的用
戶困難;后者移除了URI查詢條件以避免泄露用戶私人信息。更多信息見13.2.4節(jié)。
如果想要保持歷史數(shù)據(jù)相當(dāng)長的時間,你也許可裁減日志來保證日志文件匿名。假如你僅對哪個URI被
訪問感興趣,而不是誰訪問了它們,就可從access.log里抽取出該域。這樣也讓文件更小,并且減少
了隱私違背的風(fēng)險。另一個技術(shù)是隨機處理客戶端IP地址。換句話說,就是創(chuàng)建一個過濾器,把真正的
IP地址映射到假的地址,前提是同一個真IP地址總是映射到同一個假IP。假如你在使用RFC 1413身份
驗證協(xié)議或HTTP認證,也可考慮保持這些域匿名。
);
printf("%02X/%02X/%08X\n",
(($filn / $L2) / $L2) % $L1,
($filn / $L2) % $L2,
$filn);
}
這樣使用它:
___FCKpd___58
要在第N個cache_dir里找到該文件,簡單的進入到相應(yīng)的目錄,并列出或查看該文件:
___FCKpd___59
13.4 referer.log
可選的referer.log包含了來自客戶端請求的Referer頭部。為了使用該功能,必須在./configure時打
開--enable-referer-log選項。還必須用referer_log指令來指定一個路徑。例如:
___FCKpd___60
假如想禁止referer.log,則可設(shè)置文件名為none。
Referer頭部正常情況下包含一個URI,從這個URI獲取到了請求(見RFC2616的14.36節(jié))。例如,當(dāng)web瀏覽器發(fā)布請求到某個內(nèi)嵌圖片時,Referer頭部被設(shè)置成包含該圖片的HTML網(wǎng)頁的URI。當(dāng)你點擊HTML超鏈接時,它也被設(shè)置。某些web站點管理員使用Referer值來查找死鏈接。在使用Squid作為代理人模式時,你也許發(fā)現(xiàn)referer.log特別有用。
referer.log格式簡單,僅有4個域。如下是一些示例:
___FCKpd___61
注意缺少Referer頭部的請求不會被記錄。這4個域描述如下:
注意的是,不像access.log,referer.log在Squid接受到完整請求時,會立刻記錄。這樣,referer.log條目在access.log之前發(fā)生,后者等待響應(yīng)完成才記錄。
13.5 useragent.log
可選的useragent.log包含來自客戶端請求的User-Agent頭部值。為了使用該功能,必須在運行./configure時打開--enable-useragent-log選項。還必須使用useragent_log指令來提供一個路徑名。例如:
___FCKpd___62
User-Agent頭部正常情況下包含了發(fā)起請求的user-agent的描述。大多數(shù)情形下,該描述只是簡單的產(chǎn)品名列表和版本信息。你應(yīng)該清楚應(yīng)用程序可以輕易的提供偽造的user-agent信息?,F(xiàn)代user-agent提供途徑可定制該描述。甚至Squid在轉(zhuǎn)發(fā)請求里能改變這個User-Agent頭部。
useragent.log格式相對簡單,看起來如下:
___FCKpd___63
不像其他日志文件,它僅有3個域:
___FCKpd___64
13.6 swap.state
swap.state文件是目標(biāo)寫入cache目錄、或從cache目錄刪除的日志寫照。每個cache_dir有它自己的swap.state文件。當(dāng)Squid啟動時,它讀取swap.state文件來重建cache目標(biāo)的內(nèi)存索引。這些文件對Squid管理來說,至關(guān)重要。
默認情況下,每個cache.state文件位于它相應(yīng)的cache目錄。這樣,每個state文件自動駐留在每個cache_dir下。這點很有用--假如你想重新排序cache_dir行,或想從cache_dir列表里刪除條目的話。
如果想將它們放在其他位置,可使用cache_swap_log指令來做:
___FCKpd___65
在此情況下,Squid對每個cache目錄創(chuàng)建一個swap.state文件,并增加數(shù)字后綴。例如,假如有4個cache目錄,Squid創(chuàng)建如下日志:
___FCKpd___66
在這個情形下,如果你要增加、刪除、或重排序cache_dir行,就必須手工重命名swap.state文件,以保持事情一致。
技術(shù)上,swap.state格式是獨立于存儲機制的。然而,在當(dāng)前版本的Squid里,所有的存儲機制使用同一種格式。swap.state文件使用修正大?。?8位)的二進制格式。各個域值以主機字節(jié)順序記錄,這樣在不同的操作系統(tǒng)之間不便遷移。表13-3描述了swap.state日志條目的各個域的說明。
Table 13-3. swap.state entry fields
Name | Size, in bytes | Description |
op | 1 | Operation on the entry: added (1) or deleted (2). |
file number | 4 | Same as the fourth field of store.log, except it is stored in binary. |
timestamp | 4 | A timestamp corresponding to the time when the response was generated or last validated. Taken from the Date header for responses that have one. Stored as the number of seconds since the Unix epoch. |
lastref | 4 | A timestamp corresponding to the most recent access to the object. |
expires | 4 | The object's expiration time, taken from an Expires header or Cache-Control max-age directive. |
last-modified | 4 | The object's Last-Modified value. |
swap file size | 4 | The amount of space the object occupies on disk. This includes HTTP headers and other Squid-specific meta-information. |
refcount | 2 | The number of times this object has been requested. |
flags | 2 | Various internal flags used by Squid. |
key | 16 | The MD5 hash of the corresponding URI. Same as the key in store.log, except this one is stored in binary. |
13.7 輪轉(zhuǎn)日志
Squid不斷的寫日志,假如cache非常忙,那么在一段時間后,這些日志文件可能變得很大。某些操作系統(tǒng)甚至限制了文件的最大size(例如2G),假如寫文件超過了這個size就會報錯。為了保持日志文件容易管理,以及讓Squid正常工作,必須定期輪轉(zhuǎn)日志。
Squid有內(nèi)建的功能用于輪轉(zhuǎn)日志??赏ㄟ^squid -k rotate命令來調(diào)用它,然后告訴Squid對每個日志文件保持多少份舊拷貝。例如,假如設(shè)置它為7,對每個日志文件會有8個版本:1個當(dāng)前的,和7個舊的。
舊日志文件以數(shù)字擴展來重命名。例如,當(dāng)執(zhí)行一次輪轉(zhuǎn)時,Squid重命名log.6到log.7,然后是log.5到log.6,依此類推。當(dāng)前l(fā)og變成log.0,并且Squid創(chuàng)建一個新的空文件,命名為log。
每次執(zhí)行squid -k rotate時,Squid輪轉(zhuǎn)下述文件:cache.log, access.log, store.log, useragent.log (假如激活), 以及referer.log (假如激活)。Squid也會創(chuàng)建最新版本的swap.state文件。然而請注意,swap.state不會以數(shù)字擴展形式來輪轉(zhuǎn)。
Squid不會自己輪轉(zhuǎn)日志,最好的辦法是在crontab里自動執(zhí)行。例如:
___FCKpd___67
假如你想編寫自己的腳本來管理日志文件,Squid提供了一個有用的模式,簡單的設(shè)置logfile_rotate指令為0。這樣,當(dāng)你運行squid -k rotate命令時,Squid簡單的關(guān)閉當(dāng)前日志文件,并且打開新的。如果操作系統(tǒng)允許重命名被其他進程打開的文件,則這點非常有用。下述shell腳本描述了一個思路:
___FCKpd___68
13.8 隱私和安全
Squid的日志文件特別是access.log,包含了用戶的活躍記錄,因此它受隱私問題支配。作為Squid管理員,你必須采取額外的小心來保證日志文件安全。最好的辦法是限制訪問Squid主機的人員的數(shù)量。假如這點行不通,那么就要謹慎的檢查文件和目錄許可,確保日志文件不會被非信任的、或未授權(quán)的用戶訪問。
也可利用client_netmask和strip_query_terms指令來保護用戶隱私。前者讓識別access.log里的用戶困難;后者移除了URI查詢條件以避免泄露用戶私人信息。更多信息見13.2.4節(jié)。
如果想要保持歷史數(shù)據(jù)相當(dāng)長的時間,你也許可裁減日志來保證日志文件匿名。假如你僅對哪個URI被訪問感興趣,而不是誰訪問了它們,就可從access.log里抽取出該域。這樣也讓文件更小,并且減少了隱私違背的風(fēng)險。另一個技術(shù)是隨機處理客戶端IP地址。換句話說,就是創(chuàng)建一個過濾器,把真正的IP地址映射到假的地址,前提是同一個真IP地址總是映射到同一個假IP。假如你在使用RFC 1413身份驗證協(xié)議或HTTP認證,也可考慮保持這些域匿名。