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

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. 参考资料

 

dns,bind

一、DNS常识
1、DNS查询:分为递归查询和迭代查询两种
  (1) 递归查询: 即客户端向本地DNS服务器请求查询域名,本地DNS服务器收到查询任务后如自身无法回答则向其他服务器查询,直到查到结果后返回结果给客户端。期间DNS服务器可能要查询很多其他DNS服务器。
(2)迭代查询:即客户端向本地服务器请求查询域名,本地DNS服务器无法回答,则给客户端返回另一个能查询域名的服务器地址,客户端再向另一服务器查询,期间可能客户端需查询多个DNS服务器,最终查到结果。

2、DNS服务器分类:

DNS服务器分为:
(1)master(主DNS服务器):拥有区域数据的文件,并对整个区域数据进行管理。
(2)slave(从服务器或叫辅助服务器):拥有主DNS服力器的区域文件的副 本,辅助主DNS服务器对客户端进行解析,当主DNS服务器坏了后,可以完全接替主服务器的工作。
(3)forward:将任何查询请求都转发给其他服务器。起到一个代理的作用。
(4)cache:缓存服务器。
(4)hint:根DNS internet服务器集。

 

【主机名或域名】ttl] [calss] [type] [orgin] [mail] 
主机名或域名:一般 用@代替。每个区域都有自已的SOA记录,此处的为指定的域名。用@表示当前的源,也可以手工指定域名。
ttl:通常省略
class:类别,SOA记录的类别对internet乖哦说缺省为IN
type:类型,SOA记录的类型就是SOA,指明哪个DNS服务器对这个区域有授权。
origin:域区文件资 源,这个域区文件源就是这个域主DNS服务器的主机名,注意这里要求是完整的主机名,后面一定要加上“."。上例中:www.29zjt.com.  而不是www.29zjt.com  如果没有加后面的点,结果将是:www.29zjt.com.29zjt.com
mail:一般指管理员的邮箱。但和一般 的邮箱不同,用"."代替了"@",尾部也 要加上“."


       2009121001  //作为版本控制,当域区文件修改时,序号就增加,辅助服务器对比发现与自已的不同后,就会做出更新,与主服力器同步
       28800  //辅助服务器与主服务器进行更新的等待时间。间隔多久与主服务器进行更新,单位为秒。
      14400    //重试间隔。当辅助服务器请求与主服务器更新失败后,再间隔多久重试传递
       720000  //到期时间。当辅助服务器与主服务器之间刷新失败后,辅助服务器还提供多久的授 权回答。因为当与主服务器失去联系一定时间后,(这个时间就是此处定义的时间),辅助服务器会把本地数据当作不可靠的数据,将停止提供查询。
如果主服务器恢复正常,则辅助服务器重新开始计时。
       86400 )  //最小TTL,即最小有效时间,表明客户端得到的回答在多长时间内有效。如果TTL时间长,客户端缓存保存时间长,客户端在收到查询结果时开始计时(TTL)时间内有相同的查询周日不再查询服输务器,直接查自已的缓存。如果TTL时间短,则缓存更新的频率快

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

暂时解决问题

 

rpmforge-release

php正则判断必须是字母或数字的组合及ctype function使用

if(preg_match("/^[0-9a-zA-Z]{3,12}$/",$variable)){
              echo "<script>alert('只能是英文字母或数字, 且长度必须是3-12个字');history.back(-1);</script>";die;
}

//其实判断是否是字母和数字或字母数字的组合还可以用PHP ctype_alnum函数
if(!ctype_alnum($vipurl)){
echo '只能是字母或数字的组合';exit;
}

顺便复习下ctype functions
1.ctype_alnum(string $text)://不用说了,检查是否是字母或数字或字母数字的 组合
2.ctype_alpha(string $text):check for alphabetic character(s) //检查字符串是否是字母
3.ctype_cntrl(string $text):check for control character(s) //是否是控制字符如\n,\r,\t
4.ctype_digit(strint $text):check for numeric character(s) //是否是数字表示的字符

大多数时也许应该用is_numeric
这个要特别注意与is_numeric()的区别
例:$numeric_string='42';
$interger = 42;
ctype_digit($numeric_string);//true
ctype_digit($interger);//false
is_numeric($numeric_string); //true
is_numeric($interger); //true


5.ctype_graph(string $text):Check for any printable character(s) except space
6.ctype_lower():check for lowercase character(s)//检查是否是小写字母
7.ctype_upper():check for uppercase character(s)//检查是否是大写字母
8.ctype_space: check for whitespace character(s)//是否是空白字符
9.ctype_xdigit: check for character(s) representing a hexadecimal digit//检查是否是十六进制数字

关于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在相应域放置一个疑问号。