Squid Web Cache Wiki

Squid Web Cache 文档

🔗 配置 Squid

🔗 配置前准备

作者:Gregori Parker

关于 Squid,我能给出的最好的建议就是从简单开始!一旦一切都如你所愿地正常工作,然后再逐渐增加复杂性,并有一套方法来跟踪你所做的每一次更改的效果(以及一个你知道如何回到它的已知良好配置,当你不可避免地搞砸的时候!)。

🔗 如何在不重新编译的情况下配置 Squid?

squid.conf 文件。默认情况下,此文件位于 /etc/squid/squid.conf/usr/local/squid/etc/squid.conf

此外,源代码发行版中还包含了一个快速入门指南。请查看你解压源代码归档的目录。

🔗 squid.conf 文件做什么?

squid.conf 文件定义了 squid 的配置。配置包括(但不限于)HTTP 端口号、ICP 请求端口号、传入和传出请求、关于防火墙访问的信息以及各种超时信息。

🔗 在哪里可以找到功能的示例和配置?

这个 wiki 中关于配置的知识仍然隐藏在旧的 SquidFaq 和指南页面中。我们正在努力将其整理成一个更易于使用的布局。

我们目前已有的内容是

🔗 你有 squid.conf 示例吗?

是的。

在您执行 make install 后,Squid 安装目录下的 etc 目录中会有一个示例 squid.conf.default* 文件。

🔗 如何配置 Squid 以在防火墙后面工作?

如果您位于一个无法直接连接到外部世界的防火墙后面,您必须使用父级缓存。通常情况下,Squid 会尝试变得聪明,只在对全局命中率有意义时才使用缓存对等体,因此您需要告诉 Squid 什么时候它不能直接访问,并且即使它知道请求会是缓存未命中,也必须使用父代理。

您可以使用 squid.conf 中的 never_direct 访问列表来指定哪些请求必须转发到防火墙外的父级缓存,以及 always_direct 访问列表来指定哪些请求不得转发。例如,如果 Squid 必须直接连接到所有以 mydomain.com 结尾的服务器,但必须为所有其他服务器使用父级,您将编写:

acl INSIDE dstdomain .mydomain.com
always_direct allow INSIDE
never_direct allow all

您也可以通过 IP 地址指定内部服务器

acl INSIDE_IP dst 1.2.3.0/24
always_direct allow INSIDE_IP
never_direct allow all

但是请注意,当您使用 IP 地址时,Squid 必须执行 DNS 查找才能将 URL 主机名转换为地址。您的内部 DNS 服务器可能无法查找外部域。

如果您使用 never_direct 并且有多个父级缓存,那么您很可能希望将其中一个标记为默认选项,以防 Squid 无法决定使用哪个。这可以通过 cache_peer 行上的 default 关键字来完成。例如:

cache_peer xyz.mydomain.com parent 3128 0 no-query default

🔗 如何配置 Squid 将所有请求转发到另一个代理?

请参阅 Features/CacheHierarchy

🔗 我应该使用多大的 “cache_dir” 尺寸?

本章假设您将整个磁盘分区用于 squid cache_dir,这通常是这种情况。

总的来说,将 cache_dir 设置为与磁盘分区相同的大小不是一个明智的选择,原因有两个。第一个原因是 squid 对磁盘空间不足的容忍度很低。除了 cache_dir 大小之外,squid 还会为 swap.state 使用一些额外的空间,然后还有更多临时存储作为工作区,例如在重建 swap.state 时。所以无论如何都要确保为此留出一些额外的空间,否则您的缓存将进入一个无休止的崩溃-重启循环。

第二个原因是碎片(请注意,这不适用于 COSS 对象存储引擎——当它准备好时):文件系统在避免碎片方面能做的非常有限,并且为了有效,它们需要有空间来尝试和优化文件放置。如果磁盘已满,优化会非常困难,当磁盘已满 100% 时,优化根本不可能。让你的磁盘碎片化,它很可能成为你最严重的瓶颈,远远抵消了你获得的少量存储带来的收益。

我们来看一个例子:你有一个 9Gb 的磁盘(这些时间甚至很难找到..)。首先,制造商经常在磁盘容量上撒谎(关于兆字节 vs. Mebibyte 的问题),然后操作系统需要一些空间用于其会计结构,所以你合理地会得到 8Gib 的可用空间。然后你需要为 Squid 额外承担 10% 的开销,然后是保持碎片化的空间。所以最终推荐的 cache_dir 设置是 6000 到 7000 Mebibyte。

cache_dir ... 7000 16 256

最好从一个保守的设置开始,然后在缓存填充之后,查看磁盘使用情况。如果你认为有大量未使用的空间,那么稍微增加 cache_dir 的设置。

如果你遇到“磁盘已满”写入错误,那么你肯定需要减小你的缓存大小。

🔗 我正在添加一个新的 cache_dir。我会丢失我的缓存吗?

不会。您可以添加和删除 cache_dir 行,而不会影响其他任何行。

🔗 Squid 和 TIS 工具包中的 http-gw

在 fwtk-users 和 squid-users 邮件列表中,许多人都询问了将 Squid 与 TIS 工具包中的 http-gw 结合使用的问题。在我看来,最优雅的方法是运行一个内部 Squid 缓存代理服务器来处理客户端请求,并让该服务器将请求转发到运行在防火墙上的 http-gw。缓存命中将不需要由防火墙处理。

在此示例中,Squid 运行在与 http-gw 相同的服务器上,Squid 使用 8000 端口,http-gw 使用 8080 (web) 端口。本地域名是 home.nl。

🔗 防火墙配置

要么从 /etc/rc.d/rc.local(Linux Slackware): 运行 http-gw 作为守护进程:

exec /usr/local/fwtk/http-gw -daemon 8080

或者像这样从 inetd 运行它:

web stream      tcp      nowait.100  root /usr/local/fwtk/http-gw http-gw

我将水印增加到 100,因为很多人会遇到默认值的问题。

确保你的 /usr/local/etc/netperm-table* 中至少有以下行:

http-gw: hosts 127.0.0.1

你可以将你自己的工作站的 IP 地址添加到这个规则中,并确保 http-gw 本身工作正常,例如:

http-gw:                hosts 127.0.0.1 10.0.0.1

🔗 Squid 配置

以下设置很重要:

http_port       8000
icp_port        0
cache_peer      localhost.home.nl parent 8080 0 default
acl HOME        dstdomain .home.nl
alwayws_direct  allow HOME
never_direct    allow all

这告诉 Squid 为 home.nl 以外的所有域使用父级。下面,access.log 条目显示如果你刷新 Squid 主页会发生什么:

872739961.631 1566 10.0.0.21 ERR_CLIENT_ABORT/304 83 GET https://squid.org.cn/ - DEFAULT_PARENT/localhost.home.nl -
872739962.976 1266 10.0.0.21 TCP_CLIENT_REFRESH/304 88 GET http://www.nlanr.net/Images/cache_now.gif - DEFAULT_PARENT/localhost.home.nl -
872739963.007 1299 10.0.0.21 ERR_CLIENT_ABORT/304 83 GET https://squid.org.cn/Icons/squidnow.gif - DEFAULT_PARENT/localhost.home.nl -
872739963.061 1354 10.0.0.21 TCP_CLIENT_REFRESH/304 83 GET https://squid.org.cn/Icons/Squidlogo2.gif - DEFAULT_PARENT/localhost.home.nl

http-gw 在 syslog 中的条目

Aug 28 02:46:00 memo http-gw[2052]: permit host=localhost/127.0.0.1 use of gateway (V2.0beta)
Aug 28 02:46:00 memo http-gw[2052]: log host=localhost/127.0.0.1 protocol=HTTP cmd=dir dest=www.squid-cache.org path=/
Aug 28 02:46:01 memo http-gw[2052]: exit host=localhost/127.0.0.1 cmds=1 in=0 out=0 user=unauth duration=1
Aug 28 02:46:01 memo http-gw[2053]: permit host=localhost/127.0.0.1 use of gateway (V2.0beta)
Aug 28 02:46:01 memo http-gw[2053]: log host=localhost/127.0.0.1 protocol=HTTP cmd=get dest=www.squid-cache.org path=/Icons/Squidlogo2.gif
Aug 28 02:46:01 memo http-gw[2054]: permit host=localhost/127.0.0.1 use of gateway (V2.0beta)
Aug 28 02:46:01 memo http-gw[2054]: log host=localhost/127.0.0.1 protocol=HTTP cmd=get dest=www.squid-cache.org path=/Icons/squidnow.gif
Aug 28 02:46:01 memo http-gw[2055]: permit host=localhost/127.0.0.1 use of gateway (V2.0beta)
Aug 28 02:46:01 memo http-gw[2055]: log host=localhost/127.0.0.1 protocol=HTTP cmd=get dest=www.nlanr.net path=/Images/cache_now.gif
Aug 28 02:46:02 memo http-gw[2055]: exit host=localhost/127.0.0.1 cmds=1 in=0 out=0 user=unauth duration=1
Aug 28 02:46:03 memo http-gw[2053]: exit host=localhost/127.0.0.1 cmds=1 in=0 out=0 user=unauth duration=2
Aug 28 02:46:04 memo http-gw[2054]: exit host=localhost/127.0.0.1 cmds=1 in=0 out=0 user=unauth duration=3

总结

优点

缺点

贡献者:Rodney van den Oever

🔗 “HTTP_X_FORWARDED_FOR” 是什么?为什么 Squid 将它提供给 WWW 服务器,以及如何停止它?

请参阅 安全 - X-Forwarded-For

当使用代理缓存时,服务器看不到来自原始客户端的连接。许多人喜欢根据客户端地址实现访问控制。为了满足这些人的需求,Squid 添加了一个名为“X-Forwarded-For”的请求头,它看起来像这样:

X-Forwarded-For: 128.138.243.150, unknown, 192.52.106.30

条目始终是 IP 地址,或者如果地址无法确定或已通过 forwarded_for 配置选项禁用,则为 unknown。

我们必须注意,基于此头的访问控制非常薄弱且容易伪造。任何人都可以手动输入具有任何 IP 地址的请求。这或许是 HTTP/1.1 规范省略客户端 IP 地址的原因。

由于此头的弱点,默认情况下不使用基于 X-Forwarded-For 的访问控制。它需要通过 follow_x_forwarded_for 显式启用。

🔗 Squid 可以匿名化 HTTP 请求吗?

是的,它可以,但是实现方式已从早期版本的 squid 更改。请按照你使用的 squid 版本的说明进行操作。默认情况下,不进行任何匿名化。

如果你选择使用匿名化器,你可能希望研究 forwarded_for 选项以防止披露客户端地址。未能关闭 forwarded_for 选项将降低匿名化器的有效性。最后,如果你使用 fake_user_agent 选项过滤 User-Agent 头,可以防止一些用户问题,因为一些网站需要 User-Agent 头。

注意:在编译之前,Squid 必须使用 **–enable-http-violations** 配置选项进行编译。

当前的 squid 版本提供了一系列头控制指令和功能;

有关详细信息,请参阅你使用的 squid 特定版本的 squid.conf.default 或 squid.conf.documented 中的文档。

参考:Anonymous WWW

🔗 我能让 Squid 直接访问某些网站吗?

当然,只需使用 always_direct 访问列表即可。

例如,如果你想让 Squid 直接连接到 hotmail.com 服务器,你可以在配置文件中使用以下行:

acl hotmail dstdomain .hotmail.com
always_direct allow hotmail

🔗 我能让 Squid 只作为代理,不缓存任何东西吗?

当然,有几种方法可以做到。

你可以使用 cache 访问列表让 Squid 永远不缓存任何响应。

cache deny all

使用 Squid-2.7、Squid-3.1 及更高版本,你也可以从 squid.conf 中删除所有 ‘cache_dir’ 选项,以避免创建缓存目录。

对于 Squid-2.4、2.5、2.6 和 3.0,你需要使用 “null” 存储模块。

cache_dir null /tmp

注意:null cache_dir 并不会禁用缓存,但如果你使用 cache 禁用了缓存,它会避免你创建缓存结构。该目录(例如,/tmp)必须存在,以便 squid 可以 chdir 到它,除非你也使用了 coredump_dir 选项。

要为 “null” 存储模块配置 Squid,请在 configure命令行上指定它:

--enable-storeio=null,...

🔗 我能阻止用户下载大文件吗?

你可以设置全局 reply_body_max_size 参数。此选项控制将为单个请求发送给缓存客户端的最大 HTTP 消息正文。

如果来自服务器的 HTTP 响应有 Content-length 头,那么 Squid 会将 content-length 值与 reply_body_max_size 值进行比较。如果 content-length 更大,则服务器连接会被关闭,用户会收到来自 Squid 的错误消息。

某些响应没有 Content-length 头。在这种情况下,Squid 会计算写入客户端的字节数。一旦达到限制,客户端的连接将被简单地关闭。

:bulb: 请注意,“有创意的”用户代理仍然能够通过 HTTP/1.1 range 请求下载真正大的文件。

回到 FAQ 索引

导航: 网站搜索网站页面分类🔼 向上