工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表分类:squid/缓存

squid配置解析

4.1常用的配置选项  
因为缺省的配置文件有问题,所以我们必须首先修改该配置文件的有关内容,以便让squid跑起来。  
下面我们来看一看squid.conf文件的结构以及一些常用的选项:  
squid.conf配置文件的可以分为十三个部分,这十三个部分分别是:  
1.NETWORK OPTIONS (有关的网络选项)  
2.OPTIONS WHICH AFFECT THE NEIGHBOR SELECTION ALGORITHM (作用于邻居选择算 法的有关选项)  
3.OPTIONS WHICH AFFECT THE CACHE SIZE (定义cache大小的有关选项)  
4.LOGFILE PATHNAMES AND CACHE DIRECTORIES (定义日志文件的路径及cache的目录)  
5.OPTIONS FOR EXTERNAL SUPPORT PROGRAMS (外部支持程序选项)  
6.OPTIONS FOR TUNING THE CACHE (调整cache的选项)  
7.TIMEOUTS (超时)  
8.ACCESS CONTROLS (访问控制)  
9.ADMINISTRATIVE PARAMETERS (管理参数)  
10.OPTIONS FOR THE CACHE REGISTRATION SERVICE (cache注册服务选项)  
11.HTTPD-ACCELERATOR OPTIONS (HTTPD加速选项)  
12.MISCELLANEOUS (杂项)  
13.DELAY POOL PARAMETERS (延时池参数)  
虽然squid的配置文件很庞大,但是如果你只是为一个中小型网络提供代理服务,并且只准备使用一台服务器,那么,你只需要修改配置文件中的几个选项。这些几个常用选项分别是:  
1.http_port  
说明:定义squid监听HTTP客户连接请求的端口。缺省是3128,如果使用HTTPD加速模式 则为80。你可以指定多个端口,但是所有指定的端口都必须在一条命令行上。  
2.cache_mem (bytes)  
说明:该选项用于指定squid可以使用的内存的理想值。这部分内存被用来存储以下对象 :  
In-Transit objects (传入的对象)  
Hot Objects (热对象,即用户常访问的对象)  
Negative-Cached objects (消极存储的对象)  
需要注意的是,这并没有指明squid所使用的内存一定不能超过该值,其实,该选项只 定义了squid所使用的内存的一个方面,squid还在其他方面使用内存。所以squid实际 使用的内存可能超过该值。缺省值为8MB。  
3.cache_dir Directory-Name Mbytes Level-1 Level2  
说明:指定squid用来存储对象的交换空间的大小及其目录结构。可以用多个cache_dir命令来定义多个这样的交换空间,并且这些交换空间 可以分布不同的磁盘分区。"directory "指明了该交换空间的顶级目录。如果你想用整个磁盘来作为交换空间,那么你可以将该目录作为装载点将整个 磁盘mount上去。缺省值为/var/spool/squid。“Mbytes”定义了可用的空间总量。需要注意的是,squid进程必须拥有对该目录 的读写权力。“Level-1”是可以在该顶级目录下建立的第一级子目录的数目,缺省值为16。同理,“Level-2”是可以建立的第二级子目录的数 目,缺省值为256。为什么要定义这么多子目录呢?这是因为如果子目录太少,则存储在一个子目录下的文件数目将大大增加,这也会导致系统寻找某一个文件的 时间大大增加,从而使系统的整体性能急剧降低。所以,为了减少每个目录下的文件数量,我们必须增加所使用的目录的数量。如果仅仅使用一级子目录则顶级目录 下的子目录数目太大了,所以我们使用两级子目录结构。  
那么,怎么来确定你的系统所需要的子目录数目呢?我们可以用下面的公式来估算。  
已知量:  
DS = 可用交换空间总量(单位KB)/ 交换空间数目  
OS = 平均每个对象的大小= 20k  
NO = 平均每个二级子目录所存储的对象数目 = 256  
未知量:  
L1 = 一级子目录的数量  
L2 = 二级子目录的数量  
计算公式:  
L1 x L2 = DS / OS / NO  
注意这是个不定方程,可以有多个解。  
4.acl  
说明:定义访问控制列表。  
定义语法为:  
acl aclname acltype string1 ...  
acl aclname acltype "file" ...  
当使用文件时,该文件的格式为每行包含一个条目。  
acltype 可以是 src dst srcdomain dstdomain url_pattern urlpath_pattern time port proto method browser user 中的一种。  
分别说明如下:  
src 指明源地址。可以用以下的方法指定:  
acl aclname src ip-address/netmask ... (客户ip地址)  
acl aclname src addr1-addr2/netmask ... (地址范围)  
dst 指明目标地址。语法为:  
acl aclname dst ip-address/netmask ... (即客户请求的服务器的ip地址)  
srcdomain 指明客户所属的域。语法为:  
acl aclname srcdomain foo.com ... squid将根据客户ip反向查询DNS。  
dstdomain 指明请求服务器所属的域。语法为:  
acl aclname dstdomain foo.com ... 由客户请求的URL决定。  
注意,如果用户使用服务器ip而非完整的域名时,squid将进行反向的DNS解析来确 定其完整域名,如果失败就记录为“none”。  
time 指明访问时间。语法如下:  
acl aclname time [day-abbrevs] [h1:m1-h2][hh:mm-hh]  
day-abbrevs:  
S - Sunday  
M - Monday  
T - Tuesday  
W - Wednesday  
H - Thursday  
F - Friday  
A - Saturday  
h1:m1 必须小于 h2:m2,表达示为[hh:mm-hh]。  
port 指定访问端口。可以指定多个端口,比如:  
acl aclname port 80 70 21 ...  
acl aclname port 0-1024 ... (指定一个端口范围)  
proto 指定使用协议。可以指定多个协议:  
acl aclname proto HTTP FTP ...  
method 指定请求方法。比如:  
acl aclname method GET POST ...  
5.http_access  
说明:根据访问控制列表允许或禁止某一类用户访问。  
如果某个访问没有相符合的项目,则缺省为应用最后一条项目的“非”。比如最后一条为允许,则缺省就是禁止。所以,通常应该把最后的条目设为"deny all" 或 "allow all" 来避免安全性隐患。 
4.2 应用实例  
假想情景:某公司用squid作代理服务器,该代理服务器配置为PII450/256M/8.4G,公司所用ip段为1.2.3.0/24,并且想用8080作为代理端口。  
则相应的squid配置选项为:  
1.http_port  
http_port 8080  
2.cache_mem  
思路:由于该服务器只提供代理服务,所以该值可以尽量设得大一些。  
cache_mem 194M  
3.cache_dir Directory-Name Mbytes Level-1 Level2  
思路:硬盘为8.4G的,在安装系统时应该做好规划,为不同的文件系统划分可用空间。在本例中,我们可以这样来划分:  
/cache1 3.5G  
/cache2 3.5G  
/var 400M  
swap 127M  
/ 剩余部分  
并且,在安装时,我们尽量不安装不必要的包。这样在节约空间的同时可以提高系统的安全性和稳定性。下面我们来计算所需的第一级和第二级子目录数。  
已知量:  
DS = 可用交换空间总量(单位KB)/ 交换空间数目=7G/2=3500000KB  
OS = 平均每个对象的大小= 20k  
NO = 平均每个二级子目录所存储的对象数目 = 256  
未知量:  
L1 = 一级子目录的数量  
L2 = 二级子目录的数量  
计算公式:  
L1 x L2 = DS / OS / NO=3500000/20/256=684  
我们取  
L1=16  
L2=43  
所以,我们的cache_dir语句为:  
cache_dir /cache1 3500M 16 43  
cache_dir /cache2 3500M 16 43  
4.acl  
思路:通过src来定义acl.  
acl allow_ip src 1.2.3.4/255.255.255.0  
5.http_access  
http_access allow allow_ip  

4.3启动、停止squid。  
配置并保存好squid.conf后,可以用以下命令启动squid。  
squid  
或者,使用RedHat的启动脚本来启动squid.  
/etc/rc.d/init.d/squid start  
同样地,你也可以用下列脚本停止运行squid或重启动squid.  
/etc/rc.d/init.d/squid stop  
/etc/rc.d/init.d/squid restart  

五、根据需求配置你的squid——进阶篇  

5.1其它配置选项  
在进行squid的一些高级应用之前,我们有必要对其他有用的配置选项作一个全面的了解。下面我们分类来讲一讲这些选项,用于某些特殊应用的选项我们将放在讲该种应用时来讲。  

5.1.1网络选项  
1.tcp_incoming_address  
tcp_outgoing_address  
udp_incoming_address  
udp_outgoing_address  
说明:  
tcp_incoming_address指定监听来自客户或其他squid代理服务器的绑定ip地址;  
tcp_outgoing_address指定向远程服务器或其他squid代理服务器发起连接的ip地址  
udp_incoming_address为ICP套接字指定接收来自其他squid代理服务器的包的ip地址 udp_outgoing_address为ICP套接字指定向其他squid代理服务器发送包的ip地址;  
缺省为没有绑定任何ip地址。该绑定地址可以用ip指定,也可以用完整的域名指定。  

5.1.2交换空间设定选项  
1.cache_swap_low (percent, 0-100)  
cache_swap_high (percent, 0-100)  
说明:squid使用大量的交换空间来存储对象。那么,过了一定的时间以后,该交换空间就会用完,所以还必须定期的按照某种指标来将低于某个水平 线的对象清除。squid使用所谓的“最近最少使用算法”(LRU)来做这一工作。当已使用的交换空间达到cache_swap_high时,squid 就根据LRU所计算的得到每个对象的值将低于某个水平线的对象清除。这种清除工作一直进行直到已用空间达到cache_swap_low。这两个值用百分 比表示,如果你所使用的交换空间很大的话,建议你减少这两个值得差距,因为这时一个百分点就可能是几百兆空间,这势必影响squid的性能。缺省为:  
cache_swap_low 90  
cache_swap_high 95  
2.maximum_object_size  
说明:大于该值得对象将不被存储。如果你想要提高访问速度,就请降低该值;如果你想最大限度地节约带宽,降低成本,请增加该值。单位为K,缺省值为:  
maximum_object_size 4096 KB  

5.1.3有关日志的选项  
1.cache_access_log  
说明:指定客户请求记录日志的完整路径(包括文件的名称及所在的目录),该请求可以是来自一般用户的HTTP请求或来自邻居的ICP请求。缺省值为:  
cache_access_log /var/log/squid/access.log  
如果你不需要该日志,可以用以下语句取消:cache_access_log none  
2.cache_store_log  
说明:指定对象存储记录日志的完整路径(包括文件的名称及所在的目录)。该记录表明哪些对象被写到交换空间,哪些对象被从交换空间清除。缺省路径为:  
cache_log /var/log/squid/cache.log  
如果你不需要该日志,可以用以下语句取消:cache_store_log none  
3.cache_log  
说明:指定squid一般信息日志的完整路径(包括文件的名称及所在的目录)。  
缺省路径为:cache_log /var/log/squid/cache.log  
4.cache_swap_log  
说明:该选项指明每个交换空间的“swap.log”日志的完整路径(包括文件的名称及所在的目录)。该日志文件包含了存储在交换空间里的对象的 元数据(metadata)。通常,系统将该文件自动保存在第一个“cache_dir”说定义的顶级目录里,但是你也可以指定其他的路径。如果你定义了 多个“cache_dir”,则相应的日志文件可能是这样的:  
cache_swap_log.00  
cache_swap_log.01  
cache_swap_log.02  
后面的数字扩展名与指定的多个“cache_dir”一一对应。  
需要注意的是,最好不要删除这类日志文件,否则squid将不能正常工作。  
5.pid_filename  
说明:指定记录squid进程号的日志的完整路径(包括文件的名称及所在的目录)。缺省路径为  
pid_filename /var/run/squid.pid  
如果你不需要该文件,可以用以下语句取消:pid_filename none  
6.debug_options  
说明:控制作日志时记录信息的多寡。可以从两个方面控制:section控制从几个方面作记录;level控制每个方面的记录的详细程度。推荐的方式(也是缺省方式)是:debug_options ALL,1  
即,对每个方面都作记录,但详细程度为1(最低)。  
7.log_fqdn on|off  
说明:控制在 access.log 中对用户地址的记录方式。打开该选项时,squid记录客户的完整域名,取消该选项时,squid记录客户 的ip地址。注意,如果打开该选项会增加系统的负担,因为squid还得进行客户ip的DNS查询。缺省值为:log_fqdn off  

5.1.4有关外部支持程序的选项  
1.ftp_user  
说明:设置登录匿名ftp服务器时的提供的电子邮件地址,登录匿名ftp服务器时要求用你的电子邮件地址作为登录口令(更多的信息请参看本书的相 关章节)。需要注意的是,有的匿名ftp服务器对这一点要求很苛刻,有的甚至会检查你的电子邮件的有效性。缺省值为:ftp_user Squid@  
2.ftp_list_width  
说明:设置ftp列表的宽度,如果设得太小将不能的浏览到长文件名。缺省值为: ftp_list_width 32  
3.cache_dns_program  
说明:指定DNS查询程序的完整路径(包括文件的名称及所在的目录)。缺省路径为:  
cache_dns_program /usr/lib/squid/dnsserver  
4.dns_children  
说明:设置DNS查询程序的进程数。对于大型的登录服务器系统,建议该值至少为10。最大值可以是32,缺省设置为5个。注意,如果你任意的降低 该值,可能会使系统性能急剧降低,因为squid主进程要等待域名查询的结果。没有必要减少该值,因为DNS查询进程并不会消耗太多的系统的资源。  
5.dns_nameservers  
说明:指定一个DNS服务器列表,强制squid使用该列表中的DNS服务器而非使用/etc/resolv.conf文件中定义的DNS服务器。你可以这样指定多个DNS服务器:dns_nameservers 10.0.0.1 192.172.0.4  
缺省设置为:dns_nameservers none  
6.unlinkd_program  
说明:指定文件删除进程的完整路径。  
缺省设置为:  
unlinkd_program /usr/lib/squid/unlinkd  
7.pinger_program  
说明:指定ping进程的完整路径。该进程被squid利用来测量与其他邻居的路由距离。该选项只在你启用了该功能时有用。缺省为:  
pinger_program /usr/lib/squid/pinger  
8.authenticate_program  
说明:指定用来进行用户认证的外部程序的完整路径。squid的用户认证功能我们将在后面的章节讲述。缺省设置为不认证。  

5.1.5用户访问控制选项  
1.request_size (KB)  
说明:设置用户请求通讯量的最大允许值(单位为KB)。如果用户用POST方法请求时,应该设一个较大的值。缺省设置为:  
request_size 100 KB  
2.reference_age  
说明:squid根据对象的LRU(最近最少使用算法)来清除对象,squid依据使用磁盘空间的总量动态地计算对象的LRU年龄。我们用 reference_age定义对象的最大LRU年龄。如果一个对象在指定的reference_age内没有被访问,squid将删除该对象。缺省值为 一个月。你可以使用如下所示的时间表示方法。  
1 week  
3.5 days  
4 months  
2.2 hours  
3.quick_abort_min (KB)  
quick_abort_max (KB)  
quick_abort_pct (percent)  
说明:控制squid是否继续传输被用户中断的请求。当用户中断请求时,squid将检测  
quick_abort 的值。如果剩余部分小于“quick_abort_min”指定的值,squid 将继续完成剩余部分的传输;如果剩余 部分大于“quick_abort_max”指定的值,squid 将终止剩余部分的传输;如果已完成“quick_abort_pct”指定的百分 比,squid将继续完成剩余部分的传输。缺省的设置为:  
quick_abort_min 16 KB  
quick_abort_max 16 KB  
quick_abort_pct 95  

5.1.6各类超时设置选项  
1.negative_ttl time-units  
说明:设置消极存储对象的生存时间。所谓的消极存储对象,就是诸如“连接失败”及"404 Not Found"等一类错误信息。缺省设置为:negative_ttl 5 minutes  
2.positive_dns_ttl time-units  
说明:设置缓存成功的DNS查询结果的生存时间。缺省为6小时。  
positive_dns_ttl 6 hours  
3.negative_dns_ttl time-units  
说明:设置缓存失败的DNS查询结果的生存时间。缺省为5分钟。  
negative_dns_ttl 5 minutes  
4.connect_timeout time-units  
说明:设置squid等待连接完成的超时值。缺省值为2分钟。  
connect_timeout 120 seconds  
5.read_timeout time-units  
说明:如果在指定的时间内squid尚未从被请求的服务器读入任何数据,则squid将终止该客户请求。缺省值为15分钟。  
read_timeout 15 minutes  
6.request_timeout  
说明:设置在建立与客户的连接后,squid将花多长时间等待客户发出HTTP请求。缺省值为30秒。  
request_timeout 30 seconds  
7.client_lifetime time-units  
说明:设置客户在与squid建立连接后,可以将该连接保持多长时间。  
注意,因为客户建立的每个连接都会消耗一定的系统资源,所以如果你是为一个大型网络提供代理服务的话,一定要正确地修改该值。因为如果同一时间的 连接数量太大的话,可能会消耗大量的系统资源,从而导致服务器宕机。缺省值为1天,该值太大了,建议根据你自己的情况适当减小该值。  
client_lifetime 1 day  
8.half_closed_clients on/off  
说明:有时候由于用户的不正常操作,可能会使与squid的TCP连接处于半关闭状态,  
这时候,该TCP连接的发送端已经关闭,而接收端正常工作。缺省地,squid将一直保持这种处于半关闭状态的TCP连接,直到返回套接字的读写 错误才将其关闭。如果将该值设为off,则一旦从客户端返回“no more data to read”的信息,squid就立即关闭该连接。 half_closed_clients on  
9.pconn_timeout  
说明:设置squid在与其他服务器和代理建立连接后,该连接闲置多长时间后被关闭。缺省值为120秒。  
pconn_timeout 120 seconds  
10.ident_timeout  
说明:设置squid等待用户认证请求的时间。缺省值为10秒。  
ident_timeout 10 seconds  
11.shutdown_lifetime time-units  
说明:当收到SIGTERM 或者 SIGHUP 信号后, squid将进入一种shutdown pending的模式,等待所有活动的套接字关闭。在过了shutdown_lifetime所定义的时间后,所有活动的用户都将收到一个超时信息。缺省值为30秒。  
shutdown_lifetime 30 seconds  

5.1.7管理参数选项  
1.cache_mgr  
说明:设置管理员邮件地址。缺省为:  
cache_mgr root  
2. cache_effective_user  
cache_effective_group  
说明:如果用root启动squid,squid将变成这两条语句指定的用户和用户组。缺省变为squid用户和squid用户组。注意这里指定 的用户和用户组必须真是存在于/etc/passwd中。如果用非root帐号启动squid,则squid将保持改用户及用户组运行,这时候,你不能指 定小于1024地http_port。  
cache_effective_user squid  
cache_effective_group squid  
3.visible_hostname  
说明:定义在返回给用户的出错信息中的主机名。  
如: visible_hostname www-cache.foo.org  
4.unique_hostname  
说明:如果你有一个代理服务器阵列,并且你为每个代理服务器指定了同样的“visible_hostname”,同时你必须为它们指定不同的“unique_hostname”来避免“forwarding loops ”(传输循环)发生。  

5.1.8其它杂项  
1. dns_testnames  
说明:设置进行DNS查询测试,如果第一个站点解析成功则立即结束DNS查询测试。如果你不愿意进行DNS查询测试,就不要去掉缺省的设置。  
#dns_testnames netscape.com internic.net nlanr.net microsoft.com  
2.logfile_rotate  
说明:通常,squid会定期的将日志文件更名并打包。比如正在使用的日志文件为access.log,squid会将其更名并打包为access.log.1.gz;过了一定时间后,squid又会将  
access.log.1.gz更名为access.log.2.gz并将当前的日志文件更名并打包为access.log.1.gz,以此循 环。logfile_rotate所指定的数字即为打包并备份的文件的数量,当达到这一数目时,squid将删除最老的备份文件。缺省值为10。如果你想 手动来进行这些操作,你可以用logfile_rotate 0来取消自动操作。  
3.err_html_text  
说明:用该语句定义一个字符串变量,可以用%L在返回给用户的错误信息文件中引用。错误信息文件通常在/etc/squid/errors目录中,这是一些用HTML写成的脚本文件,你可以自己修改它。  
4.deny_info  
说明:你可以定制自定义的拒绝访问信息文件,并且可以和不同的用户列表相关联。当用户被http_access相关规则拒绝时,squid可以向用户显示你自定义的相应的拒绝访问信息文件。语法为:  
Usage: deny_info err_page_name acl  
比如:  
deny_info ERR_CUSTOM_ACCESS_DENIED bad_guys  
5.memory_pools on|off  
说明:如果你将该项设为on,则squid将保留所有已经分配(但是未使用)的内存池以便在将来使用。缺省为on.  
memory_pools on  
6.log_icp_queries on|off  
说明:设置是否对ICP请求作日志。如果你的系统负载很大,你可以用off来取消该功能。缺省为:  
log_icp_queries on  
7.always_direct  
说明:该选项允许你指定某些用户类,squid将这些用户类的请求直接转发给被请求的服务器。语法为:  
always_direct allow|deny [!]aclname ...  
如:直接转发FTP请求可以这样设置:  
acl FTP proto FTP  
always_direct allow FTP  
8.never_direct  
说明:与always_direct相反。语法为:  
Usage: never_direct allow|deny [!]aclname ...  
比如,为了强制除了本地域的其他用户使用代理服务器,你可以这样设置:  
acl local-servers dstdomain foo.net  
acl all src 0.0.0.0/0.0.0.0  
never_direct deny local-servers  
never_direct allow all  
9.icon_directory  
说明:指明向用户传送错误信息时所用到的图标文件的目录。缺省路径为: icon_directory /usr/lib/squid/icons  
10.error_directory  
说明:指明向用户传送错误信息所用到的错误描述文件的目录。缺省路径为:  
error_directory /etc/squid/errors  

5.2 用户认证设置  
缺省的,squid本身不带任何认证程序,但是我们可以通过外部认证程序来实现用户认证。一般说来有以下的认证程序:  
1.LDAP认证:你可以访问以下资源来获取更多的有用信息。  
http://www.geocities.com/ResearchTriangle/Thinktank/5292/projects/ldap/  
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/ldap_auth.tar.gz  
2.SMB认证:可以实现基于NT和samba的用户认证。更多的信息请访问以下资源。  
http://www.hacom.nl/~richard/software/smb_auth.html  
3.基于mysql的用户认证。  
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/mysql_auth.c  
4.基于sock5密码用户认证。  
http://nucleo.freeservers.com/  
5.基于Radius 的用户认证。  
http://home.iae.nl/users/devet/squid/proxy_auth/contrib/auth.pl  
但是我们一般常用的是用ncsa实现的认证和用smb_auth实现的基于NT和samba的用户认证。下面我们就来讲这两种认证方法的具体实现。  

5.2.1 ncsa用户认证的实现  
ncsa是squid源代码包自带的认证程序之一,下面我们以squid-2.3.STABLE2版本为例讲述ncsa的安装和配置。  
1.从www.squid-cache.org下载squid源代码包squid-2.3.STABLE2-src.tar.gz并放到/tmp目录下。  
2.用tar解开:  
tar xvzf squid-2.3.STABLE2-src.tar.gz  
%make  
%make install  
3.然后,进入/tmp/squid-2.3.STABLE2/auth_modules/NCSA目录。  
% make  
% make install  
编译成功后,会生成ncsa_auth的可执行文件。  
4.拷贝生成的执行文件ncsa_auth到/usr/bin目录  
cp ncsa_auth /usr/bin/bin  
5.修改squid.conf中的相关选项如下所示:  
authenticate_program /usr/local/squid/bin/ncsa_auth /usr/bin/passwd  
6.定义相关的用户类  
acl auth_user proxy_auth REQUIRED  
注意,REQUIRED关键字指明了接收所有合法用户的访问。  
7.设置http_access  
http_access allow auth_user  
注意,如果你在改行中指定了多个允许访问的用户类的话,应该把要认证的用户类放在第一个。如下所示:  
错误的配置:http_access allow auth_user all manager  
正确的配置:http_access allow auth_user manager all  
8.利用apache携带的工具软件htpasswd在/usr/local/squid/etc下生成密码文件并添加相应的用户信息。一般说来,该密码文件每行包含一个用户的用户信息,即用户名和密码。  
用htpasswd生成密码文件passwd并添加用户bye。  
htpasswd -c /usr/local/squid/etc/passwd bye  
然后重新启动squid,密码认证已经生效。  

5.2.2 smb用户认证的实现  
国内介绍并使用ncsa实现用户认证的文章不多,而使用smb_auth和samba实现基于NT的用户认证我还没有看到过,下面我们就来看一看在squid中实现基于NT的用户认证。  
当前smb_auth的最高版本是smb_auth-0.05,你可以在以下地址下载。当然,squid的源代码包中也包含smb_auth,但是是0.02版的。  
http://www.hacom.nl/~richard/software/smb_auth-0.05.tar.gz  
smb_auth的主页地址是http://www.hacom.nl/~richard/software/smb_auth.html。  
1.系统需求:  
squid2.0以上版本。  
安装samba2.0.4以上版本。你并不需要运行samba服务,因为smb_auth只用到了 samba的客户端软件。  
2.下载smb_auth-0.05.tar.gz并复制到/tmp.  
3.tar xvzf smb_auth-0.05.tar.gz  
4.根据你的要求修改Makefile中的SAMBAPREFIX和INSTALLBIN参数。SAMBAPREFIX指定了你的samba安装路径,INSTALLBIN指明了smb_auth的安装路径。我们指定:  
SAMBAPREFIX=/usr,INSTALLBIN=/usr/bin.  
5.make  
6.make install,成功后会在INSTALLBIN指定路径中生成可执行文件smb_auth.  
7.按下列步骤设置你要用于认证的主域控制器:  
首先在NETLOG共享目录中建立一个“proxy”文件,该文件只包含一个“allow”的字符串,一般说来,该NETLOG目录位于 winntsystem32Replimportscripts目录中;然后,设置所有你想让其访问squid的用户和用户组拥有对该文件的读的权力。  
8.修改squid.conf中的相关选项如下所示:  
authenticate_program /usr/local/squid/bin/smb_auth your_domain_name  
9.定义相关的用户类  
acl auth_user proxy_auth REQUIRED  
注意,REQUIRED关键字指明了接收所有合法用户的访问。  
10.设置http_access  
http_access allow auth_user  
注意,如果你在改行中指定了多个允许访问的用户类的话,应该把要认证的用户类放在第一个。如下所示:  
错误的配置:http_access allow auth_user all manager  
正确的配置:http_access allow auth_user manager all  
如果一切正确的话,然后重新启动squid,密码认证已经生效。  
说明:smb_auth的调用方法:  
1.smb_auth -W your_domain_name  
用your_domain_name指定你的域名。smb_auth将进行广播寻找该主域控制器。  
2.smb_auth -W your_domain_name -B  
如果你有多个网络接口,可以用-B 指定用于广播的网络接口的ip地址。  
3.smb_auth -W your_domain_name -U  
也可以用-U直接指定该主域控制器的ip地址。  
4.smb_auth -W your_domain_name -S share  
可以用-S指定一个不同于NETLOG的共享目录。  

5.2.3 squid.conf中关于认证的其他设置  
1.authenticate_children  
说明:设置认证子进程的数目。缺省为5个。如果你处于一个繁忙的网络环境中,你可以适当增大该值。  
2.authenticate_ttl  
说明:设置一次认证的有效期,缺省是3600秒。  
3.proxy_auth_realm  
说明:设置用户登录认证时向用户显示的域名。  

5.3透明代理的设置  
关于透明代理的概念我们已经在第一节将过了,下面我们看一下怎么样在squid中实现透明代理。  
透明代理的实现需要在Linux 2.0.29以上,但是Linux 2.0.30并不支持该功能,好在我们现在使用的通常是2.2.X以上的版 本,所以不必担心这个问题。下面我们就用ipchains+squid来实现透明代理。在开始之前需要说明的是,目前我们只能实现支持HTTP的透明代 理,但是也不必太担心,因为我们之所以使用代理,目的是利用squid的缓存来提高Web的访问速度,至于提供内部非法ip地址的访问及提高网络安全性, 我们可以用ipchains来解决。  
实现环境:RedHat6.x+squid2.2.x+ipchains  

5.3.1 linux的相关配置  
确定你的内核已经配置了以下特性:  
[*] Network firewalls  
[ ] Socket Filtering  
[*] Unix domain sockets  
[*] TCP/IP networking  
[ ] IP: multicasting  
[ ] IP: advanced router  
[ ] IP: kernel level autoconfiguration  
[*] IP: firewalling  
[ ] IP: firewall packet netlink device  
[*] IP: always defragment (required for masquerading)  
[*] IP: transparent proxy support  
如果没有,请你重新编译内核。一般在RedHat6.x以上,系统已经缺省配置了这些特性。  

5.3.2squid的相关配置选项  
设置squid.conf中的相关选项,如下所示:  
http_port 3218  
httpd_accel_host virtual  
httpd_accel_port 80  
httpd_accel_with_proxy on  
httpd_accel_uses_host_header on  
说明:  
1.http_port 3128  
在本例中,我们假设squid的HTTP监听端口为3128,即squid缺省设置值。然后,把所有来自于客户端web请求的包(即目标端口为80)重定向到3128端口。  
2.httpd_accel_host virtual  
httpd_accel_port 80  
这两个选项本来是用来定义squid加速模式的。在这里我们用virtual来指定为虚拟主机模式。80端口为要加速的请求端口。采用这种模式时,squid就取消了缓存及ICP功能,假如你需要这些功能,这必须设置httpd_accel_with_proxy选项。  
3.httpd_accel_with_proxy on  
该选项在透明代理模式下是必须设置成on的。在该模式下,squid既是web请求的加速器,又是缓存代理服务器。  
4.httpd_accel_uses_host_header on  
在透明代理模式下,如果你想让你代理服务器的缓存功能正确工作的话,你必须将该选项设为on。设为on时,squid会把存储的对象加上主机名而不是ip地址作为索引。这一点在你想建立代理服务器阵列时显得尤为重要。  

5.3.3 ipchains的相关配置  
ipchains在这里所起的作用是端口重定向。我们可以使用下列语句实现将目标端口为80端口的TCP包重定向到3128端口。  
#接收所有的回送包  
/sbin/ipchains -A input -j ACCEPT -i lo  
#将目标端口为80端口的TCP包重定向到3128端口  
/sbin/ipchains -A input -p tcp -d 0.0.0.0/0 80 -j REDIRECT 80  
当然在这以前,我们必须用下面的语句打开包转发功能。  
echo 1 >; /proc/sys/net/ipv4/ip_forward 

squid的dns配置问题转

近期发现修改squid服务器的dns server配置后,无法生效,需要手工重启所有squid,今天查了一下,squid对dns的支持是这样一个原理:

1、如果dns server发送域名时带有ttl,则以此ttl为准,一般dns server都会带有对ttl的支持,现在我用的dnsmasq默认ttl是0。

2、如果dns server没发送ttl(ttl=0),squid就以自己的配置positive_dns_ttl为准,这个配置默认是6小时。

3、原先squid里配置的一个negative_dns_ttl,证实是配错了,这个配置指的是squid在取不到域名(出错)的情况下会多久再去重取。

我原先的情况是positive_dns_ttl和dns server的ttl都没有配置而配置了negative_dns_ttl,这时squid以默认的positive_dns_ttl为准,即6小时,这个时间对web服务器来说太长了。当前我解决的办法是修改dns server的ttl为60
秒,squid配置没有修改。因为直接修改squid的positive_dns_ttl配置项也是可以的。

有些朋友可能是用bind来做的dns,bind可能默认的ttl并不是0,所以用positive_dns_ttl配置不起效的话,修改ttl值就好。

附:检测dns服务器ttl值的方法

在一台linux机器上,修改/etc/resolv.conf将dns指向到要测试的dns,然后执行

dig test.com

如果该dns能解析test.com,就会返回一系列数据,其中有一列指明了ttl值,一试即知。

Squid使用总结(安装、配置、优化...,转)

1. 编译和安装

暂时使用CENTOS 5.2上缺省安装的2.6STABLE7版本

2. squid配置

2.1 最简单配置

http_port 80
cache_peer 127.0.0.1   parent    8080  0 no-query default originserver  name=bes
acl all src all
http_access allow all

access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log

2.2 监控管理

acl snmppublic snmp_community public
snmp_port 3401
snmp_access allow snmppublic localhost
snmp_access deny all

2.3 更安全的配置

acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443        # https
acl Safe_ports port 80        # http
acl Safe_ports port 443        # https
acl purge method PURGE
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all

cache_effective_user squid
cache_effective_group squid

2.4打开相关性能告警

high_response_time_warning 1000
high_page_fault_warning xxx
high_memory_warning xxx

2.5 其他

visible_hostname proxy.hostname

3. 调试

3.1 在配置文件中设置debug_options ALL,9
3.2 cache.log
3.3 squid -XF 
3.4 squid -k parse  分析配置文件语法

4. 网络相关优化

4.1 减少TIME_WAIT套接字数量

#vi /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024    65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
#/sbin/sysctl -p
详见http://blog.s135.com/read.php?338

5. DISK IO相关的优化

5.1 cache_dir设置的考虑

• cache_dir采用二级目录方式保存cache object,做配置时不宜过大,建议为规划容量的1倍,否则建立swap目录会花费较多时间。推荐保留10%的空间。这些额外的空间用于存放squid的swap.state文件和临时文件。
• 可以配置多个cache_dir,建议每个cache_dir都放在不同的物理硬盘上,以改善IO效率

5.2 squid相关的目录设置

• log和cahce_dir不要放在一个物理盘上
• cache_dir所在的盘建议使用ReiserFS格式
• mount cache_dir盘时建议使用noatime参数

5.3 DISK Cache的相关设置

• max_open_disk_fds
This directive defines an upper limit on the number of file descriptors that Squid should open for reading and writing cache files on disk. 当达到这个限制后,squid会跳过DISK cache,从而避免IO持续恶化。
缺省为0(无限制)。[建议]For a single disk cache, 900 is a good choice.  For a dual disk cache, try 1400. 
• max_filedescriptors 
允许打开的最大文件描述符,实际允许打开的数量也受编译squid的--with-maxfd的影响。缺省为0。[建议]
• maximum_object_size
maximum_object_size 1024 KB
• cache_swap_low/cache_swap_high  ???

5.4 Linux设置

• filedescriptors
一共有两个方面的限制: 整个系统,当前用户。
http://prefetch.net/blog/index.php/2009/07/31/increasing-the-number-of-available-file-descriptors-on-centos-and-fedora-linux-servers/

整个系统:

动态调整,每次启动后该设置会丢失:

#ulimit -HSn 4096

 

在/etc/sysctl.confg中设置:
# vi /etc/sysctl.conf
fs.file-max = 100000
# sysctl -p
[ulimit显示的值和/proc/sys/fs/file-max中显示的值有什么关系]
ulimit command provides control over the resources available to the shell and to processes started by it, on systems that allow such control. The maximum number of open file descriptors displayed with following command

 

#vi /etc/security/limits.conf

单个用户

* - nofile 8192

6. MEM优化考虑

• cache_mem
Squid占用内存量似乎不受这个参数的控制,此参数不必设得太大,适量就行。服务器:cache_mem 100 MB
• maximum_object_size_in_memory:
设置较小的maximum_object_size_in_memory值有助于有效控制squid过度占用内存
• client_db off
• The ratio of memory-to-disk can be important. We recommend that you have at least 32 MB of RAM for each GB of disk space that you plan to use for caching. 

7. CPU优化相关

Squid is a single process application and can not make use of SMP. If you want to make Squid benefit from a SMP system you will need to run multiple instances of Squid and find a way to distribute your users on the different Squid instances just as if you had multiple Squid boxes. 

8. 其他问题

 

8.1 和Redirect合作的关系
8.2 log rotate

定期进行log rotate

8.3 cachemgr.cgi

 

 

9. 参考资料

 

squid TCP_NEGATIVE_HIT 缓存错误页面时间 negative_ttl

由于页面问题或web服务器临时不可用,会导致squid缓存一个错误信息(400,500等错误),正好是首页出错并被老板发现了。。。。
如何不缓存这些错误页面呢?


要想不缓存错误页面据说可以设成negative_ttl 1 second
# TAG: negative_ttl    time-units 
#       Time-to-Live (TTL) for failed requests. Certain types of     
#       failures (such as "connection refused" and "404 Not Found") are
#       negatively-cached for a configurable amount of time. The
#       default is 5 minutes. Note that this is different from
#       negative caching of DNS lookups

状态:
TCP_NEGATIVE_HIT

在对原始服务器的请求导致HTTP错误时,Squid也会cache这个响应。在短时间内对这些资源的重复请求,导致了否命中。 negative_ttl指令控制这些错误被cache的时间数量。请注意这些错误只在内存cache,不会写往磁盘。下列HTTP状态码可能导致否定 cache(也遵循于其他约束): 204, 305, 400, 403, 404, 405, 414, 500, 501, 502, 503, 504。



TCP_MEM_HIT

Squid在内存cache里发现请求资源的有效拷贝,并将其立即发送到客户端。注意这点并非精确的呈现了所有从内存服务的响应。例如,某些cache在内存里,但要求确认的响应,会以TCP_REFRESH_HIT, TCP_REFRESH_MISS等形式记录。

TCP_IMS_HIT

客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝。Squid发送更新的内容到客户端,而不联系原始服务器。

 

-----------------------------------

 


通过域名访问 返回 400错误,通过ip地址访问没问题

查看squid 日志发现 TCP_NEGATIVE_HIT/400 错误

由于squid 默认设置 会缓存错误页面,主要用来防止服务不可用攻击

修改配置文件

negative_ttl 1 second

暂时解决问题

 

关于squid对gzip压缩的支持(支持nginx,IIS,apache)

通常Web服务器都会通过gzip压缩来减少用户下载的流量,提高页面打开速度。

gzip压缩分为两种,http1.0压缩和http1.1压缩,这两种压缩的压缩方法和response header都一样,只是客户端和服务器通讯的http协议不同。

Squid2.7之前,是不支持http1.1的。在2.7版本开始,有限支持http1.1。从3.0版本开始,才完整的支持http1.1。但是因为squid3是完全重构的,很多2.7的功能并没有加到3.0当中,所以squid3并没有被大规模的应用在生产系统中,基本上都还是使用 squid2.6或2.7来进行内容加速,所以需要搞定Squid支持各种Web服务器的HTTP1.0 GZIP压缩。

具体配置:

1, 配置Web服务器,支持HTTP1.0压缩

    Apache, 默认就支持http1.0压缩,不需要特定配置

    IIS, 通过修改MetaBase.xml第三段IIsCompressionSchemes中的

    * HcNoCompressionForHttp10="TRUE"
    * HcNoCompressionForProxies="TRUE"
    * HcNoCompressionForRange="FALSE"

    将HcNoCompressionForHttp10="TRUE" 修改为FALSE

    Nginx, 修改nginx.conf中的gzip_version配置项,修改为gzip_version http1.0;

    配置后,再发http1.0的压缩请求到nginx,就能够获得压缩后的内容。

2, 配置Squid,支持对http1.0压缩内容的缓存

    首先,将cache_vary设置成on。使squid能够缓存带有vary头的内容

    然后,将broken_vary_encoding设置成all。squid.conf.default中,这个参数的示例是

    acl apache rep_header Server ^Apache
    broken_vary_encoding allow apache

这个挺有趣,我理解这个参数应该是很早加入的,那时候web服务器还是apache一家的天下。所以作者直接就写了一个allow apache,并一直沿用至今。

这个参数是针对那些压缩前和压缩后etag完全一致的web服务器,让squid通过vary头来区分压缩和未压缩的内容。事实上,现在 apache已经不需要通过broken_vary_encoding来区分vary头了。Apache会修改经过压缩的内容的etag头, 在原来的etag后面加上-gzip。用来区分压缩和非压缩内容。而其他的web服务器都没有这样的功能。都需要通过配置 broken_vary_encoding来支持。

通过配置上面两个参数,你就可以配置squid正确的缓存Apache,IIS,Nginx输出的压缩内容。

上面介绍的方法,已经经过实际环境的验证并稳定运行了近一年,没有出现过压缩缓存失效的情况。

Squid 限制用户并发连接数

client_db  on
acl client_10 src 192.168.0.0/32
acl maxconnect maxconn 10
http_access deny client_10 maxconnect
 
-------------------------
查了一下,该错误是因为打开的文件数超过了linux的限制造成的。因此对系统和squid配置文件进行了修改:
1)对系统进行修改,取消对打开文件数的限制。
  ulimit -HSn 65535
    为了防止重启后失效,在/etc/profile文件中增加该命令。
    查看是否生效,使用命令:ulimit -n
2)修改squid配置文件,增加并发数
    打开配置文件:gedit ../squid/etc/squid.conf
    a) 增加如下内容:acl OverConnLimit maxconn 2000
    b) 将以前的设置"http_access deny all" 修改为 "http_access allow all"

squid store.log文件说明

13.3 store.log

store.log记录Squid关于存储或删除cache目标的决定。对每个存在cache里的目标、每个不可cache的目标、以及每个被轮换策略删除的目标,Squid都会创建相应的日志条目。该日志文件内容既包含了内存cache又包含了磁盘cache。

store.log提供了下述不能从access.log获取的内容:

  • 1)某个特定的响应是否被cache。
  • 2)cache目标的文件号。对UFS基础的存储机制,你可转换该文件号到路径名,并且检查cache文件的内容。
  • 3)响应的内容长度:包括Content-Length值和实际的body大小。
  • 4)Date, Last-Modified, 和Expires头部的值。
  • 5)响应的cache关键字(例如MD5哈希值)。

如你所见,这些都是相对低级的信息,在日常管理中可能用不上。除非你要做专业的分析,或打算debug某程序,否则store.log可有可无。可以如下来禁止它:

cache_store_log none

跟其他日志文件一样,Squid将最新的日志条目写到该文件的末尾。某个给定的URI可能出现在日志文件里多次。例如,它先被cache,然后删除,接着又cache住。仅仅最近来的日志条目才反映目标的当前值。

store.log是文本基础的,看起来如下:

1067299212.411 RELEASE -1 FFFFFFFF A5964B32245AC98592D83F9B6EA10B8D 206

    1067299212 1064287906 -1 application/octet-stream 6840/6840

    GET http://download.windowsupdate.com/msdownload/update/v3-19990518/cab...

1067299212.422 SWAPOUT 02 0005FD5F 6F34570785CACABC8DD01ABA5D73B392 200

    1067299210 1057899600 -1 image/gif 1125/1125

    GET http://forum.topsportsnet.com/shf./images/nav_members1.gif

1067299212.641 RELEASE -1 FFFFFFFF B0616CB4B7280F67672A40647DD08474 200

    1067299212 -1 -1 text/html -1/67191

    GET http://www.tlava.com/

1067299212.671 RELEASE -1 FFFFFFFF 5ECD93934257594825659B596D9444BC 200

    1067299023 1034873897 1067299023 image/jpeg 3386/3386

    GET http://ebiz0.ipixmedia.com/abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a...

1067299212.786 RELEASE -1 FFFFFFFF B388F7B766B307ADEC044A4099946A21 200

    1067297755 -1 -1 text/html -1/566

    GET http://www.evenflowrocks.com/pages/100303pic15.cfm

1067299212.837 RELEASE -1 FFFFFFFF ABC862C7107F3B7E9FC2D7CA01C8E6A1 304

    1067299212 -1 1067299212 unknown -1/0

    GET http://ebiz0.ipixmedia.com/abc/ebiz/_EBIZ_3922eabf57d44e2a4c3e7cd234a...

1067299212.859 RELEASE -1 FFFFFFFF 5ED2726D4A3AD83CACC8A01CFDD6082B 304

    1066940882 1065063803 -1 application/x-javascript -1/0

    GET http://www.bellsouth.com/scripts/header_footer.js

每个日志条目包含如下13个域:

  • 1. 时间戳

    事件何时发生,表现为Unix纪元以来的秒数,它是毫秒级的。
  • 2. 动作
  • cache目标发生的动作。该域有3个可能值:SWAPOUT,RELEASE,和SO_FAIL。

    • 1)SWAPOUT在Squid成功的存储目标到磁盘时发生。某些目标例如那些消极cache的,仅保存在内存而不是磁盘,Squid不会在store.log里记录它们。
    • 2)SO_FAIL表明Squid不能完整的存储目标到磁盘。多半意味着存储机制拒绝以写方式打开新的磁盘文件。
    • 3)RELEASE在Squid从cache里删除目标,或首先就决定响应不可存储时发生。
  • 3. 目录号
  • 目录号是十进制小数形式,它是个到cache目录的7位索引。对没有存储到磁盘的目标,该域包含-1值。
  • 4. 文件号
  • 文件号是25位的标识符,内在的被squid使用。它被写成8字符的十六进制号。对UFS基础的存储机制,有算法可以转换文件号到路径名(见13.3.1节)。没有存储到磁盘的目标,没有有效的文件号。对这些目标,该域的值是FFFFFFFF。仅仅在RELEASE和SO_FAIL情况下才会出现这个值。
  • 5. cache关键字

    Squid使用MD5哈希值作为主要的索引来定位目标。该关键字基于请求方式、URI、和其他可能的信息计算得来。可以从cache关键字来查找store.log条目。然而请注意,目标的cache关键字可能改变。当Squid在access.log里记录TCP_REFRESH_MISS请求时,这点会发生。情况类似如下:
    1065837334.045 SWAPOUT ... 554BACBD2CB2A0C38FF9BF4B2239A9E5 ... http://blah
    
    1066031047.925 RELEASE ... 92AE17121926106EB12FA8054064CABA ... http://blah
    
    1066031048.074 SWAPOUT ... 554BACBD2CB2A0C38FF9BF4B2239A9E5 ... http://blah
    发生了什么呢?该目标原本cache在某个关键字下(554B...)。一段时间后,Squid接受到对该目标的另一请求,并转发确认请求到原始服务器。当响应以新内容返回时,Squid改变旧目标的cache关键字(92AE...),以便它能授予新目标正确的关键字(554B...)。然后旧目标删除,新目标存储到磁盘。
  • 6. 状态码
  • 该域显示响应的HTTP状态码,跟access.log一样。表13.1是状态码列表。
  • 7. 日期
  • HTTP响应的Date头部值,表现为Unix纪元以来的秒数。值-1表示Date头部不可解析,-2意味着头部完缺。
  • 8. 最后修改时间
  • HTTP响应的Last-Modified头部值,表现为Unix纪元以来的秒数。值-1表示Last-Modified头部不可解析,-2意味着头部完缺。
  • 9. 过期时间
  • HTTP响应的Expires头部值,表现为Unix纪元以来的秒数。值-1表示Expires头部不可解析,-2意味着头部完缺。
  • 10. 内容类型
  • HTTP响应的Content-Type头部值,排除了任何media-type参数。假如Content-Type丢失了,Squid插入值unknown。
  • 11. 内容长度/大小
  • 该域包含2个数字,以斜杠分开。第一个是Content-Length头部值。-1表明Content-Length头部不存在。第二个是HTTP消息body的实际大小。你可使用这2个数字来部分的验证接受到的响应,并验证原始服务器是否不正确的计算了内容长度。大多数情形下,这2个数字相等。
  • 12. 方式
  • 请求目标的HTTP方式,跟access.log里的一样。
  • 13. URI
  • 最后一个域是请求URI,跟access.log里的一样。该域也有前述章节提到的空格问题。然而,这里不必为此担忧,因为你可安全的忽略任何多余的域。
  • 对许多RELEASE的条目,在最后8个域出现的是疑问号(?)。这是因为这些域的大部分值来自squid称为MemObject的结构。该结构仅在目标已被接受时,或目标被完整存储在内存时,才会出现。Squid cache里的大部分目标没有MemObject结构,因为它们仅存在于磁盘。对这些情况,Squid在相应域放置一个疑问号。

squid日志格式处理

先看看squid原始文档怎么解释吧 
#  TAG: logformat
#       Usage:
#
#       logformat <name> <format specification>
#
#       Defines an access log format.
#
#       The <format specification> is a string with embedded % format codes
#
#       % format codes all follow the same basic structure where all but
#       the formatcode is optional. Output strings are automatically escaped
#       as required according to their context and the output format
#       modifiers are usually not needed, but can be specified if an explicit
#       output format is desired.
#
#               % ["|[|'|#] [-] [[0]width] [{argument}] formatcode
#
#               "       output in quoted string format
#               [       output in squid text log format as used by log_mime_hdrs
#               #       output in URL quoted format
#               '       output as-is
#
#               -       left aligned
#               width   field width. If starting with 0 the
#                       output is zero padded
#               {arg}   argument such as header name etc
#
#       Format codes:
#
#               %       a literal % character
#               >a      Client source IP address
#               >A      Client FQDN
#               >p      Client source port
#               <A      Server IP address or peer name
#               la      Local IP address (http_port)
#               lp      Local port number (http_port)
#               <la     Local IP address of the last server or peer connection
#               <lp     Local port number of the last server or peer connection
#               ts      Seconds since epoch
#               tu      subsecond time (milliseconds)
#               tl      Local time. Optional strftime format argument
#                               default %d/%b/%Y:%H:%M:%S %z
#               tg      GMT time. Optional strftime format argument
#                               default %d/%b/%Y:%H:%M:%S %z
#               tr      Response time (milliseconds)
#               dt      Total time spent making DNS lookups (milliseconds)
#
#       HTTP cache related format codes:
#
#               [http::]>h      Original request header. Optional header name argument
#                               on the format header[:[separator]element]
#               [http::]>ha     The HTTP request headers after adaptation and redirection.
#                               Optional header name argument as for >h
#               [http::]<h      Reply header. Optional header name argument
#                               as for >h
#               [http::]un      User name
#               [http::]ul      User name from authentication
#               [http::]ui      User name from ident
#               [http::]us      User name from SSL
#               [http::]ue      User name from external acl helper
#               [http::]>Hs     HTTP status code sent to the client
#               [http::]<Hs     HTTP status code received from the next hop
#               [http::]Ss      Squid request status (TCP_MISS etc)
#               [http::]Sh      Squid hierarchy status (DEFAULT_PARENT etc)
#               [http::]mt      MIME content type
#               [http::]rm      Request method (GET/POST etc)
#               [http::]ru      Request URL
#               [http::]rp      Request URL-Path excluding hostname
#               [http::]rv      Request protocol version
#               [http::]et      Tag returned by external acl
#               [http::]ea      Log string returned by external acl
#               [http::]<st     Sent reply size including HTTP headers
#               [http::]>st     Received request size including HTTP headers. In the
#                               case of chunked requests the chunked encoding metadata
#                               are not included
#               [http::]>sh     Received HTTP request headers size
#               [http::]<sh     Sent HTTP reply headers size
#               [http::]st      Request+Reply size including HTTP headers
#               [http::]<sH     Reply high offset sent
#               [http::]<sS     Upstream object size
#               [http::]<pt     Peer response time in milliseconds. The timer starts
#                               when the last request byte is sent to the next hop
#                               and stops when the last response byte is received.
#               [http::]<tt     Total server-side time in milliseconds. The timer
#                               starts with the first connect request (or write I/O)
#                               sent to the first selected peer. The timer stops
#                               with the last I/O with the last peer.
#logformat squid %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
#logformat squidmime %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt [%>h] [%<h]
#logformat common %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh
#logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
#Default:
# none

{} modifier or argument. Also used to specify header names
>  request (client)  客户请求
<  reply (server)    服务端回应
a  address           访问用户ip地址
A  address name      访问用户电脑名称
h  all headers       浏览器头信息
i  ident               
p  port                 端口
r  request line (no query)
t  time   访问时间
u  user
l  local address/port (where request was accepted)  
     
自己squid配置文件日志格式定义如下:
logformat cccdn  %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %tr "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh

Records:6412345678