Squid学习笔记
1、安装前的配置
编译安装之前需要校正的参数主要包括File Descriptor和Mbuf Clusters。
1、File Descriptor
查看文件描述符的限制数目:
ulimit –n
调整文件描述符的数目需要3步:
step 1,编辑系统头文件/usr/include/bits/types.h
define __FD_SIZIEFD 8192
step 2,调整内核的FD限制数目
echo 8192 > /proc/sys/fs/file-max
step 3,修改当前shell环境的FD限制数目
ulimit –Hn 8192
2、Mbuf Clusters
3、调整临时端口的范围
Squid与Client连接的Local Port默认值为3128,与Server连接的Remote Port默认值为80。当Squid与源服务器建立连接时,系统会给本地socket分配一个端口号,这些端口号有特定的范围限制。
echo “1024 40000” > /proc/sys/net/ipv4/ip_local_port_range
2、./configure脚本的选项
configure脚本的最终任务是创造Makefiles和其他文件;在有些情况下可能需要重新运行configure脚本,例如调整了内核参数,此时必须再次运行./configure以让新的设置生效。在使用make命令重新编译前,需要重运行configure脚本,这通常有两种方法:一是使用如下命令:config.status --recheck;二是使用命令touch config.status,它更新了该文件的时间戳。注意,如果要增加或删除./configure选项,则必须重新敲入完整的命令行。
configure的常用选项:
--prefix=PREFIX:Squid的安装目录,缺省值为/usr/local;
--localstatedir=DIR:var目录的安装位置,缺省值为$prefix/var;
--sysconfdir=DIR:etc目录的安装位置,缺省值为$prefix/etc;
--enable-dlmalloc[=LIB]:将Squid源代码包中的dlmalloc包编译和链接进来;
--enable-gnuregex:如有必要,激活使用GNU正则表达式;
--enable-carp:Cache数组路由协议(CARP)用来转发丢失的cache到父cache的数组或cluster;
--enable-async-io[=N_THREADS]:异步I/O可以用来提升存储性能。aufs模块使用大量的线程来执行磁盘I/O操作,N_THREADS参数改变Squid使用的线程数量。
--enable-async-io选项等同于如下三个选项:
--with-pthreads:在编译过程中链接到系统的P线程库,aufs存储模块是Squid中唯一需要使用线程的部分。
--with-aufs-threads=N_THREADS:指定aufs存储机制使用的线程数量。Squid会根据cache目录的数量,自动计算需要使用多少线程。
--enable-storeio=ufs,aufs,diskd, coss, null:告诉Squid编译时使用哪个存储模块,源码中/src/fs下面有所有可用的存储模块。ufs模块是默认的,它也是最稳定的,但缺点是性能比较有限。
--enable-removal-policies=heap,lru:排除策略是Squid需要腾出空间给新的cache目标时,用以排除旧目标的机制。LRU(least recently used)为默认值,它使用双链表结构,GDS(greed dual size)和LFU(least frequently used)使用heap结构,注意,这种数据结构的实现并不是惟一的。
--enable-icmp:利用ICMP消息来确定回环时间(round-trip time),这类似于ping程序;
--enable-delay-pools:延时池,用来限制带宽。该池由大量的客户端IP地址组成,当来自这些客户端的请求发生cache miss时,它们的响应将被人为的延迟。
--enable-usreagent-log:记录来自客户端请求消息中user-agent的HTTP消息头;
--enable-referer-log:记录来自客户端请求消息中referer的HTTP消息头;
--disable-wccp:Web cache协调协议(WCCP),用以拦截并分发HTTP请求到一个或多个caches。WCCP协议默认是激活的,该选项可用阻止编译WCCP代码。
--enable-snmp:在编译过程中编译所有的SNMP相关的代码,包括一个裁切版本的CMU SNMP库;
--enable-cachemgr -hostname[=hostname]:cachemgr是一个用来对Squid进行查询管理的CGI程序,hostname默认值为空。
--enable-arp-acl:支持ARP或者以太地址、访问控制列表;
--enable-htcp:HTCP是超文本缓存协议,一种类似于ICP的内部缓存协议;
--enable-ssl:允许Squid终止SSL/TLS连接,仅对代理模式的加速请求有效;
--with-openssl[=DIR]:告诉Squid到哪里找OpenSSL库文件和头文件;
--enable-cache-digests:Cache摘要是ICP的另一个可用的替代;
--enable-err-languages="lang1 lang2...":错误消息需要安装的语言,相应的语言文件将复制到$prefix/share/errors中。如果不指定该选项,源包中所有可用的语言都会被安装。
--enable-default-err-language=lang:错误消息采用的默认语言,英语是默认值。
--with-coss-membuf-size=N:该选项设置coss缓存目录的内存缓冲大小,默认值是1MB。循环目标存储系统(Cyclic Object Storage System, coss)是Squid的一种仍处于试验性的存储机制。
--enable-poll:强制使用poll()函数;
--desable-poll:不使用poll()函数;
--disable-http-violations:Squid默认是允许存在违反HTTP规范的配置,该选项可以完全禁止违背HTTP协议规范的代码。
--enable-ipf-transparent:使用IP过滤器(filter)来辅助拦截缓存。
--enable-pf-transparent:在那些使用PF包过滤器的操作系统上使用HTTP拦截,PF是标准的数据包过滤器(packet filter)。
--enable-linux-netfilter:Netfilter是PF的名字,如果要在linux 2.4或以后的版本中使用HTTP拦截功能,那么激活该选项。
--disable-ident-lookups:ident是一个简单的协议,它允许服务器查找来自客户端某条特定TCP连接的用户名。
--disable-internal-dns:Squid源码中包含了DNS两种不同的实现,一个是内置的查找(采用Squid自身对DNS的实现),一个是外部查找(使用C库gethostbyname()和gethostbyaddr()函数),默认使用前者。该选项将激活外部查找,并禁止内置的查找。
--enable-truncate:truncate()系统调用是unlink()的替代品。unlink完全删除cache文件,而truncate将文件大小设为零。有些人认为这种收回磁盘空间但却留下目录项的方法可用改善性能。
--disable-hostname-checks:默认的,Squid要求URL主机名遵守古老的RFC 1034规范,使用该选项可以移除这种限制。
--enable-underscores:允许主机名里包含下划线,但仍须考虑DNS解析程序可能会禁止主机名里包含下划线。
--enable-auth=basic,digest,ntlm:设置HTTP验证机制;
--enable-basic-auth-helpers=LIST:将helpers/basic_auth目录的一个或多个HTTP Basic验证辅助程序编译进来;
--enable-ntlm-auth-helpers=LIST:将helpers/ntlm_auth目录的一个或多个HTTP NTLM验证辅助程序编译进来;
--enable-ntlm-fail-open:允许在有错误时访问NTLM验证模块。
--enable-digest-auth-modules=LIST:将helpers/digest_auth目录的一个或多个HTTP Digest验证辅助程序编译进来;
--enable-external-acl-helpers=LIST:编译一个或多个扩展ACL辅助程序;
--disable-unlinked:外部辅助进程,它对cache文件执行unlink()或truncate()系统调用;我们认为通过在外部进程里执行文件删除工作,能给Squid带来明显的性能提升;
--enable-stacktrace:如果Squid崩溃,数据追踪信息被写到cache.log文件;
--enable-x-accelerator-vary:在Squid被配置成代理时使用。它建议Squid在响应请求时,从后台原始服务器中寻找X-Accelerator-Vary头。
3、Squid的目录结构
libexec:辅助程序,通常由其它程序启动;
libexec/unlinked:从cache目录里删除文件;文件删除是Squid一个性能瓶颈,通过外部进程执行删除操作可以提升性能。
libexec/cachemgr.cgi:Squid管理功能的CGI接口,需要拷贝到WEB服务器的cgi-bin目录;
libexec/diskd:如果指定了--enable-storeio=diskd时,该文件才可见;
libexec/pinger:如果指定了--enable-icmp,该文件才可见;
sbin:仅root可用的程序;
sbin/squid:squid的主程序;
bin:所有用户都可用的程序;
bin/RunCache:启动squid的脚本;
bin/RunAccel:与RunCache几乎一致,但增加另一个命令行参数,告诉squid在哪里侦听HTTP请求。
bin/squidclient:用来测试Squid的HTTP客户端程序;例如:squidclient -m GET http://www.baidu.com > tmp.html
etc:配置文件;
etc/squid.conf:主配置文件;
etc/squid.conf.default:默认配置文件;
etc/mime.conf:告诉Squid对从FTP和Gopher服务器获取的数据使用何种MIME类型;
etc/mime.conf.default:默认mime文件;
share:通常包含只读数据文件;
share/mib.txt:SNMP管理管理信息基础(MIB)文件,SNMP客户端软件(如snmpget和MRTG)需要该文件;
share/icons:存放图标;
share/errors:错误消息模板;
var:包含了不是很重要的和经常变化的文件,这些文件也无需备份;
var/logs:日志文件;
var/cache:缓存目录;
4、Squid的命令行选项
运行$prefix/squid/sbin/squid主程序时,可以指定一些选项,例如:
-h:查看帮助信息。
-v:查看版本信息。
-a port:覆盖squid.conf的http_port值(只影响第一个)。
-u port:覆盖squid.conf的icp_port值。
-d level:将调试消息写入stderr中,level指定需要写入stderr中的消息的最高级别,它遵循debug_options指令的设置。
-s:将cache.log消息记录系统日志/etc/syslog;仅仅在debug级别0和1的消息会被转发,级别0的消息以syslog级别LOG_WARNING记录,级别1的消息以syslog级别LOG_NOTICE记录。所有消息使用LOCAL4的syslog设备。
-f file:指定一个可选的配置文件。
-z:初始化cache和swap目录,首次运行Squid时或新增了一个cache目录时都必须使用该选项。
-N:让Squid在前台终端运行,此时警告/错误消息将直接打印在屏幕上(stderr);
-D:启动squid时不进行DNS初始化测试;
-X:进入完整调试模式,即debug_options ALL 9;
-k function:function可以是reconfigure, rotate, shutdown, interrupt, kill, debug, check, parse等。其中reconfigure可以让正在运行的Squid程序重新加载配置文件;rotate让日志文件周期性滚动存储;shutdown发送信号给Squid关闭进程;interrupt立即关闭Squid;kill发送强行关闭KILL信号给Squid(最终手段);debug将Squid转为完整调试模式;check检查Squid进程的状态;parse解析squid.conf文件,检查配置是否正确。
例如:
squid -k debug; sleep 5; squid -k debug //获得5秒的调试日志信息
5、squid.conf的常用配置指令
==网络参数配置==
http_port:Squid监听客户端HTTP请求的端口号,默认值为3128;
https_port:Squid监听客户端HTTPS请求的端口号,默认值443。
==日志和cache目录==
cache_dir:cache_dir scheme directory size L1 L2,设置cache目录的参数,如存储机制(默认值为ufs)和存放目录(默认值为$prefix/var/cache)等。
logformat:按照需要指定日志在日志文件存储的格式;
access_log:指定access.log的存放目录,默认值为$prefix/var/logs。access.log主要记录客户端请求,如果不需要记录,可以定义access_log /dev/null。
cache_log:指定cache.log的存放目录,默认值为$prefix/var/logs。cache.log主要记录squid的调试消息等信息。
cache_store_log:指定store.log的存放目录,默认值为$prefix/var/logs。stroe.log记录每一个进出cache的对象,如果不需要记录,可以定义cache_store_log none。
debug_options:定义了squid功能模块的日志级别,一般使用默认值debug_options ALL 1;
==配置缓存大小的选项==
cache_mem:用于存放 In-Transit 对象(正在请求)、 Hot 对象(请求成功)和 Negative-Cached 对象(请求失败),默认值是8M;
maximum_object_size_in_memory:超过这个值的对象不会缓存在内存中,默认值是8KB;
memory_replacement_policy:当内存cahce空间不足时,进行对象替换的策略,lru是默认值;
cache_replacement_policy:磁盘缓存替换策略,包括lru/gdsf/lfuda;lru是默认值;
minimum_object_size:低于这个值的对象不能被缓冲,默认值是0;
maximum_object_size:超过这个值的对象不能被缓冲,可以根据响应消息中的content-length头来判断对象大小;如果响应中没有content-length头,则先写入磁盘,再检查对象大小,默认值是4096KB。
cache_swap_low:当cache目录的使用率(百分比)超过该值时,会开始删除旧对象以保证使用率不会超过该值;所以,当squid运行稳定后,cache目录的使用率比较接近该值。默认值是90;
cache_swap_high:默认值是95;
==调整缓存选项==
refresh_pattern:refresh_pattern -i regexp min percent max,间接控制磁盘缓冲,在cache命中率和确保数据的最新这两个性能之间需要折衷。
quick_abort_min:如果客户端中止请求,而资源的剩余内容又小于16KB时,cache默认会继续完成下载,quick_abort_min默认值为16KB;
quick_abort_max:如果客户端中止请求,而资源的剩余内容又大于16KB时,cache默认会取消下载,quick_abort_max默认值为16KB;
read_ahead_gap:发送到客户端预取缓冲区的大小,默认值是17KB;
negative_ttl:定义了错误页面(如“404 NOT FOUND”)的 Negative-Cached 缓存时间(time_to_live);
positive_dns_ttl:DNS查询成功的生存时间,默认6小时;
negative_dns_ttl:对失败的DNS查询进行negative caching对象生存时间。;
range_offset_limit:
request_header_max_size:指定请求的HTTP头的最大大小;
request_body_max_size:指定HTTP请求的body部分的最大值;
collapsed_forwarding:当有多个相同的URI回源时,合并成一个请求处理。
==访问控制==
acl:定义访问控制列表(access control list),格式:acl aclname sr/dest ip/mask。
http_access:过滤client请求;格式:http_access allow/deny aclname。
http_reply_access:过滤Server回复;
icp_access:icp(Internet Cache Protocal)是sibling cache之间的通信协议,该指令用来配置cache与其临近的其他cache之间的访问控制机制。
reply_body_max_size:如果响应消息的消息体超过了该值,就立即删除;
reply_header_max_size:响应消息中得实体不能超过该值;
==超时设置==
request_timeout:请求超时;
persistent_request_timeout:长连接中两个请求的最大间隔时间;
connect_timeout:连接超时;
==其他项==
update_headers:在接收到304 Not Modified响应码时,Squid默认会更新相关头域,update_headers off 可以阻止这种特性;
via:关闭或开启via头,via头用来记录消息在传输过程中经过的中间结点(如gateway、proxy、router等);
header_access:header_access allow/deny header_name,允许或禁止访问某个头域;
header_replace:被header_access拒绝的头域的内容可以使用header_replace进行替换(默认是移除);
deny_info:当请求被访问规过滤掉时,squid会显示一个错误的页面,这个配置项可以定义那个错误的页面。
forwarded_for:Squid是否记录它转发的请求中的hostname或IP地址,默认是打开的。例如X-Forwarded-For: 192.1.2.3;
reload_into_ims:将no-cache或reload请求转变为IMS请求(If-Modified-Since);
cachemgr_passwd:cache管理密码;
cache_effective_user:设置运行Squid的有效账户;
cache_effective_group:设置有效用户组;
visible_hostname:设置主机名;
==管理员参数配置==
cache_mgr:设置管理员邮箱,当Squid发生错误时将发送消息到指定邮箱,如cache_mgr [email protected]
==Cache_peer选项==
cache/no_cache:cache allow/deny alcname,不缓存指定的URL资源;
==外部支持方案的选项==
storeurl_rewrite_program:
storeurl_rewrite_children:
storeurl_rewrite_concurrency:
url_rewrite_program:
url_rewrite_children:
url_rewrite_concurrency:
url_rewrite_host_header:
==Delay pool 参数配置==
store_dir_select_algorithm:为缓存对象选择cache目录的算法,有least-load和round-robin两种,前者是选择负荷最小的目录,后者是轮询所有未满的目录。
minimum_expiry_time:(Expires - Date),最小缓存时间;
vary_ignore_expire:
server_http11:在出口的请求中使用HTTP/1.1协议;
client_persistent_connections:客户端是否支持长连接,默认是打开的;
server_persistent_connections:服务器端是否支持长连接,默认是打开的;
ignore_ims_on_miss:
coredump_dir: