13.3.1 转换文件号到路径名假如想要检查某个特定的cache文件,你可稍费工夫将文件号转换到路径名。另外目录号和L1和L2值 也是必需的。在squid的源代码里,storeUfsDirFullPath( )函数做这个事情。可在 src/fs/ufs/store_dir_ufs.c文件里找到它。如下短小的perl脚本模拟了当前算法: useragent_log /usr/local/squid/var/logs/useragent.log7 这样使用它: % echo 000DCD06 | ./fileno-to-pathname.pl 0D/CD/000DCD06 要在第N个cache_dir里找到该文件,简单的进入到相应的目录,并列出或查看该文件: % cd /cache2 % ls -l 0D/CD/000DCD06 -rw------- 1 squid squid 391 Jun 3 12:40 0D/CD/000DCD06 % less 0D/CD/000DCD06
可选的referer.log包含了来自客户端请求的Referer头部。为了使用该功能,必须在./configure时打 开--enable-referer-log选项。还必须用referer_log指令来指定一个路径。例如: referer_log /usr/local/squid/var/logs/referer.log 假如想禁止referer.log,则可设置文件名为none。 Referer头部正常情况下包含一个URI,从这个URI获取到了请求(见RFC2616的14.36节)。例如, 当web浏览器发布请求到某个内嵌图片时,Referer头部被设置成包含该图片的HTML网页的URI。当 你点击HTML超链接时,它也被设置。某些web站点管理员使用Referer值来查找死链接。在使用 Squid作为代理人模式时,你也许发现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之前发生,后者等待响应完成才记录。
可选的useragent.log包含来自客户端请求的User-Agent头部值。为了使用该功能,必须在运行 ./configure时打开--enable-useragent-log选项。还必须使用useragent_log指令来提供一个路径 名。例如: ___FCKpd___5 User-Agent头部正常情况下包含了发起请求的user-agent的描述。大多数情形下,该描述只是简单 的产品名列表和版本信息。你应该清楚应用程序可以轻易的提供伪造的user-agent信息。现代 user-agent提供途径可定制该描述。甚至Squid在转发请求里能改变这个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./bot.html)" 3.0.168.205 [05/Nov/2003:08:52:50 -0700] "WebZIP/4.1 (http://www.)" 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./] (Version 2.0..." 不像其他日志文件,它仅有3个域:
swap.state文件是目标写入cache目录、或从cache目录删除的日志写照。每个cache_dir有它自己 的swap.state文件。当Squid启动时,它读取swap.state文件来重建cache目标的内存索引。这些 文件对Squid管理来说,至关重要。 默认情况下,每个cache.state文件位于它相应的cache目录。这样,每个state文件自动驻留在每个 cache_dir下。这点很有用--假如你想重新排序cache_dir行,或想从cache_dir列表里删除条目的 话。 如果想将它们放在其他位置,可使用cache_swap_log指令来做: cache_swap_log /usr/local/squid/var/logs/swap.state 在此情况下,Squid对每个cache目录创建一个swap.state文件,并增加数字后缀。例如,假如有4个 cache目录,Squid创建如下日志: /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文件, 以保持事情一致。 技术上,swap.state格式是独立于存储机制的。然而,在当前版本的Squid里,所有的存储机制使用 同一种格式。swap.state文件使用修正大小(48位)的二进制格式。各个域值以主机字节顺序记录, 这样在不同的操作系统之间不便迁移。表13-3描述了swap.state日志条目的各个域的说明。 Table 13-3. swap.state entry fields
13.7 轮转日志 Squid不断的写日志,假如cache非常忙,那么在一段时间后,这些日志文件可能变得很大。某些操作 系统甚至限制了文件的最大size(例如2G),假如写文件超过了这个size就会报错。为了保持日志文件 容易管理,以及让Squid正常工作,必须定期轮转日志。 Squid有内建的功能用于轮转日志。可通过squid -k rotate命令来调用它,然后告诉Squid对每个日志 文件保持多少份旧拷贝。例如,假如设置它为7,对每个日志文件会有8个版本:1个当前的,和7个旧 的。 旧日志文件以数字扩展来重命名。例如,当执行一次轮转时,Squid重命名log.6到log.7,然后是 log.5到log.6,依此类推。当前log变成log.0,并且Squid创建一个新的空文件,命名为log。 每次执行squid -k rotate时,Squid轮转下述文件:cache.log, access.log, store.log, useragent.log (假如激活), 以及referer.log (假如激活)。Squid也会创建最新版本的swap.state 文件。然而请注意,swap.state不会以数字扩展形式来轮转。 Squid不会自己轮转日志,最好的办法是在crontab里自动执行。例如: 0 0 * * * /usr/local/squid/sbin/squid -k rotate 假如你想编写自己的脚本来管理日志文件,Squid提供了一个有用的模式,简单的设置logfile_rotate 指令为0。这样,当你运行squid -k rotate命令时,Squid简单的关闭当前日志文件,并且打开新的。 如果操作系统允许重命名被其他进程打开的文件,则这点非常有用。下述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
Squid的日志文件特别是access.log,包含了用户的活跃记录,因此它受隐私问题支配。作为Squid管 理员,你必须采取额外的小心来保证日志文件安全。最好的办法是限制访问Squid主机的人员的数量。 假如这点行不通,那么就要谨慎的检查文件和目录许可,确保日志文件不会被非信任的、或未授权的用 户访问。 也可利用client_netmask和strip_query_terms指令来保护用户隐私。前者让识别access.log里的用 户困难;后者移除了URI查询条件以避免泄露用户私人信息。更多信息见13.2.4节。 如果想要保持历史数据相当长的时间,你也许可裁减日志来保证日志文件匿名。假如你仅对哪个URI被 访问感兴趣,而不是谁访问了它们,就可从access.log里抽取出该域。这样也让文件更小,并且减少 了隐私违背的风险。另一个技术是随机处理客户端IP地址。换句话说,就是创建一个过滤器,把真正的 IP地址映射到假的地址,前提是同一个真IP地址总是映射到同一个假IP。假如你在使用RFC 1413身份 验证协议或HTTP认证,也可考虑保持这些域匿名。
这样使用它: ___FCKpd___58 要在第N个cache_dir里找到该文件,简单的进入到相应的目录,并列出或查看该文件: ___FCKpd___59 13.4 referer.log 可选的referer.log包含了来自客户端请求的Referer头部。为了使用该功能,必须在./configure时打 开--enable-referer-log选项。还必须用referer_log指令来指定一个路径。例如: ___FCKpd___60 假如想禁止referer.log,则可设置文件名为none。 Referer头部正常情况下包含一个URI,从这个URI获取到了请求(见RFC2616的14.36节)。例如,当web浏览器发布请求到某个内嵌图片时,Referer头部被设置成包含该图片的HTML网页的URI。当你点击HTML超链接时,它也被设置。某些web站点管理员使用Referer值来查找死链接。在使用Squid作为代理人模式时,你也许发现referer.log特别有用。 referer.log格式简单,仅有4个域。如下是一些示例: ___FCKpd___61 注意缺少Referer头部的请求不会被记录。这4个域描述如下:
注意的是,不像access.log,referer.log在Squid接受到完整请求时,会立刻记录。这样,referer.log条目在access.log之前发生,后者等待响应完成才记录。
13.5 useragent.log 可选的useragent.log包含来自客户端请求的User-Agent头部值。为了使用该功能,必须在运行./configure时打开--enable-useragent-log选项。还必须使用useragent_log指令来提供一个路径名。例如: ___FCKpd___62 User-Agent头部正常情况下包含了发起请求的user-agent的描述。大多数情形下,该描述只是简单的产品名列表和版本信息。你应该清楚应用程序可以轻易的提供伪造的user-agent信息。现代user-agent提供途径可定制该描述。甚至Squid在转发请求里能改变这个User-Agent头部。 useragent.log格式相对简单,看起来如下: ___FCKpd___63 不像其他日志文件,它仅有3个域:
13.6 swap.state swap.state文件是目标写入cache目录、或从cache目录删除的日志写照。每个cache_dir有它自己的swap.state文件。当Squid启动时,它读取swap.state文件来重建cache目标的内存索引。这些文件对Squid管理来说,至关重要。 默认情况下,每个cache.state文件位于它相应的cache目录。这样,每个state文件自动驻留在每个cache_dir下。这点很有用--假如你想重新排序cache_dir行,或想从cache_dir列表里删除条目的话。 如果想将它们放在其他位置,可使用cache_swap_log指令来做: ___FCKpd___65 在此情况下,Squid对每个cache目录创建一个swap.state文件,并增加数字后缀。例如,假如有4个cache目录,Squid创建如下日志: ___FCKpd___66 在这个情形下,如果你要增加、删除、或重排序cache_dir行,就必须手工重命名swap.state文件,以保持事情一致。 技术上,swap.state格式是独立于存储机制的。然而,在当前版本的Squid里,所有的存储机制使用同一种格式。swap.state文件使用修正大小(48位)的二进制格式。各个域值以主机字节顺序记录,这样在不同的操作系统之间不便迁移。表13-3描述了swap.state日志条目的各个域的说明。 Table 13-3. swap.state entry fields
13.7 轮转日志 Squid不断的写日志,假如cache非常忙,那么在一段时间后,这些日志文件可能变得很大。某些操作系统甚至限制了文件的最大size(例如2G),假如写文件超过了这个size就会报错。为了保持日志文件容易管理,以及让Squid正常工作,必须定期轮转日志。 Squid有内建的功能用于轮转日志。可通过squid -k rotate命令来调用它,然后告诉Squid对每个日志文件保持多少份旧拷贝。例如,假如设置它为7,对每个日志文件会有8个版本:1个当前的,和7个旧的。 旧日志文件以数字扩展来重命名。例如,当执行一次轮转时,Squid重命名log.6到log.7,然后是log.5到log.6,依此类推。当前log变成log.0,并且Squid创建一个新的空文件,命名为log。 每次执行squid -k rotate时,Squid轮转下述文件:cache.log, access.log, store.log, useragent.log (假如激活), 以及referer.log (假如激活)。Squid也会创建最新版本的swap.state文件。然而请注意,swap.state不会以数字扩展形式来轮转。 Squid不会自己轮转日志,最好的办法是在crontab里自动执行。例如: ___FCKpd___67 假如你想编写自己的脚本来管理日志文件,Squid提供了一个有用的模式,简单的设置logfile_rotate指令为0。这样,当你运行squid -k rotate命令时,Squid简单的关闭当前日志文件,并且打开新的。如果操作系统允许重命名被其他进程打开的文件,则这点非常有用。下述shell脚本描述了一个思路: ___FCKpd___68 13.8 隐私和安全 Squid的日志文件特别是access.log,包含了用户的活跃记录,因此它受隐私问题支配。作为Squid管理员,你必须采取额外的小心来保证日志文件安全。最好的办法是限制访问Squid主机的人员的数量。假如这点行不通,那么就要谨慎的检查文件和目录许可,确保日志文件不会被非信任的、或未授权的用户访问。 也可利用client_netmask和strip_query_terms指令来保护用户隐私。前者让识别access.log里的用户困难;后者移除了URI查询条件以避免泄露用户私人信息。更多信息见13.2.4节。 如果想要保持历史数据相当长的时间,你也许可裁减日志来保证日志文件匿名。假如你仅对哪个URI被访问感兴趣,而不是谁访问了它们,就可从access.log里抽取出该域。这样也让文件更小,并且减少了隐私违背的风险。另一个技术是随机处理客户端IP地址。换句话说,就是创建一个过滤器,把真正的IP地址映射到假的地址,前提是同一个真IP地址总是映射到同一个假IP。假如你在使用RFC 1413身份验证协议或HTTP认证,也可考虑保持这些域匿名。 |
|