36 Squid 缓存代理服务器 #
Squid 是广泛用于 Linux 和 UNIX 平台的缓存代理服务器。这表示它会将请求的互联网对象(例如 Web 或 FTP 服务器上的数据)储存在离请求工作站更近(与服务器相比)的计算机上。可以在多个层次中设置它,以确保即使在对最终用户来说是透明的模式下,也能达到最佳的响应速度和较低的带宽用量。
Squid 充当缓存代理服务器。它将来自客户端(这里指来自 Web 浏览器)的对象请求重定向至服务器。当服务器回复所请求的对象后,它会将这些对象传递给客户端并在硬盘缓存中保存对象副本。缓存的其中一个优点是,当多个客户端请求同一对象时,可以从硬盘缓存提供该对象。这样客户端接收数据的速度要比从互联网接收快得多。此过程还可以减少网络流量。
除实际的缓存外,Squid 还提供众多其他功能:
在代理服务器的互通层次之间分配负载
为所有访问代理服务器的客户端定义严格的访问控制列表
允许或拒绝使用其他应用程序访问特定网页
生成有关频繁访问的网页的统计数字以评估用户的浏览习惯
Squid 不是通用的代理服务器。通常只充当 HTTP 连接的代理。它支持 FTP、Gopher、SSL 和 WAIS 协议,但不支持其他互联网协议,如新闻协议或视频会议协议。由于 Squid 只支持将 UDP 协议用于在不同的缓存间提供通讯功能,因此很多多媒体程序都不受支持。
36.1 一些有关代理服务器的信息 #
作为缓存代理服务器,Squid 有几种使用方式。与防火墙结合使用时,能够提高安全性。可以一起使用多个代理。还能确定应该缓存的对象的类型以及缓存的时间。
36.1.1 Squid 和安全性 #
可将 Squid 与防火墙结合使用,来防止内部网络遭受外部攻击。防火墙会拒绝 Squid 之外的所有客户端对外部服务的访问。所有 Web 连接必须通过代理服务器建立。经过此配置后,Squid 便可全面控制 Web 访问。
如果防火墙配置中包含某个隔离区域 (DMZ),代理服务器应在此区域内操作。第 36.6 节 “配置透明代理”介绍如何实施透明代理。如此可简化客户端的配置,因为在这种情况下,它们不需要有关代理服务器的任何信息。
36.1.2 多个缓存 #
可以配置 Squid 的几个实例从而在它们之间交换对象。这样会降低系统总负载,提高从本地网络检索对象的几率。还可以配置缓存层次,以便缓存能够将对象请求转发给同级缓存或父缓存,如此其便可从本地网络中的其他缓存或直接从数据源请求对象。
为了不给网络增加总体数据流量,为缓存层次选择适当的拓扑结构是十分重要的。对于超大型网络,合理的做法是:为每个子网配置一个代理服务器并将其连接到父代理服务器,再通过父代理服务器连接到 ISP 的缓存代理服务器。
所有这些通讯都通过在 UDP 协议之上运行的 ICP(互联网缓存协议)来处理。缓存间的数据传送使用基于 TCP 的 HTTP(超文本传送协议)来处理。
为了找到最适合向其请求对象的服务器,一个缓存会向所有同级代理发送 ICP 请求。同级代理会通过 ICP 响应回复这些请求。如果检测到对象,它们会使用代码 HIT
,若未检测到,则会使用 MISS
。
如果发现多个 HIT
响应,代理服务器会根据哪个缓存发送回复的速度最快或哪个服务器较近等因素决定从哪个服务器下载。如果没有收到满意的响应,该请求会发送至父缓存。
为了避免网络中不同缓存中的对象重复,还会使用其他 ICP 协议,如 CARP(缓存阵列路由协议)或 HTCP(超文本缓存协议)。网络中维护的对象越多,找到所需对象的可能性就越大。
36.1.3 缓存互联网对象 #
网络中提供的许多对象都不是静态的,例如动态生成的页面和 TLS/SSL 加密内容。由于每次访问这类对象时它们都会更改,所以它们不会被缓存。
为确定对象应保留在缓存中的期限,系统会为对象指派多个状态中的一种。Web 和代理服务器会通过为这些对象添加报头来找出对象的状态(如“Last modified”或“Expires”)以及相应的日期。也可以使用指定不能缓存的对象的其他报头。
缓存中的对象通常会因缺少可用磁盘空间而通过 LRU(最近最少使用)之类的算法进行替换。这意味着代理会删除未被请求时间最长的对象。
36.2 系统要求 #
系统要求主要取决于系统必须承受的最大网络负载。由于负载在高峰期间可能是日均值的四倍以上,因此需要检查负载峰值。如果不能确定,请将系统要求稍微高估一点。让 Squid 在濒临其处理能力上限的状态下工作可能会严重影响其服务质量。以下几节按重要程度依次阐述了各个系统要素:
RAM 大小
CPU 速度/物理 CPU 内核
磁盘缓存的大小
硬盘/SSD 及其体系结构
36.2.1 RAM #
Squid 所需内存 (RAM) 大小与缓存中的对象数有直接的关系。随机存取内存比硬盘/SSD 快得多。因此,请务必让 Squid 进程拥有充足的内存,因为如果使用交换磁盘,系统性能会显著降低。
Squid 还会在主储存器中储存缓存对象引用和经常请求的对象,以加速对这些数据的检索。除此之外,Squid 还要在内存中保存其他数据,如:所有已处理 IP 地址的表、准确域名缓存、最常请求的对象、访问控制列表、缓冲区等等。
36.2.2 CPU #
Squid 已经过优化,最适合处理器内核较少的环境(4–8 个物理内核),这样每个内核都能提供高性能。提供虚拟核心的技术(如超线程)可能会降低性能。
要充分利用多个 CPU 内核,必须设置多个写入不同缓存设备的工作线程。默认情况下,多核心支持通常都是禁用的。
36.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 的磁盘空间来保存一天内缓存的数据浏览量。
36.2.4 硬盘/SSD 体系结构 #
速度在缓存过程中起到重要作用,所以此要素值得特别关注。对于硬盘/SSD,此参数通过以毫秒度量的随机搜索时间或随机读取性能来描述。Squid 从硬盘/SSD 读取或写入其中的数据块一般都较小,因此硬盘/SSD 的搜索时间/读取性能比其数据吞吐量更重要。
如果要充当代理服务器,高转速硬盘或者 SSD 会是最好的选择。使用硬盘时,使用多个较小硬盘的效果可能更好,这样每个硬盘都有单独的缓存目录,可避免读取次数过多。
如果使用 RAID 系统,可以通过牺牲速度来提高可靠性。不过,出于性能原因,请避免使用(软件)RAID5 及类似设置。
文件系统的选择通常无关紧要。不过,使用挂载选项 noatime
可以提高性能 - Squid 提供其自己的时间戳,如此便不需要文件系统来跟踪访问时间。
36.3 Squid 的基本用法 #
如果尚未安装,请安装软件包 squid 。SUSE® Linux Enterprise Server
上默认不会安装 squid 软件包。
Squid 已在 SUSE Linux Enterprise Server 中预先配置好,因此安装完后即可直接启动。为保证顺利启动,应该对网络进行配置,使其至少能连接一个名称服务器和互联网。如果拨号连接使用动态 DNS 配置,则可能出现问题。在这种情况下,至少应该指定名称服务器,因为如果在 /var/run/netconfig/resolv.conf
中未检测到 DNS 服务器,Squid 便不会启动。
36.3.1 启动 Squid #
要启动 Squid,请使用:
tux >
sudo
systemctl start squid
如果您希望 Squid 在系统引导时启动,请使用 systemctl enable squid
启用该服务。
36.3.2 检查 Squid 是否正在运行 #
要检查 Squid 是否在运行,请选择以下其中一种方法:
使用
systemctl
:tux >
systemctl status squid
此命令的输出应指出 Squid
已装载
且处于活动状态(运行中)
。使用 Squid 本身:
tux >
sudo
squid -k check | echo $?
此命令的输出应当为
0
,但也可能包含其他警告或消息。
要测试 Squid 在本地系统上的功能,请选择以下其中一种方法:
要进行测试,您可以使用命令行工具
squidclient
,它可向 Web 请求输出响应,类似于wget
或curl
。与这些工具不同的是,
squidclient
将自动连接到 Squid 的默认代理设置localhost:3128
。不过,如果您更改过 Squid 的配置,则需要通过命令行选项将squidclient
配置为使用不同的设置。有关详细信息,请参见squidclient --help
。例 36.1︰ 通过squidclient
提交的请求 #tux >
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>例 36.1 “通过
squidclient
提交的请求”中显示的输出可分成两个部分:响应的协议报头:空白行前面的行。
响应的实际内容:空白行后面的行。
要校验是否使用了 Squid,请参见所选的报头行:
使用浏览器:将代理设置为
localhost
并将端口设置为3128
。然后您可以装载页面,并在浏览器的检查器或开发人员工具的 面板中检查响应报头。报头应该会以例 36.1 “通过squidclient
提交的请求”中所示的类似方式再现。
要允许用户从本地系统和其他系统访问 Squid 和互联网,需要将配置文件 /etc/squid/squid.conf
中的项 http_access deny all
改为 http_access allow all
。但在这样做时,要考虑到此操作会让所有人都不受任何限制地访问 Squid。因此,需定义可控制对代理服务器的访问权限的 ACL(访问控制列表)。修改配置文件后,必须重新装载或重启动 Squid。有关 ACL 的详细信息,请参见第 36.5.2 节 “访问控制选项”。
如果 Squid 在成功启动后不久就退出,请检查名称服务器项是否有误,或者是否缺少 /var/run/netconfig/resolv.conf
文件。Squid 会在 /var/log/squid/cache.log
文件中记录启动失败的原因。
36.3.3 停止、重新装载和重启动 Squid #
要重新装载 Squid,请选择以下其中一种方法:
使用
systemctl
:tux >
sudo
systemctl
reload squid或
tux >
sudo
systemctl
restart squid使用 YaST:
在 Squid 模块中,单击
按钮。
要停止 Squid,请选择以下其中一种方法:
使用
systemctl
:tux >
sudo
systemctl
stop squid使用 YaST
在 Squid 模块中,单击
按钮.
关闭 Squid 可能需要一些时间,因为 Squid 会等待最长半分钟时间,来中断与客户端的连接并将其数据写入磁盘(请参见 /etc/squid/squid.conf
中的 shutdown_lifetime
选项)。
使用 kill
或 killall
终止 Squid 可能会损坏缓存。要能够重启动 Squid,必须删除损坏的缓存。
36.3.4 去除 Squid #
从系统中去除 Squid 并不会去除缓存层次和日志文件。要删除这些内容,请手动删除 /var/cache/squid
目录。
36.3.5 本地 DNS 服务器 #
建立本地 DNS 服务器很有意义,即便并不用它来管理自己的域。它仅起到缓存专用名称服务器的作用,并且可以在无需任何特殊配置的情况下通过 root 名称服务器解析 DNS 请求(请参见 第 31.4 节 “启动 BIND 名称服务器”)。如何完成上述操作,取决于您在配置互联网连接的过程中是否选择了动态 DNS。
- 动态 DNS
使用动态 DNS 时,互联网服务提供商通常在建立互联网连接过程中设置 DNS 服务器,并自动调整本地文件
/var/run/netconfig/resolv.conf
。可以在文件/etc/sysconfig/network/config
中使用以下 sysconfig 变量控制此行为:NETCONFIG_DNS_POLICY
。设置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 请求能够通过。
36.4 YaST Squid 模块 #
YaST Squid 模块包含以下选项卡:
指定启动 Squid 的方式,以及在哪些接口上打开哪个防火墙端口。
定义 Squid 将用来侦听客户端 HTTP 请求的端口。
定义 Squid 如何处理缓存中的对象。
定义有关缓存内存、最大和最小对象大小等的设置。
定义 Squid 将用来储存所有缓存交换文件的顶层目录。
通过 ACL 组控制对 Squid 服务器的访问。
定义用于访问、缓存和缓存储存日志文件的路径,以及连接超时和客户端有效期。
设置管理员的语言和电子邮件地址。
36.5 Squid 配置文件 #
所有 Squid 代理服务器设置都在 /etc/squid/squid.conf
文件中进行。首次启动 Squid 时,不必在此文件中进行任何更改,但是外部客户端最初不具备访问权。代理可供 localhost
使用。默认端口为 3128
。预装的配置文件 /etc/squid/squid.conf
提供了有关选项的详细信息和许多示例。
许多条目都已注释掉,因此以注释字符 #
开头。行尾处提供了相关规范。给定值通常与默认值相关,因此仅去除注释符号而不更改任何参数通常没有什么影响。如果可能,请保留原始的注释行,在该行下方插入选项及修改过的值。这样,便可容易地恢复默认值,并将其与所作更改进行比较。
如果已从较早的 Squid 版本更新,建议编辑新的 /etc/squid/squid.conf
,并只应用以前文件中的更改。
有时,该文件中会添加、去除或修改 Squid 选项。因此,如果尝试使用旧的 squid.conf
,Squid 可能会无法正常工作。
36.5.1 一般配置选项 #
下面列出了 Squid 的一些配置选项,但并不详尽。/etc/squid/squid.conf.documented
中列出了 Squid 包的完整选项列表,其中仅做了简要记录。
http_port 端口
这是 Squid 侦听客户端请求所用的端口。默认端口为
3128
,但也常使用8080
。cache_peer 主机名 类型 代理端口 ICP 端口
此选项允许创建能够协同工作的缓存网络。缓存对等是一台也托管了网络缓存并与您自己的计算机有某种关系的计算机。类型指定关系的类型。类型可以是
parent
或sibling
。对于 HOST_NAME,请指定要使用的代理服务器的名称或 IP 地址。对于代理端口,请指定浏览器中要使用的端口号(通常为
8080
)。请将 ICP 端口设置为7
,如果父代理的 ICP 端口未知并且该端口的使用与提供商无关,则设置为0
。要让 Squid 以 Web 浏览器而非代理服务器的方式工作,请禁止使用 ICP 协议。您可以通过追加
default
和no-query
选项来实现此目的。cache_mem 大小
此选项定义 Squid 可用于常用答复的内存大小。默认为
8 MB
。它不指定 Squid 的内存使用率,并且可能已经超过。cache_dir 储存类型 缓存目录 缓存大小 1 级目录 2 级目录
cache_dir
选项定义磁盘缓存的目录。在 SUSE Linux Enterprise Server 上的默认配置中,Squid 不会创建磁盘缓存。占位符储存类型可以是以下其中一个:
基于目录的储存类型:
ufs
、aufs
(默认值)、diskd
。这三种类型都是ufs
储存形式的变体。不过,虽然ufs
作为核心 Squid 线程的一部分运行,但aufs
是在单独的线程中运行,而diskd
则使用单独的进程。这表示后两种类型可避免因磁盘 I/O 而阻止 Squid。基于数据库的储存系统:
rock
。此储存格式依赖于单一数据库文件,其中每个对象占用一个或多个固定大小的内存单元(“槽”)。
下文将只介绍基于
ufs
的储存类型的参数。rock
的参数有些不同。缓存目录是磁盘缓存的目录,默认为
/var/cache/squid
。缓存大小是该目录的最大大小(以兆字节为单位),默认设置为 100 MB。请将其设置为可用磁盘空间的 50% 到最大 80% 之间的值。最后两个值(1 级目录和 2 级目录)指定缓存目录中创建的子目录数量。默认情况下,在缓存目录下的第一级会创建 16 个子目录,在其中的每个子目录下创建 256 个子目录。提高这些值时应谨慎,因为创建过多的目录可能会导致性能问题。
如果有多个磁盘共享一个缓存,请指定数行
cache_dir
。cache_access_log 日志文件
,cache_log 日志文件
,cache_store_log 日志文件
这三个选项指定 Squid 记录其所有操作的路径。通常无需在这里进行任何更改。如果 Squid 负担过重,则可能需要将缓存和日志文件分散到多个磁盘上。
client_netmask 网络掩码
此选项允许通过应用子网掩码在日志文件中屏蔽客户端的 IP 地址。例如,要将 IP 地址的最后一位设置为
0
,请指定255.255.255.0
。ftp_user 电子邮件
此选项允许设置 Squid 应该用于匿名 FTP 登录的口令。请在此处指定有效的电子邮件地址,因为有些 FTP 服务器会检查这些信息来验证有效性。
cache_mgr 电子邮件
如果 Squid 意外崩溃,将会向此电子邮件地址发送一封邮件。默认为 webmaster。
logfile_rotate 值
如果您运行
squid
-k rotate
,squid
可以轮转日志文件。在此过程中会给文件编号,并且在达到指定值后重写最旧的文件。默认值为10
,即轮转编号为 0 到 9 的日志文件。不过,在 SUSE Linux Enterprise Server 上,日志文件的轮转是通过使用
logrotate
和配置文件/etc/logrotate.d/squid
自动执行的。append_domain 域
使用 append_domain 可指定当未指定域时自动追加的域。通常在此处指定您自己的域,因此在浏览器中指定 www 将访问您自己的 Web 服务器。
forwarded_for 状态
如果此选项设置为
on
,将会向报头添加如下所示的一行:X-Forwarded-For: 192.168.0.1
如果将此选项设置为
off
,Squid 会将客户端的 IP 地址和系统名称从 HTTP 请求中去除。negative_ttl 时间
,negative_dns_ttl 时间
如果设置了这些选项,Squid 将会缓存某些类型的失败,例如
404
响应。以后,它将拒绝发出新请求,即使当时资源可用。默认情况下,
negative_ttl
设置为0
,negative_dns_ttl
设置为1 minute
。这表示默认不会缓存 Web 请求的负响应,但会将 DNS 请求的负响应缓存 1 分钟。never_direct allow ACL 名称
为防止 Squid 接受直接来自互联网的请求,可使用选项
never_direct
强制连接连到另一个代理服务器。事先必须已在cache_peer
中指定该代理。如果将 ACL 名称指定为all
,则所有请求都将直接转发给父代理
。有时这可能是必要的,例如,您使用的提供商规定了其代理的使用方式或拒绝通过其防火墙直接访问互联网时。
36.5.2 访问控制选项 #
Squid 为控制针对代理服务器的访问提供了一套周密的系统。这些访问控制列表 (ACL) 都是包含按顺序处理的规则的列表。使用 ACL 之前必须先定义 ACL。一些默认的 ACL 已经存在,如 all
和 localhost
。但是,仅仅定义 ACL 并不意味着实际应用 ACL。只有存在相应的 http_acces
规则时,才会应用。
选项 acl
的语法如下所示:
acl ACL_NAME TYPE DATA
此语法中的占位符含义如下:
名称 ACL_NAME 可以任意选择。
对于 TYPE,
/etc/squid/squid.conf
文件的ACCESS CONTROLS
部分提供了多个不同的选项,您可以从中加以选择。DATA 的规格取决于单个 ACL 类型(例如主机名、IP 地址或 URL),也可以从文件中读取。
要在 YaST Squid 模块中添加规则,请打开该模块,然后单击
选项卡。在“ACL 组”列表下单击 ,输入规则的名称、类型及其参数。有关 ACL 规则类型的详细信息,请参见 http://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 名称
http_access
定义谁可以使用代理服务器,以及谁能够访问互联网上的什么内容。对于此选项,必须定义 ACL。上文中已经定义了localhost
和all
,您可以通过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 路径
使用此选项可以指定 URL 重写程序。
auth_param basic program 路径
如果必须在代理服务器上对用户进行身份验证,请设置一个相应的程序,如
/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 名称
使用此选项,可以运行 ident 请求,以便为类型为
src
的 ACL 定义的所有客户端确定各个用户的身份。或者,可对所有客户端使用此选项,至于 ACL 名称,则应用预定义的 ACLall
。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 查找过程。
36.6 配置透明代理 #
透明代理会截获并回复 Web 浏览器的请求,因此 Web 浏览器可接收到所请求的页面,但并不知道它们来自何处。顾名思义,整个处理过程对用户而言是透明的。
使用代理服务器的一般方式如下:Web 浏览器向代理服务器的某端口发送请求,代理始终会提供要求的这些对象,而不论它们是否在其缓存中。不过,在某些情况下,Squid 的透明代理模式很有效:
如果出于安全考虑,建议所有客户端都使用代理服务器来浏览互联网。
如果所有客户端都必须使用代理服务器,无论客户端是否清楚这一点。
如果网络中的代理服务器已转移,但是现有客户端需要保留其原有配置。
在
/etc/squid/squid.conf
的选项http_port
所在行中添加参数transparent
。此时应该有 2 行:http_port 3128 http_port 3128 transparent
重启动 Squid:
tux >
sudo
systemctl restart squid
设置防火墙,将 HTTP 通讯重定向至在
http_proxy
中指定的端口。在上例中为端口 3128。然后重新装载防火墙配置。此操作假设已将区域internal
指派给您的 LAN 接口。tux >
sudo
firewall-cmd
--permanent --zone=internal \ --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=LAN_IPtux >
sudo
firewall-cmd
--permanent --zone=internal --add-port=3128/tcptux >
sudo
firewall-cmd
--reload用您的 LAN 接口或 Squid 所侦听接口的 IP 地址替换 LAN_IP。
要确认是否一切正常,请检查
/var/log/squid/access.log
中的 Squid 日志文件。
36.7 使用 Squid 缓存管理器 CGI 接口 (cachemgr.cgi
) #
Squid 缓存管理器 CGI 接口 (cachemgr.cgi
) 是一个 CGI 实用程序,用于显示正运行的 Squid 进程所占用内存的相关统计数字。这也是在不登录服务器的情况下,管理缓存和查看统计数字的一种便捷方式。
cachemgr.cgi
#确保 Apache Web 服务器正在系统上运行。按第 34 章 “Apache HTTP 服务器”中所示配置 Apache。请着重参见第 34.5 节 “启用 CGI 脚本”。要检查 Apache 是否已在运行,请使用:
tux >
sudo
systemctl status apache2
如果显示
inactive
,您可以使用 SUSE Linux Enterprise Server 默认设置启动 Apache:tux >
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
进行任何更改。但需校验/etc/squid/squid.conf
是否包含以下几行:http_access allow manager localhost http_access deny manager
这几行允许您从您自己的计算机 (
localhost
) 访问管理器界面,但不允许从其他位置访问。如果 Squid 与 Apache Web 服务器在不同的计算机上运行,您需要添加额外的规则以允许从 Squid 的 CGI 脚本访问。定义服务器的 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:
tux >
sudo
systemctl reload squid
要查看统计数字,请转到先前设置的
cachemgr.cgi
页。例如http://webserver.example.org/squid/cgi-bin/cachemgr.cgi
。选择正确的服务器,如已设置,请指定用户名和口令。然后单击
浏览不同的统计数字。
36.8 使用 Calamaris 生成缓存报告 #
Calamaris 是一个 Perl 脚本,用来以 ASCII 或 HTML 格式生成缓存活动的报告。它可以处理本机 Squid 访问日志文件。Calamaris 的主页为 http://cord.de/calamaris-english。此工具不属于 SUSE Linux Enterprise Server 默认安装范围 — 要使用它,请安装 calamaris
软件包。
以 root
身份登录,然后输入:
root #
cat access1.log [access2.log access3.log] | calamaris OPTIONS > reportfile
使用多个日志文件时,请确保这些文件按时间顺序排列,较早的文件列在前面。这可以通过以下两种方式来实现:如上例一样逐个列出文件,或使用 access{1..3}.log
。
calamaris
可使用以下选项:
-a
输出所有可用报告
-w
以 HTML 格式输出报告
-l
在报告标题处包含消息或徽标
有关不同选项的详细信息,可通过 man
calamaris
在该程序的手册页中找到。
典型示例如下:
root #
cat access.log.{10..1} access.log | calamaris -a -w \
> /usr/local/httpd/htdocs/Squid/squidreport.html
这会将报告放入 Web 服务器目录。需要通过 Apache 来查看这些报告。
36.9 更多信息 #
访问 Squid 的主页 http://www.squid-cache.org/。在此可找到 “Squid 用户指南”及有关 Squid 的大量 FAQ(常见问题解答)信息。
此外还通过 http://www.squid-cache.org/Support/mailing-lists.html 提供 Squid 的邮件列表。