我正在尝试将 Squid 配置为缓存服务器。我有一个 LAN,其中 Web 服务器 (apache) 位于 ,192.168.122.11
squid 位于192.168.122.21
,我的客户端位于192.168.122.22
。问题是,当我查看 Squid 的访问日志时,我看到的都是TCP_MISS
消息。看来 Squid 根本没有缓存。我检查了缓存目录是否具有所有适当的权限。这里还会出什么问题?这是我的 squid 配置:
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.1/8 0.0.0.0/32 ::1
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 21
acl Safe_ports port 443
acl Safe_ports port 70
acl Safe_ports port 210
acl Safe_ports port 1025-65535
acl Safe_ports port 280
acl Safe_ports port 488
acl Safe_ports port 591
acl Safe_ports port 777
acl CONNECT method CONNECT
http_access allow all
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_port 3128 accel defaultsite=cona-proxy vhost
cache_peer 192.168.122.11 parent 80 0 no-query originserver login=PAS name=webserver
cache_dir ufs /var/spool/squid3 100 16 256
coredump_dir /var/spool/squid3
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern (Release|Packages(.gz)*)$ 0 20% 2880
refresh_pattern . 0 20% 4320
always_direct allow all
acl server_users dstdomain cona-proxy
http_access allow server_users
cache_peer_access webserver allow server_users
cache_peer_access webserver deny all
在所有机器中,cona-proxy
指向192.168.122.21
(在中添加/etc/hosts
)
输出curl -v 192.168.122.11
* About to connect() to 192.168.122.11 (#0)
* Trying 192.168.122.11... connected
> GET / HTTP/1.1
> User-Agent: curl/7.22.0 (i686-pc-linux-gnu) libculr/7.22.0 OpneSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: 192.168.122.11
> Accept: */*
>
< HTTP/1.1 202 OK
< Date Mon, 02 Jul 2012 05:48:50 GMT
< Server: Apache/2.2.22 (Ubuntu)
< Last-Modified: Tue, 19 Jun 2012 23:04:25 GMT
< ETag: "27389-b1-4c2db4dc2c182"
< Accept_Ranges: bytes
< Content-Length: 177
< Vary: Accept-Encoding
< Content-Type: text/html
< X-Pad: avoid browser bug
<
<html><body><h1>It works!</h1>
<p>This is the default web page for the server.</p>
<p>The web server software is running but no content has been added, yet. </p>
</body></html>
* Connection #0 to host 192.168.122.11 left intact
* Closing connection #0
答案1
在您的配置中您错过了以下几行:
acl myhosts src 192.168.0.0/255.255.0.0 (your internal network/netmask)
http_access allow myhosts
编辑1:
您的 Web 服务器不是您的 cache_peer。请从您的配置文件中删除此行。Squid 为实现缓存之间的互操作性使用了另一种协议 (ICP),而 Apache 无法识别这种协议。
答案2
根据我的经验,Squid 拒绝缓存内容的最常见 3 个原因是:
- 缓存目录权限,您已经处理好了。很好 :)
http_access
,但它不是TCP_MISS
你的情况,因为你在 access.log 中看到了几行refresh_pattern
指令
refresh_pattern
指令控制 Squid 如何认为对象是新鲜的或陈旧的,特别是与浏览器发出请求的方式以及交换哪些缓存控制 HTTP 标头有关。
您的配置中包含的行refresh_pattern
是 Squid 的默认行。但是,我两周前才在 Ubuntu 上安装了 Squid,使用这些默认设置,它几乎不缓存任何内容。
Squid 关于 refresh_pattern 的文档应该解释每一行的含义,但我实际上不明白该文档的含义。显然我并不孤单:)
我建议您添加以下一个或多个模式并测试特定文件/URL,直到您满意为止。例如:
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 3600 90% 43200
使用这个,你告诉 Squid 将所有图标/图片视为可缓存,至少 1 小时,最多半天。你的浏览器可能会发送带有特定缓存标头的 HTTP 请求,导致 Squid 回复“无论如何” TCP_MISS
。要力量缓存回复,甚至打破客户期望,你可以这样做:
refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 3600 90% 43200 override-expire ignore-no-cache ignore-no-store ignore-private
对于更大的电影/音频/iso 文件也是如此:
refresh_pattern -i \.(mp[34g]|swf|wav|...)$ 43200 90% 432000
如果其他方法都失败了,就用一把强力的锤子:) 但我确实不是推荐这个:
refresh_pattern . 3600 80% 14400
告诉 Squid 它可以缓存所有内容至少 1 小时。但是,这几乎肯定会破坏动态应用程序。如果您尝试缓存的服务器主要由静态内容组成,请使用它。
另外,别忘了maximum_object_size
。默认情况下,它是20Mb。如果您尝试缓存的对象大于该值,Squid 将不会缓存它们。我将其提高了 10 倍,达到 200Mb。YMMV。
maximum_object_size 204800 KB
顺便说一句,您的cache_peer
行不正确,因为它指向 Apache。cache_peer
在 squid 中,A 是缓存层次结构中较高位置的另一个 squid 实例,过去通常用作 ISP 缓存服务器。只需删除该行即可。
还有祝你好运 :)