[i=s] 本帖最后由 gary168 于 2009-3-25 20:00 编辑 [/i]
ocal/squid/var/cache
2003/09/29 12:57:52| Loaded Icons.
2003/09/29 12:57:52| Accepting HTTP connections at 0.0.0.0, port 3128, FD 11.
2003/09/29 12:57:52| Accepting ICP messages at 0.0.0.0, port 3130, FD 12.
2003/09/29 12:57:52| WCCP Disabled.
2003/09/29 12:57:52| Ready to serve reques
假如你看到错误消息,你该首先修正它。请检查输出信息的开始几行以发现警告信息。最普通的错误是文件/目录许可问题,和配置文件语法错误。假如你看到一条不引起注意的错误消息,请见16 章中关于squid 故障处理的建议和信息。如果还不行,请检查squid FAQ,或查找邮件列表来获得解释。
一旦你见到"Ready to serve requests"消息,就可用一些HTTP 请求来测试squid。配置你的浏览器使用squid 作为代理,然后打开某个web 页面。假如squid 工作正常,页面被迅速载入,就象没使用squid 一样。另外,你可以使用squidclient 程序,它随squid 发布:
% squidclient http://www.squid-cache.org/
假如它正常工作,squid 的主页html 文件会在你的终端窗口里滚动。一旦确认squid 工作正常,你能中断squid 进程(例如使用ctrl-c)并且在后台运行squid。
5.5 将squid 作为服务进程运行
正常情况下你想将squid 以后台进程运行(不出现在终端窗口里)。最容易的方法是简单执行如下命令:
%squid -s
-s 选项导致squid 将重要的状态和警告信息写到syslogd。squid 使用LOCAL4 设备,和LOG_WARNING 和LOG_NOTICE 优先权。syslog 进程实际可能会或不会记录squid 的消息,这依赖于它被如何配置。同样的消息被写进cache.log 文件,所以假如你愿意,忽略-s 选项也是安全的。
当你不使用-N 选项来启动squid,squid 自动在后台运行并且创建父/子进程对。子进程做所有的实际工作。父进程确认子进程总在运行。这样,假如子进程意外终止,父进程启动另外一个子进程以使squid 正常工作。通过观察syslog 消息,你能看到父/子进程交互作用。
Jul 31 14:58:35 zapp squid[294]: Squid Parent: child process 296 started
这里显示的父进程ID 是294,子进程是296。当你查看ps 的输出,你可以看到子进程以(squid)形式出现:
%ps ax | grep squid
294 ?? Is 0:00.01 squid -sD
296 ?? S 0:00.27 (squid) -sD (squid)
假如squid 进程意外终止,父进程启动另一个。例如:
Jul 31 15:02:53 zapp squid[294]: Squid Parent: child process 296 exited due to signal 6
Jul 31 15:02:56 zapp squid[294]: Squid Parent: child process 359 started
在某些情形下,squid 子进程可能立即终止。为了防止频繁的启动子进程,假如子进程连续5 次没有运行至少10 秒钟,父进程会放弃。
Jul 31 15:13:48 zapp squid[455]: Squid Parent: child process 474 exited with status 1
Jul 31 15:13:48 zapp squid[455]: Exiting due to repeated, frequent failures
如果发生这样的事,请检查syslog 和squid 的cache.log 以发现错误。
5.5.1 squid_start 脚本
当squid 以后台进程运行时,它查找squid 执行程序目录下的名为squid_start 的文件。假如发现,该程序在父进程创建子进程之前被执行。你能使用该脚本完成特定的管理任务,例如通知某人squid 在运行,管理日志文件等。除非squid_start 程序存在,squid 不会创建子进程。
squid_start 脚本在你使用绝对或相对路径启动squid 时才开始工作。换句话说,squid 不使用PATH 环境变量来定位squid_start.这样,你应该养成习惯这样启动squid:
% /usr/local/squid/sbin/squid -sD
而不要这样:
%squid -sD
5.6 启动脚本
通常你希望squid 在每次计算机重启后自动启动。对不同的操作系统,它们的启动脚本如何工作也很不同。我在这里描述一些通用的环境,但对你自己的特殊操作系统,也许该有特殊的处理方法。
5.6.1 /etc/rc.local
最容易的机制之一是/etc/rc.local 脚本。这是个简单的shell 脚本,在每次系统启动时以root 运行。使用该脚本来启动squid 非常容易,增加一行如下:
/usr/local/squid/sbin/squid -s
当然你的安装位置可能不同,还有你可能要使用其他命令行选项。不要在这里使用-N选项。
假如因为某些理由,你没有使用cache_effective_user 指令,你可以尝试使用su 来让squid以非root 用户运行:
/usr/bin/su nobody -c '/usr/local/squid/sbin/squid -s'
5.6.2 init.d 和rc.d
init.d 和rc.d 机制使用独立的shell 脚本来启动不同的服务。这些脚本通常在下列目录之中:/sbin/init.d, /etc/init.d, /usr/local/etc/rc.d.脚本通常获取单一命令行参数,是start 或stop。某些系统仅仅使用start 参数。如下是启动squid 的基本脚本:
#!/bin/sh
# this script starts and stops Squid
case "" in
start)
/usr/local/squid/sbin/squid -s
echo -n ' Squid'
;;
stop)
/usr/local/squid/sbin/squid -k shutdown
;;
esac
Linux 用户可能在启动squid 之前需要设置文件描述符限制。例如:
echo 8192 > /proc/sys/fs/file-max
limit -HSn 8192
为了使用该脚本,先找到脚本存放的目录。给它一个有意义的名字,类似于其他的系统启动脚本。可以是S98squid 或squid.sh。通过重启计算机来测试该脚本,而不要假想它会正常工作。
5.6.3 /etc/inittab
某些操作系统支持另一种机制,是/etc/inittab 文件。在这些系统中,init 进程启动和停止基于运行等级的服务。典型的inittab 接口类似如此:
sq:2345:once:/usr/local/squid/sbin/squid -s
使用该接口,init 进程启动squid 一次并且随后忘记它。squid 确认它驻留在运行状态,象前面描述的一样。或者,你能这样做:
sq:2345:respawn:/usr/local/squid/sbin/squid -Ns
这里我们使用了respawn 选项,假如进程不存在init 会重启squid。假如使用respawn,请确认使用-N 选项。
在编辑完inittab 文件后,使用下面的命令来使init 重新读取它的配置文件和启动squid:
# init q
5.7 chroot 环境
某些人喜欢在chroot 环境运行squid。这是unix 的功能,给予进程新的root 文件系统目录。在squid 受安全威胁时,它提供额外等级的安全保护。假如攻击者在某种程度上通过squid获取了对操作系统的访问权,她仅仅能访问在chroot 文件系统中的文件。在chroot 树之外的系统文件,她不可访问。
最容易在chroot 环境里运行squid 的方法是,在squid.conf 文件里指定新的root 目录,如下:
chroot /new/root/directory
chroot()系统调用需要超级用户权限,所以你必须以root 来启动squid。
chroot 环境不是为unix 新手准备的。它有点麻烦,因为你必须在新的root 目录里重复放置大量的文件。例如,假如默认的配置文件正常在/usr/local/squid/etc/squid.conf,并且你使用chroot 指令,那么文件必须位于/new/root/directory/usr/local/squid/etc/squid.conf.你必须将位于$prefix/etc,$prefix/share,$prefix/libexec 下的所有文件拷贝到chroot 目录。请确认$prefix/var 和cache 目录在chroot 目录中存在和可写。
同样的,你的操作系统需要将大量的文件放在chroot 目录里,例如/etc/resolv.conf 和/dev/null.假如你使用外部辅助程序,例如重定向器(见11 章)或者验证器(见12 章),你也需要来自/usr/lib 的某些共享库。你可以使用ldd 工具来查找给定的程序需要哪些共享库:
% ldd /usr/local/squid/libexec/ncsa_auth
/usr/local/squid/libexec/ncsa_auth: