44 Squid 缓存代理服务器 #
Squid 是广泛用于 Linux 和 UNIX 平台的缓存代理服务器。这表示它会将请求的互联网对象(例如 Web 或 FTP 服务器上的数据)存储在离请求工作站更近(与服务器相比)的计算机上。可以在多个层次中设置它,以确保即使在对最终用户来说是透明的模式下,也能达到最佳的响应速度和较低的带宽用量。
Squid 充当缓存代理服务器。它将来自客户端(这里指来自 Web 浏览器)的对象请求重定向至服务器。当服务器回复所请求的对象后,它会将这些对象传递给客户端并在硬盘缓存中保存对象副本。缓存的其中一个优点是,当多个客户端请求同一对象时,可以从硬盘缓存提供该对象。这样客户端接收数据的速度要比从互联网接收快得多。此过程还可以减少网络流量。
除实际的缓存外,Squid 还提供众多其他功能:
在代理服务器的互通层次之间分配负载
为所有访问代理服务器的客户端定义严格的访问控制列表
允许或拒绝使用其他应用程序访问特定网页
生成有关频繁访问的网页的统计信息,以评估用户的浏览习惯
Squid 不是通用的代理服务器。通常只充当 HTTP 连接的代理。它支持 FTP、Gopher、SSL 和 WAIS 协议,但不支持其他互联网协议,如新闻协议或视频会议协议。由于 Squid 只支持将 UDP 协议用于在不同的缓存间提供通讯功能,因此很多多媒体程序都不受支持。
44.1 有关代理服务器的信息 #
作为缓存代理服务器,Squid 有几种使用方式。与防火墙结合使用时,能够提高安全性。可以一起使用多个代理。还能确定应该缓存的对象的类型以及缓存的时间。
44.1.1 Squid 和安全性 #
可将 Squid 与防火墙结合使用,来防止内部网络遭受外部攻击。防火墙会拒绝 Squid 之外的所有客户端对外部服务的访问。所有 Web 连接必须通过代理服务器建立。在此配置下,Squid 可全面控制 Web 访问。
如果防火墙配置中包含某个隔离区域 (DMZ),代理服务器应在此区域内操作。第 44.6 节 “配置透明代理”介绍如何实施透明代理。如此可简化客户端的配置,因为在这种情况下,它们不需要有关代理服务器的任何信息。
44.1.2 多个缓存 #
可以配置 Squid 的几个实例从而在它们之间交换对象。这样会降低系统总负载,提高从本地网络检索对象的几率。还可以配置缓存层次,以便缓存能够将对象请求转发给同级缓存或父缓存,如此其便可从本地网络中的其他缓存或直接从数据源请求对象。
为了不给网络增加总体数据流量,为缓存层次选择适当的拓扑结构很重要。对于大型网络,合理的做法是:为每个子网配置一个代理服务器并将其连接到父代理服务器,而后者连接到 ISP 的缓存代理服务器。
所有这些通讯都通过在 UDP 协议之上运行的 ICP(互联网缓存协议)来处理。缓存间的数据传送使用基于 TCP 的 HTTP(超文本传送协议)来处理。
为了找到最适合向其请求对象的服务器,一个缓存会向所有同级代理发送 ICP 请求。同级代理会通过 ICP 响应回复这些请求。如果检测到对象,它们会使用代码 HIT
,若未检测到,则会使用 MISS
。
如果发现多个 HIT
响应,代理服务器会根据哪个缓存发送回复的速度最快或哪个服务器较近等因素决定从哪个服务器下载。如果没有收到满意的响应,该请求会发送至父缓存。
为了避免网络中不同缓存中的对象重复,还会使用其他 ICP 协议,如 CARP(缓存阵列路由协议)或 HTCP(超文本缓存协议)。网络中维护的对象越多,找到所需对象的可能性就越大。
44.1.3 缓存互联网对象 #
网络中提供的许多对象都不是静态的,例如动态生成的页面和 TLS/SSL 加密内容。由于每次访问这类对象时它们都会更改,所以它们不会被缓存。
为确定对象应保留在缓存中的期限,系统会为对象指派多个状态中的一种。Web 和代理服务器会通过为这些对象添加报头来找出对象的状态(如“Last modified”或“Expires”)以及相应的日期。也可以使用指定不能缓存的对象的其他报头。
缓存中的对象通常会因缺少可用磁盘空间而通过 LRU(最近最少使用)之类的算法进行替换。这意味着代理会删除未被请求时间最长的对象。
44.2 系统要求 #
系统要求取决于系统必须承受的最大网络负载。由于负载在高峰期间可能是日均值的四倍以上,因此需要检查负载峰值。如果不能确定,请将系统要求稍微高估一点。让 Squid 在濒临其处理能力上限的状态下工作可能会严重影响其服务质量。以下几节按重要程度依次阐述了各个系统要素:
RAM 大小
CPU 速度/物理 CPU 内核
磁盘缓存的大小
硬盘/SSD 及其体系结构
44.2.1 RAM #
Squid 所需内存 (RAM) 大小与缓存中的对象数有直接的关系。随机存取内存比硬盘/SSD 快得多。因此,请务必让 Squid 进程拥有充足的内存,因为如果使用交换磁盘,系统性能会显著降低。
Squid 还会在主存储器中存储缓存对象引用和经常请求的对象,以加速对这些数据的检索。除此之外,Squid 还需在内存中保存其他数据,例如所有已处理 IP 地址的表格、精确的域名缓存、最常请求的对象、访问控制列表、缓冲区等等。
44.2.2 CPU #
Squid 已经过优化,最适合处理器内核较少的环境(4–8 个物理内核),这样每个内核都能提供高性能。提供虚拟核心的技术(如超线程)可能会降低性能。
要充分利用多个 CPU 内核,必须设置多个写入不同缓存设备的工作线程。默认情况下,多核心支持处于禁用状态。
44.2.3 磁盘缓存的大小 #
在小型缓存中,HIT
(在该处找到所请求的对象)的概率比较小,因为该缓存很容易就会填满,所以不常请求的对象会被较新的对象取代。例如,如果缓存的可用空间为 1 GB,而用户每天浏览所用的空间只有 10 MB,那么至少需要 100 多天才会占满缓存。
确定所需缓存大小的最简单的方法就是参考连接的最大传输速度。1 Mbit/s 连接的最大传输速度为 128 KB/s。如果所有流量都进入缓存,1 小时内累计可达到 460 MB。假设所有流量都是在 8 小时工作时间生成的,那么每天将达到 3.6 GB。由于连接速度一般不会达到流量上限,所以可以认为缓存处理的数据总量约为 2 GB。因此,在本示例中,Squid 需要 2 GB 的磁盘空间来保存一天内缓存的数据浏览量。
44.2.4 硬盘/SSD 体系结构 #
速度在缓存过程中起到重要作用,所以此要素值得特别关注。对于硬盘/SSD,此参数通过以毫秒度量的随机搜索时间或随机读取性能来描述。Squid 从硬盘/SSD 读取或写入其中的数据块一般都较小,因此硬盘/SSD 的搜索时间/读取性能比其数据吞吐量更重要。
如果要充当代理服务器,高转速硬盘或者 SSD 会是最好的选择。使用硬盘时,使用多个较小硬盘的效果可能更好,这样每个硬盘都有单独的缓存目录,可避免读取次数过多。
如果使用 RAID 系统,可以通过牺牲速度来提高可靠性。不过,出于性能原因,请避免使用(软件)RAID5 及类似设置。
在大多数情况下,使用何种文件系统并不重要。不过,使用挂载选项 noatime
可以提高性能 - Squid 会提供自己的时间戳,如此便不需要文件系统来跟踪访问时间。
44.3 Squid 的基本用法 #
由于 SUSE® Linux Enterprise Server 上默认未安装 squid
,请确保您的系统上已安装该软件包。
由于 SUSE Linux Enterprise Server 中已预先配置 Squid,因此安装该工具后便可立即将其启动。为避免启动过程中出现问题,请确保网络已连接到互联网,并且至少已配置一台名称服务器。使用设置了动态 DNS 配置的拨号连接可能会导致出现问题。在这种情况下,至少应指定名称服务器,因为如果 Squid 在 /var/run/netconfig/resolv.conf
中未检测到 DNS 服务器,便不会启动。
44.3.1 启动 Squid #
要启动 Squid,请运行以下命令:
>
sudo
systemctl start squid
要在系统引导时启动 Squid,请使用 systemctl enable squid
启用该服务。
44.3.2 检查 Squid 是否正在运行 #
通过以下几种方法可检查 Squid 是否正在运行:
使用
systemctl
:>
systemctl status squid
输出应该会指出 Squid 已
loaded
且处于active (running)
状态。使用 Squid 本身:
>
sudo
squid -k check | echo $?
输出应为
0
,但也可以包含其他消息,如警告。
要在本地系统上测试 Squid 的功能,请选择以下其中一种方式:
使用命令行工具
squidclient
,它可向 Web 请求输出响应,与wget
或curl
类似。与
wget
和curl
不同的是,squidclient
可自动连接到 Squid 的默认代理设置localhost:3128
。不过,如果您修改过 Squid 的配置,则必须相应地配置squidclient
。有关详细信息,请访问squidclient --help
。例 44.1︰ 通过squidclient
提交的请求 #>
squidclient http://www.example.org
HTTP/1.1 200 OK Cache-Control: max-age=604800 Content-Type: text/html Date: Fri, 22 Jun 2016 12:00:00 GMT Expires: Fri, 29 Jun 2016 12:00:00 GMT Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT Server: ECS (iad/182A) Vary: Accept-Encoding X-Cache: HIT x-ec-custom-error: 1 Content-Length: 1270 X-Cache: MISS from moon1 X-Cache-Lookup: MISS from moon:3128 Via: 1.1 moon (squid/3.5.16)2 Connection: close <!doctype html> <html> <head> <title>Example domain</title> [...] </body> </html>例 44.1 “通过
squidclient
提交的请求”中显示的输出由以下两部分组成:响应的协议报头(空白行前面的行)。
响应的实际内容(空白行后面的行)。
要校验是否使用了 Squid,请参见所选的报头行:
使用浏览器:将代理设置为
localhost
并将端口设置为3128
。然后加载页面,并在浏览器的 或开发人员工具的网络面板中检查响应报头。报头应该会以例 44.1 “通过squidclient
提交的请求”中所示的类似方式再现。
要允许用户从本地系统和其他系统访问 Squid 和互联网,需要将配置文件 /etc/squid/squid.conf
中的 http_access deny
all
项改为 http_access allow all
。但请注意,这样任何人都能完全不受限制地访问 Squid。因此,需定义可控制对代理服务器的访问权限的 ACL(访问控制列表)。修改配置文件后,必须重新加载或重启动 Squid。有关 ACL 的详细信息,请参见第 44.5.2 节 “访问控制选项”。
如果 Squid 运行较短时间后即停止,请检查名称服务器项是否有误,或者是否缺少 /var/run/netconfig/resolv.conf
文件。Squid 会在 /var/log/squid/cache.log
文件中记录启动失败的原因。
44.3.3 停止、重新加载和重启动 Squid #
使用以下两种方式可重新加载 Squid:
使用
systemctl
:>
sudo
systemctl
reload squid或
>
sudo
systemctl
restart squid使用 YaST:
在 Squid 模块中,单击
按钮。
要停止 Squid,请使用以下其中一种方式:
使用
systemctl
:>
sudo
systemctl
stop squid使用 YaST
在 Squid 模块中,单击
按钮.
关闭 Squid 可能需要一些时间,因为 Squid 会等待最长半分钟时间,来中断与客户端的连接,并将其数据写入磁盘(请参见 /etc/squid/squid.conf
中的 shutdown_lifetime
选项)。
使用 kill
或 killall
来终止 Squid 有可能会损坏缓存。要能够重启动 Squid,必须删除损坏的缓存。
44.3.4 去除 Squid #
从系统中去除 Squid 并不会去除缓存层次和日志文件。要去除这些数据,请手动删除 /var/cache/squid
目录。
44.3.5 本地 DNS 服务器 #
建立本地 DNS 服务器很有意义,即便并不用它来管理自己的域。在该情况下,它将充当仅供缓存的名称服务器,并且无需任何特殊配置即可通过根名称服务器解析 DNS 请求(请参见第 39.4 节 “启动 BIND 名称服务器”)。如何完成上述操作,取决于您在配置互联网连接的过程中是否选择了动态 DNS。
- 动态 DNS
通常,使用动态 DNS 时,服务提供方会在建立互联网连接时设置 DNS 服务器,并且本地文件
/var/run/netconfig/resolv.conf
会自动调整。可以在文件/etc/sysconfig/network/config
中使用NETCONFIG_DNS_POLICY
sysconfig 变量指定此行为。使用 YaST sysconfig 编辑器将NETCONFIG_DNS_POLICY
设置为""
。然后在
/var/run/netconfig/resolv.conf
文件中添加本地 DNS 服务器,并为localhost
指定 IP 地址127.0.0.1
。这样,Squid 每次一启动就能找到本地名称服务器。为了使提供方的名称服务器可供访问,请在配置文件
/etc/named.conf
中的forwarders
下指定该名称服务器及其 IP 地址。如果使用动态 DNS,则可在建立连接时自动完成此操作,只需将 sysconfig 变量NETCONFIG_DNS_POLICY
设置为auto
即可。- 静态 DNS
有了静态 DNS,在建立连接时自动 DNS 调整便不会发生,所以不需要更改任何 sysconfig 变量。但是,必须按动态 DNS 中所述在
/var/run/netconfig/resolv.conf
文件中指定本地 DNS 服务器。此外,还必须在/etc/named.conf
文件中的forwarders
下手动指定提供方的静态名称服务器及其 IP 地址。
如果防火墙在运行,请确保 DNS 请求能够通过防火墙。
44.4 YaST Squid 模块 #
YaST Squid 模块包含以下选项卡:
指定 Squid 的启动方式,以及在哪些接口上打开哪个防火墙端口。
定义 Squid 将用来侦听客户端 HTTP 请求的所有端口。
定义 Squid 如何处理缓存中的对象。
定义缓存内存、最大和最小对象大小等相关设置。
定义 Squid 将用来存储缓存交换文件的顶层目录。
通过 ACL 组控制对 Squid 服务器的访问。
定义访问和缓存路径、缓存存储日志文件,以及连接超时和客户端生命周期。
指定管理员的语言和邮件地址。
44.5 Squid 配置文件 #
Squid 代理服务器设置存储在 /etc/squid/squid.conf
文件中。虽然首次启动 Squid 不需要对文件进行任何更改,但是外部客户端最初会被拒绝访问。代理可供 localhost
使用。默认端口为 3128
.预装的配置文件 /etc/squid/squid.conf
提供了有关选项的详细信息和许多示例。
其中的许多项都已通过注释字符 #
禁用。行尾处提供了相关规范。给定值通常与默认值相关,因此仅去除注释符号而不更改任何参数通常没有什么影响。如果可能,请保留原始的注释行,在该行下方插入选项及修改过的值。这样,便可容易地恢复默认值,并将其与所作更改进行比较。
如果您是从较早的 Squid 版本更新,建议编辑新的 /etc/squid/squid.conf
,并只应用旧文件中所做的更改。
有时,该文件中会添加、去除或修改 Squid 选项。因此,如果尝试使用旧的 squid.conf
,Squid 可能会无法正常工作。
44.5.1 一般配置选项 #
下面列出了 Squid 的一些配置选项,但并不详尽。/etc/squid/squid.conf.documented
中列出了 Squid 软件包的完整选项列表,但仅做了简要说明。
http_port PORT
这是 Squid 侦听客户端请求所用的端口。默认端口为
3128
,但也常使用8080
。cache_peer HOST_NAME TYPE PROXY_PORT ICP_PORT
此选项允许创建能够协同工作的缓存网络。缓存对等是一台也托管了网络缓存并与您自己的计算机有某种关系的计算机。TYPE 指定关系的类型。类型可能是
parent
或sibling
。对于 HOST_NAME,请指定要使用的代理服务器的名称或 IP 地址。对于 PROXY_PORT,请指定浏览器中要使用的端口号(通常为
8080
)。请将 ICP_PORT 设置为7
,如果父层的 ICP 端口未知并且其用途与提供方无关,则设置为0
。要使 Squid 像 Web 浏览器而非代理服务器一样运行,请通过追加
default
和no-query
选项来禁用 ICP 协议。cache_mem SIZE
此选项定义 Squid 可为频率最高的答复使用的内存大小。默认值为
8 MB
。它不指定 Squid 的内存使用率,并且可能已经超过。cache_dir STORAGE_TYPE CACHE_DIRECTORY CACHE_SIZE LEVEL_1_DIRECTORIES LEVEL_2_DIRECTORIES
cache_dir
选项定义磁盘缓存的目录。在 SUSE Linux Enterprise Server 上的默认配置中,Squid 不会创建磁盘缓存。占位符 STORAGE_TYPE 可以是以下其中一个:
基于目录的存储类型:
ufs
、aufs
(默认值)、diskd
。这三种类型都是ufs
存储形式的变体。不过,虽然ufs
作为核心 Squid 线程的一部分运行,但aufs
是在单独的线程中运行,而diskd
则使用单独的进程。这表示后两种类型可避免因磁盘 I/O 而阻止 Squid。基于数据库的存储系统:
rock
。此存储格式依赖于单一数据库文件,其中每个对象占用一个或多个固定大小的内存单元(“槽”)。
下文只介绍基于
ufs
的存储类型的参数。rock
的参数不同。CACHE_DIRECTORY 是磁盘缓存的目录,默认为
/var/cache/squid
。CACHE_SIZE 是该目录的最大大小(以 MB 为单位),默认设置为 100 MB。请将其设置为可用磁盘空间的 50% 到最大 80% 之间的值。LEVEL_1_DIRECTORIES 和 LEVEL_2_DIRECTORIES 值指定应在 CACHE_DIRECTORY 中创建的子目录数量。默认情况下,在 CACHE_DIRECTORY 下的第一级会创建 16 个子目录,在其中的每个子目录下会创建 256 个子目录。提高这些值时应谨慎,因为创建过多的目录可能会导致性能问题。
如果有多个磁盘共享一个缓存,请指定数行
cache_dir
。cache_access_log LOG_FILE
,cache_log LOG_FILE
,cache_store_log LOG_FILE
这三个选项指定 Squid 记录其所有操作的路径。通常无需在这里进行任何更改。如果 Squid 负荷过重,则可能需要将缓存和日志文件分散到数个磁盘上。
client_netmask NETMASK
此选项允许通过应用子网掩码在日志文件中屏蔽客户端的 IP 地址。例如,要将 IP 地址的最后一位设置为
0
,请指定255.255.255.0
。ftp_user E-MAIL
此选项允许设置 Squid 应该用于匿名 FTP 登录的口令。请在此处指定有效的电子邮件地址,因为 FTP 服务器会检查这些信息来验证有效性。
cache_mgr E-MAIL
Squid 崩溃时会向指定的电子邮件地址发送消息。默认为 webmaster。
logfile_rotate VALUE
与
squid
、-k rotate
一起使用时,squid
会轮换日志文件。它会给文件编号,并且会在达到指定的值后覆盖最旧的文件。默认值为10
,即轮转编号为 0 到 9 的日志文件。不过,在 SUSE Linux Enterprise Server 上,日志文件的轮换是通过使用
logrotate
和配置文件/etc/logrotate.d/squid
自动执行的。append_domain DOMAIN
使用 append_domain 可指定当未指定域时自动追加的域。通常在此处指定您自己的域,因此将浏览器指向 www 将导航到您自己的 Web 服务器。
forwarded_for STATE
如果此选项设置为
on
,将会向报头添加如下所示的一行:X-Forwarded-For: 192.168.0.1
如果将此选项设置为
off
,Squid 会将客户端的 IP 地址和系统名称从 HTTP 请求中去除。negative_ttl TIME
,negative_dns_ttl TIME
如果配置了这些选项,Squid 会缓存某些类型的失败,例如
404
响应。之后,它会拒绝发出新请求,即使资源变为可用状态也不例外。默认情况下,
negative_ttl
设置为0
,negative_dns_ttl
设置为1 minutes
。这表示默认不会缓存 Web 请求的负响应,但会将 DNS 请求的负响应缓存 1 分钟。never_direct allow ACL_NAME
要防止 Squid 接受直接来自互联网的请求,可使用选项
never_direct
强制连接到另一个代理服务器。事先必须已在cache_peer
中指定该代理。如果将all
指定为 ACL_NAME,则所有请求都将直接转发给parent
。有时这可能是必要的,例如,您使用的提供商规定了其代理的使用方式或拒绝通过其防火墙直接访问互联网时。
44.5.2 访问控制选项 #
Squid 可通过访问控制列表 (ACL) 控制对代理服务器的访问。访问控制列表包含按顺序处理的规则。使用 ACL 之前必须先定义 ACL。Squid 包含默认 ACL,例如 all
和 localhost
。但要使 ACL 生效,它必须具有对应的 http_access
规则。
选项 acl
的语法如下所示:
acl ACL_NAME TYPE DATA
此语法中的占位符含义如下:
ACL_NAME 可以是任何名称。
对于 TYPE,请选择
/etc/squid/squid.conf
文件的ACCESS CONTROLS
部分提供的选项。指定什么 DATA 取决于相应的 ACL 类型(例如,主机名、IP 地址或 URL)。
要在 YaST Squid 模块中添加规则,请打开该模块,然后单击
选项卡。在“ACL 组”列表下单击 ,输入规则的名称、类型及其参数。有关 ACL 规则类型的详细信息,请参见 https://www.squid-cache.org/Versions/v3/3.5/cfgman/acl.html 上的 Squid 文档。
acl mysurfers srcdomain .example.com 1 acl teachers src 192.168.1.0/255.255.255.0 2 acl students src 192.168.7.0-192.168.9.0/255.255.255.0 3 acl lunch time MTWHF 12:00-15:00 4
- http_access allow ACL_NAME
http_access
定义谁可以使用代理服务器,以及谁能够访问互联网上的什么内容。您需要为此定义 ACL。上文中已经定义了localhost
和all
ACL,您可以通过deny
或allow
拒绝或允许访问它们。可以创建包含任意多个http_access
项的列表,并按从上到下的顺序处理这些项。根据哪项先发生,系统会允许或拒绝访问相应的 URL。最后一项应该一律为http_access deny all
。在下例中,localhost
可随意访问任何内容,而所有其他主机则被拒绝访问:http_access allow localhost http_access deny all
在另外一个使用这些规则的示例中,
teachers
组总能访问互联网。students
组只能在星期一到星期五的午餐时间访问:http_access deny localhost http_access allow teachers http_access allow students lunch time http_access deny all
为了提高可读性,请在配置文件
/etc/squid/squid.conf
中将所有http_access
选项都指定为一个块。url_rewrite_program PATH
使用此选项可指定 URL 重写程序。
auth_param basic program PATH
如果必须在代理服务器上对用户进行身份验证,请设置相应的程序,如
/usr/sbin/pam_auth
。用户首次访问pam_auth
时,系统会提示其提供用户名和口令。此外,您还需要一个 ACL,只让具有有效登录信息的客户端使用互联网:acl password proxy_auth REQUIRED http_access allow password http_access deny all
在
acl proxy_auth
选项中,使用REQUIRED
表示接受所有有效的用户名。REQUIRED
还可替换为允许的用户名列表。ident_lookup_access allow ACL_NAME
使用此选项可启用 ident 请求操作,以便为类型为
src
的 ACL 所定义的所有客户端确定各个用户的身份。要对所有客户端启用此选项,请使用预定义的 ACLall
作为 ACL_NAME。ident_lookup_access
指定的所有客户端都必须运行 ident 守护程序。在 Linux 上,您可以使用pidentd
(软件包 pidentd)作为 ident 守护程序。为确保只有 ident 查找成功的客户端才有权访问,请定义相应的 ACL:acl identhosts ident REQUIRED http_access allow identhosts http_access deny all
将
acl identhosts ident
选项设置为REQUIRED
可确保接受所有有效的用户名。REQUIRED
还可替换为允许的用户名列表。使用
ident
会延缓访问时间,因为对每个请求都要重复 ident 查找过程。
44.6 配置透明代理 #
透明代理会截获并回复 Web 浏览器的请求,因此 Web 浏览器可接收到所请求的页面,但并不知道它们来自何处。顾名思义,整个处理过程对用户而言是透明的。
使用代理服务器的标准方式如下:Web 浏览器向代理服务器的某端口发送请求,代理始终会提供要求的这些对象,而不论它们是否在其缓存中。不过,在以下情况下,使用 Squid 的透明代理模式很有效:
出于安全考虑,所有客户端都需要使用代理服务器来访问互联网。
所有客户端都必须使用代理服务器,无论客户端是否清楚这一点。
网络中的代理服务器已转移,但是现有客户端需要保留其原有配置。
在
/etc/squid/squid.conf
中,将transparent
参数添加到http_port
一行。此时应该有 2 行:http_port 3128⎄ http_port 3128 transparent
重启动 Squid:
>
sudo
systemctl restart squid
设置防火墙,以将 HTTP 流量重定向到
http_proxy
中指定的端口(在上例中为端口 3128)。然后重新加载防火墙配置。此操作假设已将区域internal
指派给您的 LAN 接口。>
sudo
firewall-cmd
--permanent --zone=internal \ --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=LAN_IP>
sudo
firewall-cmd
--permanent --zone=internal --add-port=3128/tcp>
sudo
firewall-cmd
--reload用您的 LAN 接口或 Squid 所侦听接口的 IP 地址替换 LAN_IP。
要确认是否一切正常,请检查
/var/log/squid/access.log
中的 Squid 日志文件。
44.7 使用 Squid 缓存管理器 CGI 接口 (cachemgr.cgi
) #
Squid 缓存管理器 CGI 接口 (cachemgr.cgi
) 是一个 CGI 实用程序,用于显示正运行的 Squid 进程所占用内存的相关统计信息。它还提供了在不登录服务器的情况下管理缓存和查看统计信息的便捷方式。
cachemgr.cgi
#确保 Apache Web 服务器正在系统上运行。按第 42 章 “Apache HTTP 服务器”中所示配置 Apache。请着重参见第 42.5 节 “启用 CGI 脚本”。要检查 Apache 是否已在运行,请使用:
>
sudo
systemctl status apache2
如果状态为
inactive
,请使用 SUSE Linux Enterprise Server 默认设置启动 Apache:>
sudo
systemctl start apache2
现在,在 Apache 中启用
cachemgr.cgi
。要执行此操作,请为ScriptAlias
创建一个配置文件。在目录
/etc/apache2/conf.d
中创建该文件并将其命名为cachemgr.conf
。在该文件中添加以下内容:ScriptAlias /squid/cgi-bin/ /usr/lib64/squid/ <Directory "/usr/lib64/squid/"> Options +ExecCGI AddHandler cgi-script .cgi Require host HOST_NAME </Directory>
将 HOST_NAME 替换为您要从中访问
cachemgr.cgi
的计算机的主机名。这样,只有您的计算机才能访问cachemgr.cgi
。要允许从任何位置访问该文件,请改为使用Require all granted
。如果 Squid 和 Apache Web 服务器在同一台计算机上运行,则不需要修改
/etc/squid/squid.conf
配置文件。但需校验该文件是否包含以下几行:http_access allow manager localhost http_access deny manager
其作用是让您仅可从您的计算机 (
localhost
) 访问管理器界面。如果 Squid 与 Apache Web 服务器在不同的计算机上运行,您需要添加额外的规则以允许从 CGI 脚本访问 Squid。定义服务器的 ACL(将 WEB_SERVER_IP 替换为 Web 服务器的 IP 地址):
acl webserver src WEB_SERVER_IP/255.255.255.255
确保以下规则都包含在配置文件中。请注意,顺序很重要。
http_access allow manager localhost http_access allow manager webserver http_access deny manager
(可选) (可选)您可以为
cachemgr.cgi
配置一个或多个口令。这样您还可以执行更多操作,例如远程关闭缓存或查看有关缓存的详细信息。要允许访问,请为选项cache_mgr
和cachemgr_passwd
配置管理器的一个或多个口令和允许的操作列表。下面的示例配置允许用户无需身份验证即可查看索引页、菜单和计数器的 60 分钟平均值。该配置还允许使用口令
secretpassword
切换脱机模式,以及禁用其他所有功能。cache_mgr user cachemgr_passwd none index menu 60min cachemgr_passwd secretpassword offline_toggle cachemgr_passwd disable all
cache_mgr
定义用户名。cache_mgr
定义使用哪个口令允许哪些操作。none
和disable
是特殊关键字:none
表示无需输入口令,disable
会完全禁用功能。登录
cachemgr.cgi
后便可全面查看完整的操作列表。要了解配置文件中需如何参照操作,请查看操作页面 URL 中&operation=
后面的字符串。all
是一个特殊关键字,表示所有操作。重新加载 Squid 和 Apache 以启用更改:
>
sudo
systemctl reload squid
要查看统计信息,请转到先前设置的
cachemgr.cgi
页。例如http://webserver.example.org/squid/cgi-bin/cachemgr.cgi
。选择正确的服务器。如果配置了用户名和口令,请指定这些信息。单击
并浏览可用的统计信息。
44.8 使用 Calamaris 生成缓存报告 #
Calamaris 是一个 Perl 脚本,用来生成缓存活动的 ASCII 或 HTML 格式报告。它可以处理 Squid 访问日志文件。此工具不属于 SUSE Linux Enterprise Server 默认安装范围 — 要使用它,请安装 calamaris
软件包。有关 Calamaris 的更多信息,请访问 https://cord.de/calamaris-english。
以 root
身份登录,然后输入:
#
cat access1.log [access2.log access3.log] | calamaris OPTIONS > reportfile
使用多个日志文件时,请确保这些文件按时间顺序排列,越早的文件越靠前。这可以通过以下两种方式来实现:如上例一样逐一列出文件,或使用 access{1..3}.log
。
calamaris
接受下列选项:
-a
输出所有可用报告
-w
以 HTML 格式输出报告
-l
在报告标题处包含消息或徽标
有关选项的其他信息,请查看该程序的手册页 (man
calamaris
)。
典型示例如下:
#
cat access.log.{10..1} access.log | calamaris -a -w \
> /usr/local/httpd/htdocs/Squid/squidreport.html
这会将报告保存到 Web 服务器的相应目录。需要通过 Apache 来查看这些报告。
44.9 更多信息 #
访问 Squid 的主页 https://www.squid-cache.org/。在此可找到“Squid 用户指南”及有关 Squid 的大量常见问题解答。
可在 https://www.squid-cache.org/Support/mailing-lists.html 上获得 Squid 邮件列表。