1. 安装Squid
tar zxvf squid-2.6.STABLE10.tar.gz
#解压包
cd squid-2.6.STABLE10
./configure --prefix=/usr/local/squid--enable-gnuregex --enable-async-io=160 --enable-kill-parent-hack--enable-snmp --disable-ident-lookups --enable-cache-digests --enable-ssl--enable-delay-pools --enable-underscore --enable-err-language=Simplify_Chinese--enable-default-err-languages=Simplify_Chinese --with-maxfd=16384
#--enable-gnuregex
强制使用GNU正则表达式
#---enable-async-io[=N_THREADS]
等同于:
--with-aufs-threads=N_THREADS
指定aufs存储机制使用的线程数量
--with-pthreads
该选项导致编译过程链接到你系统中的P线程库
--enable-storeio=ufs,aufs
指定存储类型
#--enable-kill-parent-hack
关机时杀死父进程
#--enable-snmp
开启snmp
ident是一个简单的协议,允许服务器利用客户端的特殊TCP连接来发现用户名。假如你使用该选项,编译器将把执行这些查询的代码排除出去
开启cache消化功能,Cache消化是ICP的另一个替代,但有着截然不同的特性
采用这步导致在运行squid时发生2件事:
1)Squid cache产生它自己内容的摘要。邻居cache如果也配置了使用cache摘要(在squid作出转发决定前,它会等待所有的ICP响应抵达。squid的cache摘要提供了类似的功能,但没有每个请求的网络延时),那可能就会请求这个摘要。
2)Squid请求每个邻居的cache摘要。
#--enable-ssl
开启ssl 功能(使用OpenSSL),仅工作在web加速器中用以加速请求
开启squid延时池功能
#--enable-underscore
允许解析的URL中出现下划线,因为默认squid会认为带下划线的URL地址是非法的,并拒绝访问该地址
#--enable-err-language=Simplify_Chinese
#--enable-default-err-languages=Simplify_Chinese
指定出错是显示的错误页面为简体中文
#--with-maxfd=16384
增大squid文件描述符到16384
#make && make install
编译并安装
2.Squid的配置
配置文件为/usr/local/squid/etc/squid.conf,如下是对配置参数的详细解释:
http_port 119.167.207.253:80 transparent
#使用此IP,并使用透明模式
icp_port 0
#多台Squid集群才会用到,仅是负责与邻近Proxy互相沟通彼此的快取资料库的功能,与实际的用户要求无关,设置为0,表示关闭此功能
hierarchy_stoplist cgi-bin ?
#如果在URL中出现以下的字样,则本机proxy不会向parent或者sibling做查询,而是直接处理.(预设值为cgi-bin及?)
acl QUERY urlpath_regex cgi-bin \? \.aspx \.ashx \.asmx
cache deny QUERY
#设置不想缓存的目录或者文件类型
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
#配置squid正确的缓存Apache输出的压缩内容
cache_mem 512 MB
#额外使用的内存量,来缓存热门内容,可根据你的系统内存设定,这里设置了512M
cache_swap_low 90
#最低交换空间缓存百分比
cache_swap_high 95
#最高交换空间缓存百分比,当使用交换空间量超过95%就开始删除旧的缓存
maximum_object_size 8192 KB
#单个文件最大缓存大小,超过这个大小将不缓存
maximum_object_size_in_memory 1024 KB
#在内存中单个文件最大缓存大小,超过这个大小将不缓存到内存中
cache_dir ufs /usr/local/squid/var/cache_eth0 4096 16 256
#依次设置磁盘缓存的存储机制和目录,大小,一二级目录的个数设置,这里磁盘缓存大小是4096M
access_log /usr/local/squid/logs/access_eth0.log common
#设置客户端请求的日志文件路径及格式
cache_log /usr/local/squid/var/logs/cache_eth0.log
#设置squid自身的运行日志文件路径
cache_store_log none
#纪录哪些cache资料被移除,或存放多久,这里设置为none,表示关闭此功能
emulate_httpd_log on
#access_log日志格式分为普通格式和原始格式,普通格式就如同大部分HTTP服务器(如Apache)的日志格式一样,它包含的信息少于Squid的原始格式。然而,假如运行Squid在代理人模式下,你可能想要普通日志文件格式。普通格式或许也对你现有的日志文件分析工具有用。使用该指令来激活普通格式
pid_filename /usr/local/squid/var/logs/squid_eth0.pid
hosts_file /etc/hosts
#设置PID文件和hosts文件
refresh_pattern -i pay 5 20% 10 reload-into-imsoverride-lastmod
#refresh_pattern指令间接的控制磁盘缓存。它帮助squid决定,是否某个给定请求是cache命中,或作为cache丢失对待。
#-i 表示使它们大小写不敏感
#pay 表示目录
#5 表示该目录的响应驻留在cache里的时间没有超过5分钟,那么它不会过期
#20% 表示该目录的响应在squid的cache缓存的时间大于(原始数据进入squid的缓存的时间-原始web数据所规定的Last-Modified时间)*20%,则过期
#10 表示该目录的响应驻留在cache里的时间高于10分钟,那么它必须被刷新
#reload-into-ims 表示squid在确认请求里,以no-cache指令传送一个请求
#override-lastmod 表示squid在检查LM-factor百分比(20%)之前先检查min值
acl denyurl url_regex favicon\.ico
http_access deny denyurl
#解决访问favicon.ico文件
half_closed_clients off
#表示一旦从客户端返回“no more data to read”的信息,squid就立即关闭该连接
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
#定义CONNECT的HTTP请求方法名字为CONNECT,除了443端口,其他都拒绝(这种方法比较危险,会被利用访问远程服务器,但SSl会用到)
acl manager proto cache_object
#定义proto类型的名字为manager
#proto指URI访问(或传输)协议。如下是有效值:http,https (same as HTTP/TLS), ftp, gopher, urn, whois, 和cache_object。也就是说,这些是被squid支持的URL机制名字
#cache_object用于访问squid的缓存管理接口
#ACL元素有:
# src : 源地址(即客户机IP地址)
# dst : 目标地址(即服务器IP地址)
# srcdomain : 源名称(即客户机名称)
# dstdomain : 目标名称(即服务器名称)
# port : 服务端口
# time : 一天中的时刻和一周内的一天
# url_regex :URL 规则表达式匹配
# urlpath_regex:URL-path 规则表达式匹配,略去协议和主机名
# proxy_auth : 通过外部程序进行用户验证
http_access deny limip1 URL
http_access deny limip2 URL
http_access allow 199
http_access allow 220
http_access allow 206
http_access allow 212
http_access allow 223
http_access allow 224
http_access allow 225
http_access allow 226
http_access allow 233
http_access allow 237
http_access allow 241
http_access allow 243
http_access allow 251
http_access allow 252
http_access allow 254
http_access allow 246
http_access allow 247
http_access allow 227
http_access allow 228
http_access allow 229
http_access allow 230
http_access allow 218
http_access allow 213
http_access allow 26
http_access allow 27
http_access allow 219
http_access allow 249
http_access allow manager localhost
http_access allow manager myip1
http_access allow manager myip2
http_access allow manager myip3
http_access allow manager myip4
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all
icp_access deny all
#访问控制规则的语法如下:
#access_list allow|deny [!]ACLname ...
#访问控制规则:
# http_access:这是最重要的访问控制列表。它决定哪些客户HTTP请求被允许,和哪些被拒绝。假如http_access配置错误,squid cache容易遭受攻击或被不当利用。
# icp_access: 假如你的squid被配置来服务ICP响应,那么该使用icp_access列表
# no_cache : 指示squid,不必存储某些响应在磁盘或内存里
cache_mgr tech@gyyx.cn
#设定管理者的E-mail,方便他人联系
cache_effective_user nobody
cache_effective_group nobody
#配置squid,在执行完需要特别权限的任务后,变成哪个用户和组
visible_hostname webcache
#有时由于DNS的问题,找不到主机名会出错,就得加上此设定
logfile_rotate 10
#保留几份log 档
forwarded_for on
#开启forwarded-for转发,不然截取不到forwarded信息头,但暴露客户的真实IP
coredump_dir none
#squid挂掉后,临终遗言要放到哪里(不易看懂)
snmp_port 3401
acl snmppublic snmp_community gyyxpub
snmp_access allow snmppublic all
#开启snmp功能
1. 对配置文件查错
使用如下命令:
/usr/local/squid/sbin/squid -k parse
假如你看不到输出,配置文件有效,你能继续后面的步骤。然而,如果配置文件包含错误,squid会提示
2. 设置目录权限
·chown -R nobody.nobody /usr/local/squid/var/cache_eth0/,设置cache目录权限
·chown -R nobody.nobody /usr/local/squid/var/logs/,更改目录权限
·mkdir /usr/local/squid/logs,创建目录
·chown -R nobody.nobody /usr/local/squid/logs,设置权限
3. 初始化cache目录
在初次运行squid之前,或者无论何时你增加了新的cache_dir,你必须初始化cache目录,使用如下命令:
/usr/local/squid/sbin/squid -z
4. 在终端窗口里测试squid
一旦你已经初始化cache目录,就可以在终端窗口里运行squid,将日志记录到标准错误。这样,你能轻易的定位任何错误或问题,并且确认squid是否成功启动。使用-N选项来保持squid在前台运行,-d1选项在标准错误里显示1级别的调试信息,命令如下:
/usr/local/squid/sbin/squid -N -d1
假如你看到错误消息,你该首先修正它。请检查输出信息的开始几行以发现警告信息。最普通的错误是文件/目录许可问题,和配置文件语法错误。假如你看到一条不引起注意的错误消息,请见16章中关于squid故障处理的建议和信息。
一旦你见到"Ready to serve requests"消息,就可用一些HTTP请求来测试squid。配置你的浏览器使用squid作为代理,然后打开某个web页面。假如squid工作正常,页面被迅速载入,就象没使用squid一样。另外,你可以使用squidclient程序,它随squid发布:
/usr/local/squid/bin/squidclient-h 本机地址 -p 80 http://www.baidu.com | more
假如它正常工作,squid的主页html文件会在你的终端窗口里滚动。一旦确认squid工作正常,你能中断squid进程(例如使用ctrl-c)并且在后台运行squid
注意:为测试成功,添加了如下acl:
acl baidu url_regex www.baidu.com
http_accessallow baidu
5.启动、停止squid命令:
作为服务启动Squid,使用命令:
/usr/local/squid/sbin/squid-Ds -f squid.conf
-D:
正常情况下,squid直到验证它的DNS可用才能启动,该选项阻止了这样的检测
-s:
激活将日志记录到syslog进程
-f:
指定一个配置文件
最安全的停止squid的方法是使用squid -kshutdown命令:
/usr/local/squid/sbin/squid -k shutdown
该命令发送TERM信号到运行中的squid进程。在接受到TERM信号后,squid关 闭 进来的套接字以拒收新请求。然后它等待一段时间,用以完成外出请求。默认时 间 是30秒,你可以在shutdown_lifetime指令里更改它。
假如,因为某些理由,squid.pid文件丢失或不可读,squid -k命令会失败。在此情 形 下,你可以用ps找到squid的进程ID,然后手工杀死squid
假如,你使用squid-k interrupt命令,squid立即关闭,不用等待完成活动请求。这 与 在kill里发送INT信号相同。
6. 脚本启动squid
使用脚本启动,在/etc/rc.local中可以看到,有两个脚本,下面说下这两个脚本的用途,其中一个:
默认系统就会加载/dev/shm ,它就是所谓的tmpfs,它可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。
tmpfs有以下优势:
1.动态文件系统的大小,也就是说这个档案系统的大小是可以随时调整的,像是再追加一个指令如:mount -o remount,size=2G /dev/shm
2.tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
3.tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。
在上面的脚本之后,运行如下这个脚本:
#!/bin/sh
#######################################################
# Subject: start squid
# File Name: squid_start.sh
# Created Date: 09-04-16
# Updated Date: 09-04-17
# Author:
# Abstract: stop squid first and start
#######################################################
ulimit -Hn 16384
#指定一个进程可以拥有的文件描述符的数量的极限,H表示硬限制
echo 16384 > /proc/sys/fs/file-max
#文件系统可以拥有的文件描述符的数量的极限
#简单的说, max-file表示系统级别的能够打开的文件句柄的数量,而ulimit -n控制进程级别能够打开的文件句柄的数量.
echo "30" >/proc/sys/net/ipv4/tcp_fin_timeout
#决定保持在FIN-WAIT-2状态的时间(FIN-WAIT-2:从远程TCP等待连接中断请求)
echo "1200" >/proc/sys/net/ipv4/tcp_keepalive_time
#keepalive是TCP保鲜定时器。当网络两端建立了TCP连接之后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,
#服务器内核就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
#设置为1,开启此功能,有效地防止synflood攻击
echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse
#可以使用TIME_WAIT tcp连接用于建立新的tcp连接
echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle
#开启快速回收TIME_WAIT tcp连接的功能
echo "10000 60000" >/proc/sys/net/ipv4/ip_local_port_range
#用于向外连接的端口范围
echo "8192" > /proc/sys/net/ipv4/tcp_max_syn_backlog
#对于那些依然还未获得客户端确认的连接请求,需要保存在队列中的最大数目
#echo "5000" >/proc/sys/net/ipv4/tcp_max_tw_buckets
echo "20000" >/proc/sys/net/ipv4/tcp_max_tw_buckets
#系统同时处理TIME_WAIT sockets数目。如果一旦TIME_WAIT tcp连接数超过了这个数目,系统会强制清除并且显示警告消息。设立该限制,主要是防止那些简单的DoS攻击,加大该值有可能消耗更多的内存资源
/usr/local/squid/sbin/squid -k shutdown -f/usr/local/squid/sh/squid_eth0.conf
#squid停止命令
#/usr/local/squid/sbin/squid -k shutdown -f/usr/local/squid/sh/squid_eth1.conf
while [ `pgrep squid|wc -l` -eq 0 ]
do
sleep 1
done
sleep 1
/usr/local/squid/sbin/squid -Ds -f/usr/local/squid/sh/squid_eth0.conf
#启动squid