🔗 安装 Squid
如果您的操作系统有可用的二进制软件包,请通过它们安装,否则从源代码安装。
在编译 Squid 之后,您可以使用这个简单的命令进行安装。
% make install
如果您启用了 ICMP 或pinger,那么您还需要输入
% su
# make install-pinger
安装完成后,您需要阅读SquidFaq/ConfiguringSquid 来编辑和自定义 Squid,使其按照您期望的方式运行。
🔗 如何启动 Squid?
首先,您需要检查 Squid 的配置。Squid 的配置文件位于 /usr/local/squid/etc/squid.conf,其中包含了所有指令的文档。
在 Squid 分发版中有一个简短的 QUICKSTART 指南,指示您需要重点关注哪些指令以及原因。至少,您需要更改 http_access 配置以允许来自您客户端的访问。
要验证您的配置文件,您可以使用 -k parse 选项。
% /usr/local/squid/sbin/squid -k parse
如果此命令输出了任何错误,那么这些是语法错误或其他致命的配置错误,需要在继续之前进行更正。如果命令是静默的并立即返回命令提示符,则表示您的 squid.conf 在语法上是正确的,并且可以被 Squid 理解。
编辑完配置文件后,您就可以首次启动 Squid 了。具体步骤取决于您使用的版本。
首先,您必须创建交换目录。通过运行带有 -z 选项的 Squid 来完成此操作。
% /usr/local/squid/sbin/squid -z
如果您以 root 用户运行 Squid,则可能需要先创建 /usr/local/squid/var/logs 和您的 cache_dir 目录,并将它们的所有权分配给您的 squid.conf 中配置的 cache_effective_user。
一旦缓存目录创建完成,您就可以启动 Squid 并进行测试了。最好的方法可能是从终端运行它并观察调试输出。使用此命令:
% /usr/local/squid/sbin/squid -NCd1
如果一切正常,您将看到一行:
Ready to serve requests.
如果您想将 Squid 作为守护进程在后台运行,只需省略所有选项。
% /usr/local/squid/sbin/squid
根据您选择的 http_port,您可能需要以 root 用户身份启动 squid (如果 http_port <1024)。
🔗 如何在系统启动时自动启动 Squid?
🔗 手动启动
Squid 内置了重启功能。这大大简化了启动 Squid 的过程,意味着您无需使用 RunCache 或 inittab。最少,您只需要输入 Squid 可执行文件的路径。例如:
/usr/local/squid/sbin/squid
Squid 会自动在后台运行,然后生成一个子进程。在您的 syslog 消息文件中,您应该会看到类似以下内容:
Sep 23 23:55:58 kitty squid[14616]: Squid Parent: child process 14617 started
这意味着进程 ID 14563 是父进程,它监控着子进程 (pid 14617)。子进程负责所有工作。父进程只是等待子进程退出。如果子进程意外退出,父进程会自动启动另一个子进程。在这种情况下,syslog 会显示:
Sep 23 23:56:02 kitty squid[14616]: Squid Parent: child process 14617 exited with status 1
Sep 23 23:56:05 kitty squid[14616]: Squid Parent: child process 14619 started
如果出现问题,Squid 无法启动,父进程会在一段时间后放弃。您的 syslog 会显示:
Sep 23 23:56:12 kitty squid[14616]: Exiting due to repeated, frequent failures
发生这种情况时,您应该检查您的 syslog 消息和 cache.log 文件以获取错误消息。
当您查看进程 (ps 命令) 列表时,您会看到两个 squid 进程:
24353 ?? Ss 0:00.00 /usr/local/squid/bin/squid
24354 ?? R 0:03.39 (squid) (squid)
第一个是父进程,而名为 “(squid)” 的进程是子进程。请注意,如果您不小心杀死了父进程,子进程不会受到影响。
如果您想在终端中运行 Squid 并阻止其在后台运行和生成子进程,请使用 -N 命令行选项。
/usr/local/squid/bin/squid -N
🔗 从 inittab 启动
在具有 /etc/inittab 文件的系统上 (Digital Unix, 旧的 Solaris, IRIX, HP-UX, Linux),您可以添加一行如下:
sq:3:respawn:/usr/local/squid/sbin/squid.sh < /dev/null >> /tmp/squid.log 2>&1
我们建议使用 squid.sh shell 脚本,但您也可以直接调用 Squid 并使用 -N 选项以及您可能需要的其他选项。下方显示了一个示例 squid.sh 脚本:
C=/usr/local/squid
PATH=/usr/bin:$C/bin
TZ=PST8PDT
export PATH TZ
# User to notify on restarts
notify="root"
# Squid command line options
opts=""
cd $C
umask 022
sleep 10
while [ -f /var/run/nosquid ]; do
sleep 1
done
/usr/bin/tail -20 $C/logs/cache.log \
| Mail -s "Squid restart on `hostname` at `date`" $notify
exec bin/squid -N $opts
🔗 从 rc.local 启动
在类 BSD 系统上,您需要从“rc”文件中启动 Squid,通常是 /etc/rc.local。例如:
if [ -f /usr/local/squid/sbin/squid ]; then
echo -n ' Squid'
/usr/local/squid/sbin/squid
fi
🔗 从 init.d 启动
Squid 附带了一个 init.d 类型的启动脚本,位于 contrib/squid.rc,它适用于大多数 init.d 类型系统。或者,您可以使用您系统中的任何普通 init.d 脚本作为模板,并添加下面显示的 start/stop 片段来编写自己的脚本。
启动
/usr/local/squid/sbin/squid
停止
/usr/local/squid/sbin/squid -k shutdown
n=120
while /usr/local/squid/sbin/squid -k check && [ $n -gt 0 ]; do
sleep 1
echo -n .
n=`expr $n - 1`
done
🔗 使用 daemontools 启动
创建 squid 服务目录以及日志目录(如果尚不存在)。
mkdir -p /usr/local/squid/supervise/log /var/log/squid
chown squid /var/log/squid
然后,切换到服务目录,
cd /usr/local/squid/supervise
并创建 2 个可执行脚本:run
rm -f /var/run/squid/squid.pid
exec /usr/local/squid/sbin/squid -N 2>&1
和 log/run。
exec /usr/local/bin/multilog t /var/log/squid
最后,通过将其链接到 svscan 监控区域来启动 squid 服务。
cd /service
ln -s /usr/local/squid/supervise squid
Squid 应在 5 秒内启动。
🔗 从 SMF 启动
在新的 Solaris (10 及以上版本) 中,inittab/sysvinit 已弃用,推荐使用新的 SMF (Service Management Facility)。
为此,您需要创建一个 XML 格式的服务清单,如下所示:
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<!-- Manifest-file for Squid
-->
<service_bundle type='manifest' name='Squid'>
<service
name='network/squid'
type='service'
version='1'>
<create_default_instance enabled='false' />
<single_instance />
<dependency name='fs-local'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri
value='svc:/system/filesystem/local' />
</dependency>
<dependency name='net-loopback'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/network/loopback' />
</dependency>
<dependency name='net-physical'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/network/physical' />
</dependency>
<dependency name='utmp'
grouping='require_all'
restart_on='none'
type='service'>
<service_fmri value='svc:/system/utmp' />
</dependency>
<dependency name='squid_config_data'
grouping='require_all'
restart_on='refresh'
type='path'>
<service_fmri value='file:///usr/local/squid/etc/squid.conf' />
</dependency>
<exec_method
type='method'
name='start'
exec='/lib/svc/method/init.squid %m'
timeout_seconds='60'/>
<exec_method
type='method'
name='stop'
exec='/lib/svc/method/init.squid %m'
timeout_seconds='60' />
<exec_method
type='method'
name='refresh'
exec='/lib/svc/method/init.squid %m'
timeout_seconds='60' />
<exec_method
type='method'
name='restart'
exec='/lib/svc/method/init.squid %m'
timeout_seconds='60' />
<property_group name='general' type='framework'>
<!-- to start stop squid -->
<propval name='action_authorization' type='astring'
value='solaris.smf.manage' />
</property_group>
<stability value='Unstable' />
<template>
<common_name>
<loctext xml:lang='C'>
Squid proxy server
</loctext>
</common_name>
<documentation>
<manpage title='squid' section='8' manpath='/usr/local/squid/share/man/man8' />
</documentation>
</template>
</service>
</service_bundle>
然后将此文件放在 /var/svc/manifest/network 目录中,并执行命令:
svccfg import /var/svc/manifest/network/squid.xml
以 root 用户身份执行。然后创建一个类似 init 的脚本(命名为服务方法),并带有 start|stop|refresh|restart 的命令行参数,将其放入 /lib/svc/method,并执行命令:
svcadm enable squid
您可以在此处获取完整的 Squid SMF 脚本,其中包含在 Solaris 上运行它所需的一切:squid_autostart25.tar.gz
🔗 如何判断 Squid 是否正在运行?
您可以使用 squidclient 程序。
% squidclient http://www.netscape.com/ > test
还有其他命令行 HTTP 客户端程序可用。您可能会发现 wget 和 echoping 有用。
另一种方法是使用 Squid 本身来查看它是否可以向正在运行的 Squid 进程发出信号。
% squid -k check
然后检查 shell 的退出状态变量。
另外,请检查日志文件,最重要的是 access.log 和 cache.log 文件。
🔗 Squid 命令行选项
这些是命令行选项:
-a 为传入的 HTTP 请求指定备用端口号。对于在非标准端口上测试配置文件很有用。
-d “stderr”消息的调试级别。如果使用此选项,则指定级别以下的调试消息也将写入 stderr。
-f 指定一个备用的 squid.conf 文件,而不是编译到可执行文件中的路径名。
-h 打印用法和帮助消息。
-k reconfigure 发送一个 HUP 信号,导致 Squid 重新读取其配置文件。
-k rotate 发送一个 USR1 信号,导致 Squid 轮换其日志文件。注意,如果 logfile_rotate 设置为零,Squid 仍然会关闭并重新打开所有日志文件。
-k shutdown 发送一个 TERM 信号,导致 Squid 短暂等待当前连接完成然后退出。等待时间由 shutdown_lifetime 指定。
-k interrupt 发送一个 INT 信号,导致 Squid 立即关闭,而不等待当前连接。
-k kill 发送一个 KILL 信号,导致 Squid 进程立即退出,而不关闭任何连接或日志文件。仅在最后手段时使用。
-k debug 发送一个 USR2 信号,导致 Squid 生成完整的调试消息,直到收到下一个 USR2 信号为止。显然,这对于调试问题非常有帮助。
-k check 向 Squid 进程发送一个“ZERO”信号。这只是检查进程是否实际上正在运行。
-s 将调试消息(仅级别 0)发送到 syslog。
-u 为 ICP 消息指定备用端口号。对于在非标准端口上测试配置文件很有用。
-v 打印 Squid 版本。
-z 创建磁盘交换目录。首次安装 Squid 时,或者添加或修改 cache_dir 配置时,必须使用此选项。
-D 不进行初始 DNS 测试。通常,Squid 会查找一些知名的 DNS 主机名以确保您的 DNS 名称解析服务正常工作。
在 3.1 及更高版本中已废弃。
-F 如果 swap.state 日志干净,那么在提供任何请求之前,缓存会在“前台”重建。这将缩短重建缓存所需的时间,但在此期间将无法满足 HTTP 请求。
-N 不自动成为后台守护进程。
-R 不要在套接字上设置 SO_REUSEADDR 选项。
-X 在解析配置文件时启用完全调试。
-Y 在读取 swap.state 文件时,返回 ICP_OP_MISS_NOFETCH 而不是 ICP_OP_MISS。如果您的缓存主要由使用 ICP 的子缓存组成,这将允许您的缓存更快地重建。
🔗 如何查看 Squid 的工作原理?
- 检查日志目录中的 cache.log 文件。它在正常操作中记录有趣的信息,并且可以提升级别以显示所有不那么重要的细节。
- 安装并使用CacheManager。
🔗 Squid 能从 SMP 系统受益吗?
Squid 是一个单进程应用程序,无法利用 SMP。如果您希望 Squid 从 SMP 系统中受益,您将需要运行多个 Squid 实例,并找到一种方法将用户分配到不同的 Squid 实例,就像您有多个 Squid 服务器一样。
拥有两个 CPU 确实有利于在与代理相同的服务器上运行其他 CPU 密集型任务,例如,如果您有大量日志并且需要在高峰时段运行各种统计信息收集。
身份验证和组助手几乎不占用 CPU,并且从双 CPU 配置中受益不大。
🔗 使用独立的驱动器运行 Squid 是否可行?
是的。将 Squid 运行在与操作系统独立的驱动器上通常是一个非常好的主意。
通常,您希望优化 Squid 的寻道时间,或者更确切地说,是您的系统每秒可以支持的总寻道次数。这就是为什么最好将您的 cache_dir 分散到多个较小的磁盘上,而不是一个巨大的驱动器(尤其是 SCSI)。
如果您的系统非常受 I/O 限制,那么您将希望将操作系统和日志目录都运行在独立的驱动器上。
🔗 在 Squid 上使用 RAID 是否可行?
请参阅RAID章节。
🔗 在 Squid 上使用 ZFS 是否可行?
是的。在支持原生 ZFS 的系统(如 Solaris 或OpenIndiana)上运行 Squid 是众所周知的实践。
总的来说,只需设置 ZFS 镜像(通常与每个驱动器的独立控制器配合效果最好),并将 recordsize 设置为 4-64k(取决于您偏好的 cache_replacement_policy)。此外,为了获得更好的磁盘 I/O 性能,可以考虑将 primarycache 设置为 metadata,secondarycache 设置为 none,并在 cache_dir 文件系统上将 atime 设置为 off。考虑为 Squid 缓存存储所在的 zfs 文件系统正确设置 logbias 属性。此属性的默认值是 latency,这对于软件 ZFS 阵列/镜像来说是合适的。当 ZFS 工作在硬件 RAID5/10 上时,将此属性设置为 throughput 以避免大量 TCP_SWAPFAIL_MISS。在系统层面,将 ZFS ARC 大小限制为 RAM 的 1/8-1/4 是个好主意,方法是设置 zfs:zfs_arc_max。
ZFS 可以很好地与 diskd 和 aufs Squid storeIO 模块配合使用(具体选择取决于您的服务器/存储架构)。
回到 FAQ 索引
导航: 网站搜索、网站页面、分类、🔼 向上