我的任务是限制带宽消耗。我已将 squid 设置为透明代理,并阻止各种内容类型,例如视频、x-flv...内容类型 acl 似乎工作正常。我还将 reply_body_max_size 设置为 10 MB,但仍在进行大文件下载。这个昨晚才下载成功。
1331243510.997 621794 192.168.0.100 TCP_MISS/200 37603388 GET http://cache.pack.google.com/edgedl/chrome/mac/GoogleChrome-17.0.963.78.dmg - DIRECT/173.194.12.207 application/x-apple-diskimage
这是我的指令:(更改后,Squid 重新启动)
reply_body_max_size 10 MB
通过阅读 squid 文档http://www.squid-cache.org/Doc/config/reply_body_max_size/看起来其他下游 squid 代理服务器可能存在问题。我知道他们使用的 ISP(Tachyon Systems)在其调制解调器中内置了 squid 代理服务器。
这可能是为什么 reply_body_max_size 在我的环境中不起作用的原因吗?
答案1
作为Squid 文档也就是说,reply_body_max_size 配置指令会导致 Squid 在 HTTP 回复主体超过指定大小时停止传输。Squid 通过两种方式检查这一点:使用 HTTP Content-Length: 标头(如果存在)- 在这种情况下,将不允许回复,并将 TCP_DENIED_REPLY 写入日志。或者,如果 HTTP Content-Length: 标头不存在,则将允许回复,但当达到 reply_body_max_size 时将关闭连接。
在第二种情况下,可能会对您下游的任何缓存产生潜在的重大连锁反应。如果 HTTP 传输在没有 HTTP Content-length: 标头的情况下启动,并且您的 Squid 副本随后在达到回复大小限制时断开连接,则下游缓存将不知道在发送完整回复正文之前已断开连接。这可能导致存储在下游缓存中的对象副本不完整。但是,根据您的描述,我不认为这里的情况如此,因为您谈论的是您的 ISP 运营的上游代理。
就这一点而言,我看不出上游代理可能会影响您限制回复正文大小的能力。
关于您配置中的语法,请注意以下几点。您已指定:
reply_body_max_size 10 MB
当我认为这实际上应该是:
reply_body_max_size 10 MB all
请注意末尾的 ACL 名称“all”。Squid 文档将 ACL 列表放在方括号中,这往往表明此参数是可选的,在我的测试中,我确实发现情况确实如此。但是,网络上某些地方(以及上面的这个线程)存在这种语法的变体,有时配置行中也会放置单词“allow”或“deny”。根据 Squid 文档和我的测试,这是不正确的。上面的语法对我来说测试正确。
Nb. 使用 Squid 3.1.23 和 Squid 3.5.0.2 进行测试。
答案2
您应该尝试将其应用于您的源 acl。例如:类似这样的内容
acl localnet src 192.168.0.0/16
reply_body_max_size 52428800 deny localnet
http_access allow localnet