Squid 日志分析

Apache 和 Squid 是两种著名的代理缓存软件,但Squid 较 Apache 而言是专门的代理缓存服务器软件,其代理缓存的功能强大,支持 HTTP/1.1 协议,其缓存对象也较多;并且 Squid 的缓存管理模块和访问控制模块功能很强大。它们有一定的相似之处,所以在分析完Apache日志后再看Squid日志就容易多了。

1.时间戳

请求完成时间,以Unix纪元(UTC 1970-01-01 00:00:00)以来的秒数表示,它是毫秒级的。

squid使用这种格式而不是人工可读的时间格式,是为了简化某些日志处理程序的工作。

可以使用一个简单的perl命令来转化Unix时间戳到本地时间,例如:

perl -pe ‘s/^\d+\.\d+/localtime(TCP_REFERSH_HITamp;)/e;’ access.log

2.响应时间

对HTTP事务来说,该域表明squid花了多少时间来处理请求。在squid接受到HTTP请求时开始计时,

在响应完全送出后计时终止。响应时间是毫秒级的。

对ICP查询来说,响应时间通常是0。这是因为squid回答ICP查询非常迅速。甚至,squid在接受到

ICP查询和发送完响应之间,不会更新进程时钟。

尽管时间值是毫秒级的,但是精度可能是10毫秒。在squid负载繁重时,计时变得没那么精确。

3.客户端地址

该域包含客户端的IP地址,或者是主机名–假如激活了log_fqdn。出于安全或隐私的理由,你可能

需要使用client_netmask指令来掩盖客户端地址的一部分。然而,这样让来自同一客户端的组请求

变得不可能。

4.结果/状态码

该域包含2个token,以斜杠分隔。第一个token叫结果码,它把协议和事务结果(例如TCP_HIT或

UDP_DENIED)进行归类。这些是squid专有的编码,在13.2.1节里有定义。以TCP_开头的编码指

HTTP请求,以UDP_开头的编码指ICP查询。

第2个token是HTTP响应状态码(例如200,304,404等)。状态码通常来自原始服务器。在某些情形

下,squid可能有义务自己选择状态码。这些编码在HTTP的RFC里定义,在随后的Table 13-1里有

概述。

5.传输size

该域指明传给客户端的字节数。严格的讲,它是squid告诉TCP/IP协议栈去发送给客户端的字节数。

这就是说,它不包括TCP/IP头部的overhead。也请注意,传输size正常来说大于响应的

Content-Length。传输size包括了HTTP响应头部,然而Content-Length不包括。

传输size可用于近似的带宽使用分析,但并非精确的HTTP实体size计算。假如需要了解响应的

Content-Length,可在store.log里找到它。

6.请求方式

该域包含请求方式。因为squid客户端可能使用ICP或HTTP,请求方式就可能是HTTP-或ICP-这2种。

最普通的HTTP请求方式是GET。ICP查询总以ICP_QUERY的形式被记载。请见6.1.2.8节关于squid

了解的HTTP方式列表。

7.URI

该域包含来自客户端请求的URI。大多数记录下来的URI实际是URL(例如,它们有主机名)。

Squid对某些失败使用特殊的记录格式。例如Squid不能解析HTTP请求,或者不能决定URI,这时你

可能见到类似于”error:invalid-request.” 的字串出现在URI的位置。例如:

1066036250.603 310 192.0.34.70 NONE/400 1203 GET error:invalid-request – NONE/- –

另外在该域里,也请留心URI里的空格字符。取决于uri_whitespace设置,squid可能在日志文件里

打印URI时带空格字符。若发生这种情况,则阅读access.log文件的日志分析工具可能会遇到麻烦。

在记日志时,squid删掉了在第一个问号(?)之后的所有URI字符,除非禁用了strip_query_terms指

令。

8.客户端身份

Squid有2种不同的办法来决定用户的身份。一种是RFC 1413身份协议,另一种来自HTTP验证头部。

Squid试图基于ident_lookup_access规则进行身份查询,假如有的话。另外,假如使用代理验证

(或在代理人模式下的规范服务验证),squid会在该域放置给定的用户名。假如2者都提供给squid

一个用户名,并且你使用了原始access.log格式,那么HTTP验证名字会记录下来,RFC 1413名字

会忽略掉。普通日志文件格式会把两者都独立的记录。

9.对端编码/对端主机

对端信息包含了2个token,以斜杠分隔。它仅仅与cache丢失的请求有关。第一个token指示如何选

择下一跳,第二个token是下一跳的地址。对端编码列在13.2.3节里。

当squid发送一个请求到邻居cache时,对端主机地址是邻居的主机名。假如请求是直接送到原始服务

器的,则squid会写成原始服务器的IP地址或主机名–假如禁用了log_ip_on_direct。NONE/-这个值

指明squid不转发该请求到任何其他服务器。

10.内容类型

原始access.log的默认的最后一个域,是HTTP响应的内容类型。squid从响应的Content-Type头部

获取内容类型值。假如该头部丢失了,squid使用一个横杠(-)代替。

假如激活了log_mime_headers指令,squid在每行追加2个附加的域:

11.HTTP请求头部

Squid编码HTTP请求头部,并且在一对方括号之间打印它们。方括号是必须的,因为squid不编码空格

字符。编码方案稍许奇怪。回车(ASCII 13)和换行(ASCII 10)分别打印成\r和\n。其他不可打印

的字符以RFC 1738风格来编码,例如Tab(ASCII 9)变成了%09。

12.HTTP响应头部

Squid编码HTTP响应头部,并且在一对方括号之间打印它们。注意这些是发往客户端的头部,可能不

同于从原始服务器接受到的头部。

Squid只有在整个响应发送到客户端完成以后,才写access.log日志。这点允许squid在日志文件里包

含请求和响应两者信息。然而,需要花费数分钟甚至数小时才能完成的事务,请求期间的日志在

access.log里不可见。当这类型的事务呈现出性能或策略问题时,access.log可能对你没有帮助。代

替的,可使用cache管理器来浏览挂起事务的列表(见14章)。

13.2.1 access.log结果编码

相应于HTTP请求,下列标签可能出现在access.log文件的第四个域。

TCP_HIT

Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端。

TCP_MISS

Squid没有请求资源的cache拷贝。

___FCKpd___6

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器返回304(未修改

)响应,指示squid的拷贝仍旧是新鲜的。

TCP_REF_FAIL_HIT

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,

或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户

端。

TCP_REFRESH_MISS

Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指

示这个cache拷贝确实是陈旧的。

TCP_CLIENT_REFRESH_MISS

Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发

客户端的请求到原始服务器,强迫cache确认。

TCP_IMS_HIT

客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客

户端,而不联系原始服务器。

TCP_SWAPFAIL_MISS

Squid发现请求资源的有效拷贝,但从磁盘装载它失败。这时squid发送请求到原始服务器,就如同这

是个cache丢失一样。

TCP_NEGATIVE_HIT

在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复

请求,导致了否命中。negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内

存cache,不会写往磁盘。下列HTTP状态码可能导致否定cache(也遵循于其他约束):

204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。

TCP_MEM_HIT

Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现

了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以

TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。

TCP_DENIED

因为http_access或http_reply_access规则,客户端的请求被拒绝了。注意被http_access拒绝的

请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值。

TCP_OFFLINE_HIT

当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度。

TCP_REDIRECT

重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节)。正常的,Squid不会记录这些

重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS预处理指令。

NONE

无分类的结果用于特定错误,例如无效主机名。

相应于ICP查询,下列标签可能出现在access.log文件的第四域。

UDP_HIT

Squid在cache里发现请求资源的貌似新鲜的拷贝。

UDP_MISS

Squid没有在cache里发现请求资源的貌似新鲜的拷贝。假如同一目标通过HTTP请求,就可能是个

cache丢失。请对比UDP_MISS_NOFETCH。

UDP_MISS_NOFETCH

跟UDP_MISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求。假如使用了-Y命令行

选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDP_MISS。

UDP_DENIED

因为icp_access规则,ICP查询被拒绝。假如超过95%的到某客户端的ICP响应是UDP_DENIED,并

且客户端数据库激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端。若这点发

生,你也可在cache.log里见到一个警告。

UDP_INVALID

Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等)。Squid发送

UDP_INVALID响应到客户端。

13.2.2 HTTP响应状态码

Table 13-1列出了数字HTTP响应CODE和理由短句。注意Squid和其他HTTP客户端仅仅关注这些数

字值。理由短句是纯解释性的,不会影响响应的意义。对每个状态码,也提供了一个到RFC 2616的具

体节的索引。注意状态码0和600是squid使用的非标准的值,不会在RFC里提到。

Table 13-1. HTTP response status codes

Code Reason phrase RFC 2616 section
0 No Response Received (Squid-specific) N/A
1xx Informational 10.1
100 Continue 10.1.1
101 Switching Protocols 10.1.2
2xx Successful 10.2
200 OK 10.2.1
201 Created 10.2.2
202 Accepted 10.2.3
203 Non-Authoritative Information 10.2.4
204 No Content 10.2.5
205 Reset Content 10.2.6
206 Partial Content 10.2.7
3xx Redirection 10.3
300 Multiple Choices 10.3.1
301 Moved Permanently 10.3.2
302 Found 10.3.3
303 See Other 10.3.4
304 Not Modified 10.3.5
305 Use Proxy 10.3.6
306 (Unused) 10.3.7
307 Temporary Redirect 10.3.8
4xx Client Error 10.4
400 Bad Request 10.4.1
401 Unauthorized 10.4.2
402 Payment Required 10.4.3
403 Forbidden 10.4.4
404 Not Found 10.4.5
405 Method Not Allowed 10.4.6
406 Not Acceptable 10.4.7
407 Proxy Authentication Required 10.4.8
408 Request Timeout 10.4.9
409 Conflict 10.4.10
410 Gone 10.4.11
411 Length Required 10.4.12
412 Precondition Failed 10.4.13
413 Request Entity Too Large 10.4.14
414 Request-URI Too Long 10.4.15
415 Unsupported Media Type 10.4.16
416 Requested Range Not Satisfiable 10.4.17
417 Expectation Failed 10.4.18
5xx Server Error 10.5
500 Internal Server Error 10.5.1
501 Not Implemented 10.5.2
502 Bad Gateway 10.5.3
503 Service Unavailable 10.5.4
504 Gateway Timeout 10.5.5
505 HTTP Version Not Supported 10.5.6
6xx Proxy Error N/A
600 Unparseable Response Headers (Squid-specific) N/A

假如Squid从原始服务器没有接受到任何响应,你可在access.log里看到状态码0。假如Squid接受到

的响应没有包含HTTP头部,就会出现状态码600。在少数情况下,某些原始服务器仅发送响应body,

而忽略了任何头部。