Squid 3.0 反向代理安装笔记(Linux) (三)

十,配置(仅供参考)
    http_port 80 accel vhost vport
#选项 http_port 指定squid监听HTTP请求的端口,一般都设置成80端口,这样使用户感觉不到反向代理的存在,就像访问真正 的WEB服务器一样。设定squid为accel加速模式,vhost必须要加.否则将无法将主机头转发至后端服务器,访问时就会出现无法找到主机头的错 误
    cache_peer   192.168.0.10      parent    80 0 no-query round-robin max-conn=32 originserver name=img
   cache_peer_domain img   img.xxx.com
# squid2.5以上都是用的cache_peer来指定所需要代理的服务器的IP 这一点很重要! 由于本例squid 与web 不在同一服务器,因此需要cache_peer 指定相应WEB服务器IP
  
    #acl
   acl manager proto cache_object
   acl localhost src 127.0.0.1/255.255.255.255
   acl SSL_ports port 443 563
   acl Safe_ports port 80       # http
   acl Safe_ports port 8080
   acl LanDstDM dstdomain . yourdomain.com

   acl CONNECT method CONNECT
   http_access allow manager localhost
   http_access deny manager
   http_access deny !Safe_ports
   http_access deny CONNECT !SSL_ports

   http_access deny   all

   #base
   visible_hostname img-cache.xxx.cn
#设定squid的主机名,如无此项squid将无法启动
   cache_mgr cache@xxx.org
   cache_effective_user squid
   cache_effective_group squid

   error_directory /usr/local/squid3/share/errors/Simplify_Chinese
   icon_directory /usr/local/squid3/share/icons
   mime_table /usr/local/squid3/etc/mime.conf

   cache_replacement_policy lru
   #cache_dir
cache_dir ufs /var/tmp 10000 16 256
#100G其中1层目录16个 并且每个1层目录下又有256个2层目录[或者说子目录]
#磁盘缓存的类型和目录,大小,一二级目录的设置,这里磁盘缓存大小是10G
ufs是一种文件存储方式 因为os一般都是从内存获取数据 那么内存的东西必须最后写的硬盘上~
sync 同步的时候用的ufs 那么squid也是一样
ufs一般是同时写入内存和硬盘
注意:size是按照M为单位的也就这个目录中最大存储容量的上限

   cache_mem 2048 MB
#共享内存大小(squid在提供服务的时候所使用的内存)
   max_open_disk_fds 0
   maximum_object_size 512 KB
   maximum_object_size_in_memory 256 KB
#最大内存缓存OBJECT值~如果超过则不再内存中缓存~而存入IO中!

   #keepalived
   client_persistent_connections off
   server_persistent_connections on
   #persistent_request_timeout 60 seconds

   memory_pools on
   memory_pools_limit 64 MB

   forwarded_for on
   log_icp_queries off

   via on
   httpd_suppress_version_string off

   ie_refresh off
   tcp_recv_bufsize 32 KB

   #acl webservices rep_header Server -i ^Apache ^nginx
   #broken_vary_encoding allow webservices

   #hidden the squid header
   #reply_header_access Server deny all
   #reply_header_access X-Cache deny all
   #reply_header_access Warning deny all
   #reply_header_access Expires deny all
   #reply_header_access Cache-Control deny all
   #reply_header_access age deny all

   #reply_header_access All deny all

   ipcache_size 1024
   ipcache_low 90
   ipcache_high 95

memory_replacement_policy lru
   #替换机制 (lru叫做 最近不常用的单元 unit一般就是常说的object 也就是当cache中的内容比如内存或硬盘达到上限时的 那么就需要进行数据的换进和换出工作

   hosts_file /etc/hosts
   request_header_max_size 128 KB
   #deny cache
   hierarchy_stoplist cgi-bin ? .php
   acl QUERY urlpath_regex cgi-bin? .php .css
   acl DIRECT url_regex -i ^http://www.yourdomain.org/$
   acl DIRECT url_regex -i ^http://photo.yourdomain .org/.*$
   acl DIRECT url_regex -i ^http://www.yourdomain .org/index.html$

   cache deny QUERY
   cache deny DIRECT
   #request_body_max_size 0 KB

refresh_pattern ^ftp:           60      20%     10080
refresh_pattern ^gopher:        60      0%      1440
refresh_pattern .               0       20%     1440
#refresh_pattern -i .css$       360    50%     2880    reload-into-ims
refresh_pattern -i .js$        1440    50%     2880    reload-into-ims
refresh_pattern -i .html$        720   50%     1440    reload-into-ims
refresh_pattern -i .jpg$       1440    50%     2880    ignore-reload
refresh_pattern -i .gif$       1440    50%     2880    ignore-reload
refresh_pattern -i .swf$       1440    50%     2880    ignore-reload
refresh_pattern -i .jpg$       1440      50%     2880    ignore-reload
refresh_pattern -i .png$       1440      50%     2880      ignore-reload
refresh_pattern -i .bmp$       1440      50%     2880      ignore-reload

refresh_pattern -i .doc$ 1440    50%     2880      ignore-reload
refresh_pattern -i .ppt$ 1440    50%     2880      ignore-reload
refresh_pattern -i .xls$ 1440    50%     2880      ignore-reload
refresh_pattern -i .pdf$ 1440    50%     2880      ignore-reload
refresh_pattern -i .rar$       1440    50%     2880      ignore-reload
refresh_pattern -i .zip$ 1440    50%     2880      ignore-reload
refresh_pattern -i .txt$ 1440    50%     2880      ignore-reload

quick_abort_min 20 KB
quick_abort_max 20 KB
quick_abort_pct 95

connect_timeout 1 minute
negative_ttl 0 minutes
read_timeout 30 seconds
pconn_timeout 120 seconds
shutdown_lifetime 5 seconds
strip_query_terms off

# snmp
#snmp_port 3401
#acl snmppublic snmp_orgmunity snsimg
#snmp_access allow snmppublic localhost
#snmp_access deny all

acl snmppublic snmp_orgmunity public
snmp_port 3401
snmp_access allow snmppublic all

icp_port 0

# logfile
emulate_httpd_log on
logformat orgbined %{X-Forwarded-For}>h %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
#设置access_log中日志存储的格式

access_log /usr/local/squid3/var/logs/access.log squid   
#access_log为客户端请求的日志 

cache_log /usr/local/squid3/var/logs/cache.log     #为squid自身的运行日志 
pid_filename /usr/local/squid3/var/logs/squid.pid #此三项是设置PID和日志文件位置
cache_store_log none 不记录store.log
logfile_rotate 12

# MISCELLANEOUS
store_objects_per_bucket 15
client_db off
其他设置
在这里我所以的日志都记录在:/usr/local/squid3/var/logs里
给目录相应的权限
chmod -R 777 /usr/local/squid3/var/
chmod -R 777 /usr/local/squid3/var/logs/

十一.测试
/usr/local/squid2/sbin/squid -z 
Create swap directories 是创建SWAP目录的! 也就是cache_dir 中的目录
启动squid
/usr/local/squid3/sbin/squid -Nd1
ps aux |grep squid 查看是否启动

十二 , squid 常用命令
Squid安装设试命令:

1,初始化你在 squid.conf 里配置的 cache 目录
#/usr/local/squid/sbin/squid -z     //初始化缓存空间
如果有错误提示,请检查你的 cache目录的权限。

2,对你的squid.conf 排错,即验证 squid.conf 的 语法和配置。
#/usr/local/squid/sbin/squid -k parse
如果squid.conf 有语法或配置错误,这里会返回提示你,如果没有返回,恭喜,可以尝试启动squid。

3,在前台启动squid,并输出启动过程。
#/usr/local/squid/sbin/squid -N -d1
如果有到 ready to server reques,恭喜,启动成功。
然后 ctrl + c,停止squid,并以后台运行的方式启动它。

4,启动squid在后台运行。
#/usr/local/squid/sbin/squid -s
这时候可以 ps -A 来查看系统进程,可以看到俩个 squid 进程。

5,停止 squid
#/usr/local/squid/sbin/squid -k shutdown
这个不用解释吧。

6,重引导修改过的 squid.conf
#/usr/local/squid/sbin/squid -k reconfigure //载入新的配置文件
这个估计用的时候比较多,当你发现你的配置有不尽你意的时候,可以随时修改squid.conf,然后别忘记对你的 squid.conf排错,然后再执行此指令,即可让squid重新按照你的 squid.conf 来运行。

7./usr/local/squid/sbin/squid -k rotate 轮循日志

8,把squid添加到系统启动项
编辑 /etc/rc.d/rc.local
添加如下行: /usr/local/squid/sbin/squid -s
利用Runc脚本……..

再来点其他的。
1,修改cache 缓存目录的权限。
#chown -R squid:squid /data/cache
我的cache缓存目录是 /data/cache,squid执行用户和用户组是 squid,squid。

2,修改squid 日志目录的权限
#chown -R squid:squid /usr/local/squid/var/logs
这一步并不是适合每一个使用squid的用户.意为让squid有权限在该目录进行写操作 。
例如生成 access.log    cache.log   store.log

3,查看你的日志文档。
#more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT
该指令可以看到在squid运行过程中,有那些文件被squid缓存到内存中,并返回给访问用户。
#more /usr/local/squid/var/logs/access.log | grep TCP_HIT
该指令可以看到在squid运行过程中,有那些文件被squid缓存到cache目录中,并返回给访问用户。
#more /usr/local/squid/var/logs/access.log | grep TCP_MISS
该指令可以看到在squid运行过程中,有那些文件没有被squid缓存,而是现重原始服务器获取并返回给访问用户。
关于 TCP_XXXX 等参数及代表的信息,请参看《squid中文权威指南》13.2.1 章节。
当然,本例中的蓝色文字是可以修改为其他的参数,例如你的域名 www.xxxx.com ,同样可以看到access.log里关于该域名的行。

二.squid命中率分析

squid/bin/squidclient -p 80 mgr:info
squid/bin/squidclient -p 80 mgr:5min
可以看到详细的性能情况,其中PORT是你的proxy的端口,5min可以是60min

取得squid运行状态信息: squidclient -p 80 mgr:info
*取得squid内存使用情况: squidclient -p 80 mgr:mem
*取得squid已经缓存的列表: squidclient -p 80 mgrbjects. use it carefully,it may crash
*取得squid的磁盘使用情况: squidclient -p 80 mgr:diskd
*强制更新某个url:squidclient -p 80 -m PURGE http://www.yejr.com/static.php
*更多的请查看:squidclient-h 或者 squidclient -p 80 mgr:

查命中率:
/usr/local/squid/bin/squidclient -h111.222.111.111 -p80 mgr:info
/usr/local/squid/bin/squidclient -h具体的IP -p80 mgr:info

参考资料

http://liuyu.blog.51cto.com/183345/66507

http://bbs.linuxtone.org/viewthread.php?tid=1442&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D10

http://bbs.linuxtone.org/viewthread.php?tid=1114&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D10

http://wiki.ubuntu.org.cn/Squid%E9%85%8D%E7%BD%AE%E8%AF%A6%E8%A7%A3
http://blog.s135.com/book/squid/chap03.html#a0
http://blog.s135.com/book/squid/chap04.html
http://bbs.linuxtone.org/thread-137-1-1.html
http://bbs.chinaunix.net/viewthread.php?tid=1349363
http://bbs.chinaunix.net/viewthread.php?tid=1377948

Squid 3.0 反向代理安装笔记(Linux) (一)

转自:http://hi.baidu.com/billdkj/blog/item/05da07f49af379d1f2d38599.html

一.反向代理的概念
        什么是反向代理呢?其实,反向代理也就是通常所说的WEB服务器加速,它是一种通过在繁忙的WEB服务器和Internet之间增加一个高速的WEB缓冲 服务器(即:WEB反向代理服务器)来降低实际的WEB服务器的负载。典型的结构如下图所示:

        Web服务器加速(反向代理)是针对Web服务器提供加速功能的。它作为代理Cache,但并不针对浏览器用户,而针对一台或多台特定Web服务器(这也 是反向代理名称的由来)。实施反向代理(如上图所示),只要将Reverse Proxy Cache设备放置在一台或多台Web服务器前端即可。当互联网用户访问某个WEB服务器时,通过DNS服务器解析后的IP地址是Reverse Proxy Server的IP地址,而非原始Web服务器的IP地址,这时Reverse Proxy Server设备充当Web服务器,浏览器可以与它连接,无需再直接与Web服务器相连。因此,大量Web服务工作量被卸载到反向代理服务上。不但能够防 止外部网主机直接和web服务器直接通信带来的安全隐患,而且能够很大程度上减轻web服务器的负担,提高访问速度。

二.反向代理工作原理
反向代理服务器位于本地WEB服务器和Internet之间,如下图所示:
          当用户浏览器发出一个HTTP请求时,通过域名解析将请求定向到反向代理服务器(如果要实现多个WEB服务器的反向代理,需要将多个WEB服务器的域名都 指向反向代理服务器)。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据(比如html网页和图片等),而一些CGI脚本程序或者ASP之类 的程序不缓存。它根据从WEB服务器返回的HTTP头标记来缓冲静态页面
三.环境

操作系统:CentOS 5.2
Squid    :squid-3.0.STABLE13

四.准备1.可以用下述命令获得squid
wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE13.tar.gz
2.建立squid用户
useradd squid -M -c "Squid user" -d /dev/null -s /sbin/nologin
3.配置参数详解

–prefix=/usr/local/squid3 :
       指定squid日志,二进制文件和配置文件的默认位置,squid会将var目录也放在这下面,在这个目录下面会有日志文件,日志文件通常会很大,因此建议将其放在较大的磁盘下面,你可以使用 —localstatedir 选项。
–localstatedir=/bigdisk/var
       指定var目录的安装位置
–enable-dlmalloc[=LIB]
       在一些系统上,内建的内存分配机制(malloc)在使用squid时表现不尽人意。使用–enable-dlmalloc选项将squid源代码包中 的dlmalloc包编译和链接进来。假如你的系统中已安装dlmalloc,你能使用=LIB参数指定库的路径。请 http://g.oswego.edu/dl/html/malloc.html更多关于dlmalloc的信息。
–enable-gnuregex
        在访问控制列表和其他配置指令里,squid使用正则表达 式作为匹配机制。GNU的正则表达式库包含在squid的源代码包里;它可以在没有内建正则表达式的操作系统中使用。./configure脚本侦察你系 统中的正则表达式库,假如必要,它可以激活使用GNU正则表达式。如果因为某些理由,你想强制使用GNU正则表达式,你可以将这个选项加 到./configure命令后。
–enable-async-io[=N_THREADS]
       异步I/O是squid技术之一,用以提升存储性能。aufs模块使用大量的线程来执行磁盘I/O操作。该代码仅仅工作在linux和solaris系统 中。=N_THREADS参数改变squid使用的线程数量。aufs 在多cup 系统上优势更为明显,设置的线程数量不要过多。squid默认根据缓存目录的数量,自动计算需要使用多少线程。
–enable-removal-policies=’heap,lru’
       排除策略是squid需要腾出空间给新的cache目标时,用以排除旧目标的机制。squid-2.5支持3个排除策略:最少近期使用(LRU),贪婪对偶大小(GDS),最少经常使用(LFU)。。LRU是默认的,它以双链表数据结构执行。
–enable-delay-pools
       延时池是squid用于传输形状或带宽限制的技术。该池由大量的客户端IP地址组成。当来自这些客户端的请求处于cache丢失状态,他们的响应可能被人工延迟。
–enable-snmp
       简单网络管理协议(SNMP)是监视网络设备和服务器的流行方法。该选项导致编译过程去编译所有的SNMP相关的代码,包括一个裁切版本的CMU SNMP库。
–enable-cachemgr -hostname[=hostname]
       cachemgr是一个CGI程序,你能使用它来管理查询squid。默认cachemgr的hostname值是空的,但你能使用该选项来指定一个默认值
–enable-htcp
       HTCP是超文本缓存协议–类似于ICP的内部缓存协议。
–enable-ssl
       使用该选项赋予squid终止SSL/TLS连接的能力。注意这仅仅工作在web加速器中用以加速请求。
–with-openssl[=DIR]
       假如必要,你使用该选项来告诉squid到哪里找到OpenSSL库或头文件。假如它们不在默认位置,在该选项后指定它们的父路径。例如:
% ./configure –enable-ssl –with-ssl=/opt/foo/openssl
       在这个例子中,你的编译器将在/opt/foo/openssl/include目录中找头文件,在/opt/foo/openssl/lib中找库文件。
–enable-cache-digests
       Cache消化是ICP的另一个替代,但有着截然不同的特性。
–enable-err-languages="Simplify_Chinese"
–enable-default-err-languages="Simplify_Chinese"

       上面两个选项告诉Squid编入并使用简体中文错误信息。
       squid支持定制错误消息,错误消息可以用多种语言报告。该选项指定复制到安装目录($prefix/share/errors)的语言。假如你不使用 该选项,所有可用语言被安装。想知道何种语言可用,请见源代码包里errors目录下的目录列表。
五,调整内核

     Squid在高负载下,需要大量的内核资源。特别的,你需要给你的系统配置比正常情况更高的文件描述符和缓存。文件描述符的限制通常很恼人。你最好在开始编译squid之前来增加这些限制的大小。

因为这点,你可能为了避免重建内核的麻烦,而倾向于使用预编译的二进制版本。不幸的是,不管如何你必须重建一个新内核。squid和内核通过数据结 构来交换信息,数据结构的大小不能超过设置的文件描述符的限制。squid在运行时检查这些设置,并且使用最安全的(最小的)值。这样,即使预编译的二进 制版本有比你的内核更高的文件描述符,但还是以你系统内核的实际数值为主。

为了改编一些参数,你需要重建新内核。这个过程在不同的操作系统之间不同。假如需要,请参阅Unix系统管理员手册(Prentice Hall出版)或者你的操作系统文档。假如你正使用Linux,可能不必重建内核

六.文件描述符

文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix通常有一个系统级的限制。

因 为squid的工作方式,文件描述符的限制可能会极大的影响性能。当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述 符导致拒绝服务。直到一部分当前请求完成,相应的文件和socket被关闭,squid不能接收新请求。当squid发现文件描述符短缺时,它会发布警 告。

在运行./configure之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。大多数情况下,1024个文件描述符足够了。非常忙的cache可能需要4096或更多。在配置文件描述符限制时,我推荐设置系统级限制的数量为每个进程限制的2倍。

通常在你的Unix shell中能找到系统的文件描述符限制。所有的C shell及其类似的shell有内建的limit命令。更新的Bourne shell及其类似的shell有一条叫做ulimit的命令。为了发现你的系统的文件描述符限制,试运行如下命令:

在我们的Linux下运行:

# ulimit -n
1024

很显然1024可能无法满足需求,重新设置

# ulimit -HSn 65536
# ulimit -n
65536

需要将ulimit -HSn 65536设置在/etc/rc.d/rc.local中,防止重启后失效, 花费时间来增加这个限制值的大小。否则,squid在高负载时执行性能将很低。

当然你还可以在每一次系统启动后执行上述echo和ulimit命令,或者至少在squid启动之前。假如你使用某个rc.d脚本来启动squid,那是一个放置这些命令的好地方。
七,临时端口范围

临时端口是TCP/IP栈分配给出去连接的本地端口。换句话说,当squid发起一条连接到另一台服务器,内核给本地socket分配一个端口号。这些本地端口号有特定的范围限制。例如,在FreeBSD上,默认的临时端口范围是1024-5000。

临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些TCP连接在它们被关闭时进入TIME_WAIT状态。当连接进入TIME_WATI状态时,临时端口号不能被重用。

你能使用netstat命令来显示有多少个连接进入这个状态:
% netstat -n | grep TIME_WAIT

Proto Recv-Q Send-Q Local Address          Foreign Address        (state)

tcp4       0      0 192.43.244.42.19583    212.67.202.80.80       TIME_WAIT

tcp4       0      0 192.43.244.42.19597    202.158.66.190.80      TIME_WAIT

tcp4       0      0 192.43.244.42.19600    207.99.19.230.80       TIME_WAIT

tcp4       0      0 192.43.244.42.19601    216.131.72.121.80      TIME_WAIT

tcp4       0      0 192.43.244.42.19602    209.61.183.115.80      TIME_WAIT

tcp4       0      0 192.43.244.42.3128     128.109.131.47.25666   TIME_WAIT

tcp4       0      0 192.43.244.42.3128     128.109.131.47.25795   TIME_WAIT

tcp4       0      0 192.43.244.42.3128     128.182.72.190.1488    TIME_WAIT

tcp4       0      0 192.43.244.42.3128     128.182.72.190.2194    TIME_WAIT

注意这个例子中既有客户端连接又有服务器端的连接。客户端连接有3128作为临时端口号,服务器端连接有80作为远程主机的端口号。临时端口号出现在本地地址栏里。在该例子里,它们是19000秒。

在Linux上,简单的写一对数字到下列指定文件:

# echo "1024 40000" > /proc/sys/net/ipv4/ip_local_port_range

不要忘记将这些命令加到你的系统启动脚本中,以使机器每一次重启后都生效。
八,安装

tar -zxvf squid-3.0.STABLE13.tar.gz

cd squid-3.0.STABLE13

./configure –prefix=/usr/local/squid3 –enable-dlmalloc –enable-gnuregex –enable-async-io –enable-removal-policies=’heap,lru’ –enable-delay-pools –disable-snmp –enable-storeio=’ufs,aufs,null’ –disable-wccp –enable-kill-parent-hack –disable-select –enable-auth=basic –with-aio –disable-ident-lookup –with-filedescriptors=65536 –enable-err-languages="Simplify_Chinese" –enable-default-err-languages="Simplify_Chinese"

make

make install

Squid 3.0 反向代理安装笔记(Linux) (二)

九,配置基本知识(摘自squid中文指南)

基本知识:

Squid的配置文件相对规范。它与其他许多unix程序相似。每行以配置指令开始,后面跟着数字值或关键字。在读取配置文件时,squid忽略空行和注释掉的行(以#开始)。如下是一些配置行示例:

cache_log /squid/var/cache.log

# define the localhost ACL

acl Localhost src 127.0.0.1/32

connect_timeout 2 minutes

log_fqdn on

某些指令取唯一值。在这些情形下,重复赋予该指令不同的值,将覆盖前面的值。例如,下面是一个连接超时值。第一行无效,因为第二行覆盖了它:

connect_timeout 2 minutes

connect_timeout 1 hour

另外,某些指令取列表值。在这些情形下,每一个新增的值都有效。"扩展方式"指令以这种方法工作:

extension_methods UNGET

extension_methods UNPUT

extension_methods UNPOST

对这些基于列表的指令,你通常能在同一行中赋予多个值:

extension_methods UNGET UNPUT UNPOST

许多指令有通用类型。例如,连接超时值是一个时间规范,在数字后面跟着时间单元。例如:

connect_timeout 3 hours

client_lifetime 4 days

negative_ttl 27 minutes

类似的,大量的指令指向文件大小或者内存额度。例如,你可以这样编写大小规范:十进制数字后面跟bytes,KB,MB或GB.例如:

minimum_object_size 12 bytes

request_header_max_size 10 KB

maximum_object_size 187 MB

另一种值得提起的类型是触发器,它的值是on或者off。许多指令使用该类型。例如:

server_persistent_connections on

strip_query_terms off

prefer_direct on

通常,配置文件指令能以任何顺序出现。然而,如果某个指令指向的值被其他指令所定义,那么顺序就很重要。访问控制列表是个好的例子。acl被用在http_access规则之前必须被定义:

acl Foo src 1.2.3.4

http_access deny Foo

squid.conf文件里的许多东西是大小写敏感的,例如指令名。你不能将http_port写成HTTP_port。

默认的squid.conf文件包含了对每个指令的大量注释,以及指令的默认值。例如:

# TAG: persistent_request_timeout

# How long to wait for the next HTTP request on a persistent

# connection after the previous request completes.

##Default:

# persistent_request_timeout 1 minute

每次安装squid后,当前默认配置文件存放在$prefix/etc目录下的squid.conf.default。既然指令每次都有所改变,你能参考该文档,以获取最近的更新。

User ID

你可能知道,unix进程和文件拥有文件和组属主的属性。你必须选择某个用户和组给squid。该用户和组的组合,必须对大部分squid相关的文件和目录有读和写的权限。

我高度推荐创建名为"squid"的用户和组。这避免了某人利用squid来读取系统中的其他文件。假如不止一个人拥有对squid的管理权限,你可以将他们加到squid组里。

unix进程继承了它们父进程的属主属性。那就是说,假如你以joe用户来启动squid,squid也以joe来运行。假如你不想以joe来运行squid,你需要预先改变你的用户ID。这是su命令的典型功能。例如:

joe% su – squid

squid% /usr/local/squid/sbin/squid

不幸的是,运行squid并非总是如此简单。在某些情况下,你必须以root来启动squid,这依赖于你的配置。例如,仅仅root能绑定TCP套接字 到 特权端口上,如80。假如你必须以root来启动squid,你必须设置cache_effective_user指令。它告诉squid,在执行完需要 特别权限的任务后,变成哪个用户。例如:

cache_effective_user squid

你提供的该名字必须是有效用户(在/etc/passwd文件里)。请注意仅仅当你以root来启动squid时,你才需要用到该指令。仅仅root有能力来随意改变用户身份。假如你以joe来启动squid,它不能改变到squid用户。

你 可能尝试不设置cache_effective_user,直接以root来运行squid。假如你试过,你会发现squid拒绝运行。这违背了安全规 则。假如外部攻击者有能力危及或利用squid,他能获取对系统的全部访问权。尽管我们努力使squid安全和少bug,但还是稳重点好。

假 如你没有设置cache_effective_user,以root来启动squid,squid使用nobody作为默认值。不管你选择什么用户ID, 请确认它有对下面目录的读访问权:$prefix/etc,$prefix/libexec,$prefix/share.该用户ID也必须有对日志文件 和缓存目录的写访问权。

squid也有一个cache_effective_group指令,但你也许不必设置它。默认的,squid使用cache_effective_user的默认组(从/etc/passwd文件读取)。

端口号

http_port指令告诉squid在哪个端口侦听HTTP请求。默认端口是3128:

http_port 3128

假如你将squid作为加速器运行(见15章),你也许该将它设为80。

你能使用附加的http_port行,来指示squid侦听在多个端口上。假如你必须支持客户组(它们被配置得不一致),这点就经常有用。例如,来自某个部门的浏览器发送请求到3128,然而另一个部门使用80端口。简单的将两个端口号列举出来:

http_port 3128

http_port 8080

你也能使用http_port指令来使squid侦听在指定的接口地址上。当squid作为防火墙运行时,它有两个网络接口:一个内部的和一个外部的。你可能不想接受来自外部的http请求。为了使squid仅仅侦听在内部接口上,简单的将IP地址放在端口号前面:

http_port 192.168.1.1:3128
日志文件路径

你现在你关注的唯一事情是,squid将它的日志放在何处。默认的日志目录是squid安装位置下的logs 目录。例如,假如你在./configure时没有使用–prefix=选项,那么默认的日志文件路径是/usr/local/squid/var /logs.

你必须确认日志文件所存放的磁盘位置空间足够。在squid写日志时如果接受到错误,它会退出和重启。该行为的主要理由应引起你的注意。squid想确认你不会丢失任何重要的日志信息,特别是你的系统被滥用或者被攻击时。

squid 有三个主要的日志文件:cache.log,access.log,store.log.第一个文件即cache.log,包含状态性的和调试性的消息。 当你刚开始运行squid时,你应密切的关注该文件。假如squid拒绝运行,理由也许会出现在cache.log文件的结尾处。在正常条件下,该文件不 会变得很大。也请注意,假如你以-s选项来运行squid,重要的cache.log消息也可被送到你的syslog进程。通过使用cache_log指 令,你可以改变该日志文件的路径:

cache_log /squid/logs/cache.log

access.log文件包含了对squid发起的每个客户请求的单一行。每行平均约150个字节。也就是说,在接受一百万条客户请求后,它的体积约是150M。请使用cache_access_log指令来改变该日志文件的路径:

cache_access_log /squid/logs/access.log

假 如因为某些理由,你不想squid记录客户端请求日志,你能指定日志文件的路径为/dev/null. store.log文件对大多数cache管理员来说并非很有用。它包含了进入和离开缓存的每个目标的记录。平均记录大小典型的是175-200字节。然 而,squid不在store.log里对cache点击创建接口,所以它比access.log包含少得多的记录。请使用 cache_store_log指令来改变它的位置:

cache_store_log /squid/logs/store.log

通过指定路径为none,你能轻易的完全禁止store.log日志:

cache_store_log none

假 如你不小心,squid的日志文件增加没有限制。某些操作系统对单个文件强制执行2G的大小限制,即使你有充足的磁盘空间。超过该限制会导致写错误,这样 squid就会退出。为了保证日志文件大小合理,你应创建任务来有规律的重命名和打包日志。squid有内建功能来使这个容易做到。请见13.7章关于日 志轮循的解释。
访问控制

现在,我只讲述少量的访问控制方法,以使热心的读者能快速开始使用squid。

squid 默认的配置文件拒绝每一个客户请求。在任何人能使用代理之前,你必须在squid.conf文件里加入附加的访问控制规则。最简单的方法就是定义一个针对 客户IP地址的ACL和一个访问规则,告诉squid允许来自这些地址的HTTP请求。squid有许多不同的ACL类型。src类型匹配客户IP地 址,squid会针对客户HTTP请求检查http_access规则。这样,你需要增加两行:

acl MyNetwork src 192.168.0.0/16

http_access allow MyNetwork

请将这些行放在正确的位置。http_access的顺序非常重要,但是acl行的顺序你不必介意。你也该注意默认的配置文件包含了一些重要的访问控制,你不应该改变或删除它们,除非你完全理解它们的意义。在你第一次编辑squid.conf文件时,请看如下注释:

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

在该注释之后,以及"http_access deny all"之前插入你自己的新规则。为了彻底说明,如下是一个合理的初始访问控制配置,包括推荐的默认控制和早先的例子:

acl All src 0/0

acl Manager proto cache_object

acl Localhost src 127.0.0.1/32

acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1025-65535

acl SSL_ports 443 563

acl CONNECT method CONNECT

acl MyNetwork src 192.168.0.0/16

http_access allow Manager Localhost

http_access deny Manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow MyNetwork

http_access deny All
可见主机名

希望你不必担心visible_hostname指令。然而,假如squid不能发现它所运行的机器的主机名,你就必须设置它。如果发生这样的事,squid抱怨和拒绝运行:

% squid -Nd1

FATAL: Could not determine fully qualified hostname. Please set ‘visible_hostname’

有大量的理由使squid需要知道主机名:

主机名出现在squid的错误消息里,这帮助用户验证潜在问题的源头。

主机名出现在squid转发的cache单元的HTTP Via头里。当请求到达原始主机时,Via头包含了在传输过程中涉及的代理列表。squid也使用Via头来检测转发环路。我将在第10章里讨论转发环路。

squid对特定事务使用内部URL,例如FTP目录列表的图标。当squid对FTP目录产生HTML页面时,它插入小图标用以指明该目录中的文件类型。图标URL包含了cache的主机名,以便web浏览器能直接从squid请求它们。

每 个从squid响应的HTTP回复包含了X-Cache头。这并非官方HTTP头。它是一个扩展头,用以指明该响应是cache点击还是cache丢失。 既然请求和响应可能经过多个cache,每个X-Cache头包含了cache报告点击或丢失的名字。如下是一个通过2个cache的响应示例:

HTTP/1.0 200 OK

Date: Mon, 29 Sep 2003 22:57:23 GMT

Content-type: text/html

Content-length: 733

X-Cache: HIT from bo2.us.ircache.net

X-Cache: MISS from bo1.us.ircache.net

squid 在启动时试图自动获取主机名。首先它调用gethostname()函数,这通常能返回正确的主机名。接着,squid调用 gethostbyname()函数尝试对主机名进行DNS查询。该函数典型的返回IP地址和系统的规范名。假如gethostbyname()成 功,squid在错误消息里,Via头里等地方使用这个规范名。

因为大量的理由,squid可能不能检测到它的规范主机名,包括:

主机名可能未设置。

主机名可能从DNS区域或/etc/hosts文件里丢失。

squid系统的DNS客户端配置可能不正确或丢失。在unix系统上,你该检查/etc/resolv.conf和/etc/host.conf文件。

假 如你看到上述的致命错误,你必须修正主机名和DNS信息,或者显式的给squid指明主机名。在大多数情况下,请确认"hostname"命令返回一个完 全规范的主机名,并且在/etc/hosts文件里增加这个接口。假如这样不成功,请在squid.conf里设置可见主机名:

visible_hostname squid.packet-pushers.net