jhhll1 发表于 2016-11-1 08:54:45

Squid 缓存的相关操作及使用说明

一、查看squid命中情况

除了之前在squid的access.log中查看squid缓存命中的方法之外,还可以通过以下方法进行查看:
这里对图片服务器的httpd配置文件添加一些新的配置如下:
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType text/css "access plus 12 months"
ExpiresByType image/gif "access plus 12 months"
ExpiresByType image/jpeg "access plus 12 months"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
ExpiresByType application/x-javascript "access plus 12 months"
ExpiresByType vedio/x-flv "access plus 12 months"
把以上内容追加到httpd.conf文件中,然后重新启动httpd服务。
1)使用curl命令查看
# curl -I -s
HTTP/1.0 200 OK
Date: Mon, 31 Oct 2016 03:10:20 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 26 Jun 2014 01:12:31 GMT
ETag: "bf742-2f37a-4fcb2e3149dc0"
Accept-Ranges: bytes
Content-Length: 193402
Content-Type: image/jpeg
Age: 22522
X-Cache: HIT from cache1.contoso.com
Via: 1.0 cache1.contoso.com (squid/3.0.STABLE20)
Connection: close
# curl -I -s |grep -i x-cache
X-Cache: HIT from cache1.contoso.com
# curl -I -s |grep -i x-cache
X-Cache: HIT from cache1.contoso.com
# curl -I -s |grep -i x-cache
X-Cache: HIT from cache1.contoso.com
# curl -I -s |grep -i x-cache
X-Cache: HIT from cache1.contoso.com
2)使用Firefox的firebug插件进行查看

可以看到,在响应头信息中,有max-age也就是我在httpd中设置的expire时间,同样也可以在Expires看到过期时间,Server项显示web服务器的类型,这里是Apache;Via表示通过哪个代理服务器进行访问,这里是我在squid.conf中配置的名称cache1.contoso.com(后面还有squid的版本信息);X-Cache中HIT from cache1.contoso.com表示请求内容在cache1.contoso.com上命中。
3)可能遇到的问题及原因

问题1:日志看不到命中
原因:curl的不是squid缓存服务器地址,而是web服务器,所以看不到命中。
问题2:看到的总是MISS
原因:使用了Ctrl+F5刷新,所以总是cache丢失。
问题3:是否做了服务器时间同步?
服务器时间同步会影响缓存结果,需要在服务器上进行时间同步。
二、修改squid的默认日志格式

squid默认记录日志格式如下:

logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h" %Ss:%Sh
修改squid配置文件,添加如下内容:
# 下面是logs相关配置
emulate_httpd_log on
logformat squid %{X-Forwarded-For}>h %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h" %Ss:%Sh#修改后的access.log格式
access_log /usr/local/squid/var/logs/access.log squid
cache_log /usr/local/squid/var/logs/cache.log
cache_store_log /usr/local/squid/var/logs/store.log
logfile_rotate 20
修改完成后,重启squid服务,再进行日志的查看:

killall squid
squid -k parse
squid -D
# tail -f ../var/logs/access.log
1477907509.273      0 192.168.49.139 TCP_HIT/200 358 HEAD- NONE/- image/jpeg
1477907514.597      0 192.168.49.139 TCP_HIT/200 358 HEAD- NONE/- image/jpeg
1477907521.269      0 192.168.49.139 TCP_HIT/200 360 HEAD- NONE/- image/jpeg
# 上面是修改之前的日志格式,下面是修改之后的日志格式
- - - "HEADHTTP/1.1" 200 360 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2" TCP_HIT:NONE
- - - "GETHTTP/1.1" 304 250 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_IMS_HIT:NONE
- - - "GETHTTP/1.1" 200 193829 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_CLIENT_REFRESH_MISS:FIRST_UP_PARENT
- - - "GETHTTP/1.1" 200 193829 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_CLIENT_REFRESH_MISS:FIRST_UP_PARENT
- - - "GETHTTP/1.1" 304 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_IMS_HIT:NONE
- - - "GETHTTP/1.1" 304 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_IMS_HIT:NONE
- - - "GETHTTP/1.1" 304 286 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko" TCP_IMS_HIT:NONE
# 修改之后的日志格式记录的信息更详细,另外时间也不再是一串看不懂的数字,更易于阅读

其中的对端编码含义如下表所示:


NONE这指明Squid对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。它通常与cache命中、拒绝请求、cache管理请求、错误、和所有的ICP查询这些类型联合出现。

DIRECTSquid直接转发请求到原始服务器。该域的第2半部分显示原始服务器的IP地址,或主机名--假如禁止了log_ip_on_direct。

SIBLING_HIT在姐妹cache返回ICP或HTCP命中后,Squid发送请求到姐妹cache。

PARENT_HIT在父cache返回ICP或HTCP命中后,Squid发送请求到父cache。

DEFAULT_PARENTSquid选择该父cache,因为其在squid.conf的cache_peer行里被标志为default。

FIRST_UP_PARENTSquid转发请求到该父cache,因为它是位于已知活跃列表里的第一个父cache。

FIRST_PARENT_MISSSquid转发请求到该父cache,它第一个响应ICP/HTCP丢失消息。换句话说,对这个特殊的ICP/HTCP查询,在这个特殊时刻,被选中的父cache有最佳的往返时间(RTT)。注意标准RTT可能被人工矫正过,取决于cache_peer指令的weight选项。

CLOSEST_PARENT_MISSSquid选择该父cache,因为它报告到原始服务器的RTT最低。这点仅在2个cache都激活了netdb,并且原始服务器(或在同一子网内的其他server)返回ICMP ping消息。

CLOSEST_PARENT这点类似CLOSEST_PARENT_MISS,除了RTT计算不是来自ICP/HTCP响应消息外。代替的,它们来自Squid保留的更老的计算方式,例如netdb交换功能。

CLOSEST_DIRECTSquid基于netdb算法,转发请求到原始服务器。这点在满足下述任何条件时发生:

[*]1)在Squid和原始服务器之间的RTT小于配置的minimum_direct_rtt值。
[*]2)在Squid和原始服务器之间的标准路由跳数少于配置的minimum_direct_hops值。
[*]3)在ICP/HTCP响应里返回的RTT值,指示Squid离原始服务器近于任何其他邻居。

ROUNDROBIN_PARENTSquid转发请求到该父cache,因为设置了round-robin选项,并且它有最低的使用计数器。

CD_PARENT_HITSquid基于cache摘要算法(见10.7节)转发请求到该父cache。

CD_SIBLING_HITSquid基于cache摘要算法转发请求到该姐妹cache。

CARPSquid选择该父cache,基于cache数组路由协议算法(见10.9节)。

ANY_PARENT作为最后的手段,Squid选择该父cache,因为没有其他方法能选择可行的下一跳。
注意大部分上述编码可能以TIMEOUT_开头,这表明在等待ICP/HTCP响应时发生超时。例如:
1066038165.382    345 193.233.46.21 TCP_MISS/200 2836
      GET
      TIMEOUT_CLOSEST_DIRECT/213.219.122.19image/jpeg可使用icp_query_timeout指令来调整超时。

其中的结果编码含义如下表:

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

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

TCP_REFERSH_HITSquid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的。

TCP_REF_FAIL_HITSquid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。然而,原始服务器响应失败,或者返回的响应Squid不能理解。在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端。

TCP_REFRESH_MISSSquid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器。原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的。

TCP_CLIENT_REFRESH_MISSSquid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令。Squid转发客户端的请求到原始服务器,强迫cache确认。

TCP_IMS_HIT客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。

TCP_SWAPFAIL_MISSSquid发现请求资源的有效拷贝,但从磁盘装载它失败。这时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_HITSquid在内存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_HITSquid在cache里发现请求资源的貌似新鲜的拷贝。

UDP_MISSSquid没有在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_INVALIDSquid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等)。Squid发送UDP_INVALID响应到客户端。

三、查看squid缓存文件情况

squidclient -h localhost -p 80 mgr:objects
这个命令能知道如下重要信息:
1、打印出的是所有缓存在内存和硬盘上的数据,对象是以key来表示,每个key代表不同的对象。
2、列出对象是否存放在内存,还是硬盘。
            IN_MEMORY   在内存中
   GET http://*.*.*.*/test.jpg
命令执行结果示例:
# squidclient -h localhost -p 80 mgr:objects
HTTP/1.0 200 OK
Server: squid/3.0.STABLE20
Mime-Version: 1.0
Date: Mon, 31 Oct 2016 13:33:30 GMT
Content-Type: text/plain
Expires: Mon, 31 Oct 2016 13:33:30 GMT
Last-Modified: Mon, 31 Oct 2016 13:33:30 GMT
X-Cache: MISS from cache1.contoso.com
Via: 1.0 cache1.contoso.com (squid/3.0.STABLE20)
Connection: close

KEY 9C60DB2318E2EB2A91411D99F2EDD2C0
页: [1]
查看完整版本: Squid 缓存的相关操作及使用说明