封蜘蛛

#youdao
for i in 248 249 219 220 ; do iptables -I INPUT -s 61.135.$i.0/24 -p tcp --dport 80 -j DROP; done
for i in 44 46 64 74 75 154 158 156; do iptables -I INPUT -s 74.125.$i.0/24 -p tcp --dport 80 -j DROP; done
#Tomato Bot
for i in 93 125 94 104 120 88 19 61; do iptables -I INPUT -s 220.181.$i.0/24 -p tcp --dport 80 -j DROP; done
iptables -I INPUT -s 123.126.50.0/24 -p tcp --dport 80 -j DROP
iptables -I INPUT -s 123.126.68.0/24 -p tcp --dport 80 -j DROP
#bing bot
for i in 49 51 53 104 108 109 110 ; do iptables -I INPUT -s 65.52.$i.0/24 -p tcp --dport 80 -j DROP; done
for i in 115 165 25 3 4 37 51 55 ; do iptables -I INPUT -s 65.55.$i.0/24 -p tcp --dport 80 -j DROP; done
for i in 107 16 17 18 50 116 36 37 38 39; do iptables -I INPUT -s 157.55.$i.0/24 -p tcp --dport 80 -j DROP; done
for i in 0 1 2 ; do iptables -I INPUT -s 157.56.$i.0/24 -p tcp --dport 80 -j DROP; done
for i in 12 13 192 193 194 195 199 204; do iptables -I INPUT -s 207.46.$i.0/24 -p tcp --dport 80 -j DROP; done
#Yahoo
for i in `seq 0 6`; do iptables -I INPUT -s 110.75.17$i.0/24 -p tcp --dport 80 -j DROP; done
for i in `seq 0 5`; do iptables -I INPUT -s 67.195.11$i.0/24 -p tcp --dport 80 -j DROP; done
#web-sniffer
iptables -I INPUT -s 58.68.134.10 -p tcp --dport 80 -j DROP
#jikespider
for i in 220 221 219; do iptables -I INPUT -s 1.202.$i.0/24 -p tcp --dport 80 -j DROP; done
#search17
iptables -I INPUT -s 96.31.166.228 -p tcp --dport 80 -j DROP
#YandexBot
iptables -I INPUT -s 95.108.150.235 -p tcp --dport 80 -j DROP
iptables -I INPUT -s 95.108.151.244 -p tcp --dport 80 -j DROP
iptables -I INPUT -s 95.108.244.252 -p tcp --dport 80 -j DROP
iptables -I INPUT -s 95.108.247.252 -p tcp --dport 80 -j DROP
iptables -I INPUT -s 178.154.200.147 -p tcp --dport 80 -j DROP
iptables -I INPUT -s 178.154.200.158 -p tcp --dport 80 -j DROP
#MJ12bot
iptables -I INPUT -s 188.165.248.204 -p tcp --dport 80 -j DROP
iptables -I INPUT -s 173.236.21.106 -p tcp --dport 80 -j DROP
#qihoo
iptables -I INPUT -s 61.55.186.0/24 -p tcp --dport 80 -j DROP

discuz论坛附件递增备份脚本

#! /bin/bash
exec 1>/var/log/serverattbak.log 2>&1
soudir=web:/home/www/attachments
bakdir=/attachments/attbak/serverbak
d=`date --date "-1 day" +%y%m%d`
d2=`date  +%y%m%d`
w=`date +%w`
rs=/usr/bin/rsync
echo serverbak begin at `date`
[ -d $bakdir/server-$w ] || mkdir $bakdir/server-$w
if [ $w = "0" ]; then

        $rs -ar --delete $soudir/* $bakdir/server-$w/
else
        $rs -ar $soudir/day_$d/  $bakdir/server-$w/day_$d/
        $rs -ar $soudir/day_$d2/  $bakdir/server-$w/day_$d2/
        /usr/bin/find $bakdir/server-$w/ -type f -mmin +1600 |xargs rm -f
fi
echo serverbak end at `date`

分享我的一个脚本,检测程序更新,有更新做备份

达到的目的: 项目程序不定期更新,一旦有更新就需要做一次备份,但是一些日志,缓存,临时文件需要排除掉。#! /bin/bash

basedir="/data/web/"
bakdir="/data/web_backup"

while :; do
    cd $basedir
    sum=0
    for f in `ls|grep -v logs|grep -v tmp `; do
        n=`find  $f/ -type f -mmin -5 |wc -l`
        sum=$[$sum+$n]
    done
    prename=`date +%m%d%H%M`
    if [ $sum -gt "0" ]; then
        /usr/bin/rsync -a --exclude=logs --exclude=tmp $basedir $bakdir/$prename\_web
        cd $bakdir
        tar zcf  $prename\_web.tar.gz  $prename\_web
        rm -r $prename\_web
        /usr/bin/find $bakdir/  -mtime +2 |xargs rm -rf
    fi
    sleep 300
done
         

为远程服务器增加rsyncd的信任IP

#! /bin/bash

echo "Please input the new ip:"
read ip
echo "please input the web ip:"
read webip
echo "please input the db ip:"
read dbip

ip1=`echo $ip|awk -F'.' '{print $1"."$2"."$3}'`
ip2=$ip1.0\/24

change(){
    sed  -i "s#\(^hosts.*\)#& $ip2#g" $1
}

addip() {
    scp $1:/etc/rsyncd.conf /tmp/$1-rsyncd.conf >/dev/null
    if grep -q "$ip2" /tmp/$1-rsyncd.conf; then
        echo "$1 has been added the new ip."
    else
        change /tmp/$1-rsyncd.conf
        scp /tmp/$1-rsyncd.conf $1:/etc/rsyncd.conf >/dev/null && echo "$1 add new ip done."
    fi
}

addip $webip
addip $dbip
if grep -q $ip2 /etc/rsyncd.conf; then
    echo ""
else
    change /etc/rsyncd.conf
fi

shell中for的倒序循环

平时我们用惯了正序循环,可让你倒序输出时,怎么办?
比如 10-1  其实seq就可以实现

seq  1 10  这样其实是从1到10 都输出,那你知道seq到底是怎么用的吗?
其实在1 10 之间还有一个数,那就是增加的差值,默认就是1 ,所以  seq  1 10 等同于 seq 1 1 10
理所当然,你可以把差值弄成 -1
所以,倒序就这样得来了

seq  10 -1 1

用于for中就是这
for  i in `seq  10 -1 1`; do echo $i ; done

squid故障汇总

1、COSS will not function without large file support (off_t is 4 bytes long. Please reconsider recompiling squid with --with-large-files


Bungled squid_webcache.conf 。。。。。。。

检查是否在编译squid的时候未加入 --with-large-files 选项,如果是,重新加入此选项再编译一次squid



2、使用coss缓存格式的时候,squid不断重建cache

可能原因为maxfullbufs值过低,去掉maxfullbufs限制,让其值为无限



3、日志中有类似如下的内容:


2007/03/05 14:46:56| Ready to serve requests.

2007/03/05 14:46:59| clientReadRequest: FD 11 (192.168.1.5:34061) Invalid Request


Illegal character in hostname; underscores are not allowed


注释: 无效的字符串,访问地址中不允许下划线。

解决办法 :

squid 2.5 中,编译的时候加入如下参数

--enable-underscore


允许解析的URL中出现下划线,因为默认squid会认为带下划线的URL地址是非法的,并拒绝访问该地址。



对于 2.6 版本,编译时没有这个参数,这个参数出现在 squid.conf 的配置文档里,说明是这样的:



allow_underscore New option to allow _ in hostnames, replacing the similar build time configure option in 2.5 and earlier.



具体的在 squid.conf 中的参数,可以在配置文档里搜索一下 allow_underscore,看一下配置文档的具体注释。



4、squid的cache.log日志中又类似如下的警告:

WARNING: 100 swapin MD5 mismatches


这个错误是说squid读入一个缓存文件的时候,存储在接口对应的位置的URL不是

squid认为应该存储在那里的数据。这可能是swap.state有错误或文件指到了磁盘

上错误的块(文件系统有错误)。

停止squid应用,删除swap.state然后启动squid,让它通过读取缓存文件来重建缓存

记录,如果重建后仍然出现上面的情况,那应该就是文件系统或磁盘有问题了。


5、日志中出现下面警告:

Jun 28 11:14:38 localhost squid[27178]: squidaio_queue_request: Syncing pending I/O operations.. (blocking)

Jun 28 11:14:59 localhost squid[27178]: squidaio_queue_request: Synced

Jun 28 11:14:59 localhost squid[27178]: storeAufsOpenDone: (2) No such file or directory

Jun 28 11:14:59 localhost squid[27178]:         /data/squid/cache_webcache1/00/6B/00006B29

Jun 28 11:14:59 localhost squid[27178]: storeAufsOpenDone: (2) No such file or directory

Jun 28 11:14:59 localhost squid[27178]:         /data/squid/cache_webcache1/00/DC/0000DC36

Jun 28 11:14:59 localhost squid[27178]: WARNING: 1 swapin MD5 mismatches

Jun 28 11:14:59 localhost squid[27178]: WARNING: Disk space over limit: 18925740 KB > 16777216 KB

Jun 28 11:14:59 localhost squid[27178]: storeAufsOpenDone: (2) No such file or directory

Jun 28 11:14:59 localhost squid[27178]:         /data/squid/cache_webcache2/00/92/0000924F

Jun 28 11:14:59 localhost squid[27178]: storeAufsOpenDone: (2) No such file or directory

Jun 28 11:14:59 localhost squid[27178]:         /data/squid/cache_webcache1/03/6F/00036FB6

Jun 28 11:14:59 localhost squid[27178]: squidaio_queue_request: Async request queue growing uncontrollably!


解决方法:

检查配置文件,cache设置为aufs文件系统格式,将此设置改为ufs,重建cache缓存目录


6、运行reconfigure的时候出现squid: ERROR: no running copy



原因是找不到pid文件,如果不是使用默认的squid.conf作为squid 的设置文件,在用squid目录下sbin/squid进行重新启动等动作的时候要加上-f的参数制定配置文件,同时检查pid文件是否存在,有时候可能错误地配置了pid文件到不存在的目录,或者将pid文件配置到了应用没有权限写入的目录,导致没有创建pid文件,如果pid文件不存在,可以手工创建该pid,然后获取squid的pid并写人pid文件。


7、squid在压力大的情况下响应非常慢




检查是否文件描述符太小,如果是,调整文件描述符限制,重启squid,检查squid运行的文件描述符,如果为调整后的,则在启动脚本处启动squid的地方加入调整文件描述符的命令,否则除此外还需先调整文件描述符限制然后重新编译安装一次squid

8、缓存效率下降,查看日志无报错,netstat -na查看连接有比较多的连接为SYN_RE,且多为同一IP过来的连接

优化TCP网络

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

echo 1 > /proc/sys/net/ipv4/tcp_synack_retries

echo 1 > /proc/sys/net/ipv4/tcp_syn_retries


9、缓存效率低,网卡输入输出流量差距很小。

   首先查看系统日志有无squid的报错,如果没有再查看dmesg,看看有无丢包,是否网卡问题,如果没有再查看网关

   使用squid的时候网关问题关系重大,如果网关没有配置正确,将可能导致用户访问不了。


10、日志报如下错误:squid: Could not determine fully qualified hostname. Please set 'visible_hostname'

    检查/etc/hosts文件、/etc/sysconfig/network文件、和hostname命令结果,看看三者是否对应,如果不对应,需要修改为对应,并且/etc/hosts文件中对应的配置还需要有合法域名格式

   /etc/sysconfig/network中的hostname是系统启动时候加载的hostname值,如果此值与/etc/hosts文件中的值不对应并且squid中没有设置visible_hostname选项的话,会导致系统重启后squid不能正常启动。


11、日志大量报如下错误:

Apr 29 08:28:56 localhost squid[13851]: httpReadReply: Excess data from "HEAD http://192.168.230.1/"

Apr 29 08:28:56 localhost squid[13851]: httpReadReply: Excess data from "HEAD http://192.168.230.1/"


这表明服务器返回一个超过squid声明的响应对象最大值的返回值。

它违反了HTTP协议并导致服务器返回被截断。


12.runcache发现频繁重启后停止服务:

  :./bin/RunCache Running: squid -sY >> /usr/local/squid//var/squid.out 2>&1

  ./bin/RunCache: line 35: 20000 File size limit exceededsquid -NsY $conf >>$logdir/squid.out 2>&1

  ./bin/RunCache: line 35: 20177 File size limit exceededsquid -NsY $conf >>$logdir/squid.out 2>&1

  RunCache: EXITING DUE TO REPEATED, FREQUENT FAILURES

  故障原因: log超过了ext3文件系统最大支持容量2G导致,解决办法:

  1)每天轮循一次日志0 0 * * * /usr/local/squid/sbin/squid -k rotate

WARNING! Your cache is running out of filedescriptors


出现这个错误的原因是因为文件系统的描述符数量不够用了,linux系统默认是1024,可以通过 ulimit -n 查看,
解决办法是:
首先, ulimit -HSn 65535
然后要重新编译squid 编译时加上参数 --with-maxfd=65535

squid工作原理

一、SQUID缓存的存放方式:
每一台Squid 代理服务器上都有若干颗硬盘,每颗硬盘又分割成多个分区,每一个分区又可建立很多目录,目录下才放文件(Squid 把它叫object)。
二、SQUID的查询方式:
SQUID通过查询表的方式来定位某个资源的位置,所查询的表叫Hash table 和Digest table;Digest table在这里可以称之为摘要或者索引,它记录了磁盘上每个分区,每个目录里存的缓存摘要,Hash table在这里可以称之为目录或者提纲,它记录所有的Digest table表信息,SQUID接受到请求后先查询Hash table,在根据Hash table所指向的Digest table查询需要的信息。
三、SQUID服务器之间的关系:
SQUID服务器存在两种工作关系,一种为Child、Parent,当child squid server没有用户需要的数据时,就象parent server发出请求,并持续等待,直到parent server回应自己为止;另外一种为ibling,当本地SQUID server没有用户请求数据时,会向sibling server发出请求,如果sibling server没有资料则会向上级sibling或者INTERNET发送数据请求
四、SQUID运作模式
1. 当Squid Server 没有资料时,会先向Sibling 的Squid Server 要资料,如果Sibling没资料,就跳过它直接向Parent 要。
2. 向Parent 要资料,然後一直等,直到Parent 给它资料为止(Parent 自己有的资料或上Internet 去拿)。
3. 没有Parent 时,就自己上Internet 去拿。
4. 如果这三者都拿不到资料,才向用户端回报拿不到资料

squid防盗链的设置

squid主要应用于图片的缓存,一个大型综合网站,会有很多外边的网站来外链我们的图片,造成图片的访问量很大,从而造成带宽的极大浪费。squid的防盗链功能很好地预防了这种情况的发生。配置如下:

acl allowdomain referer_regex -i "/etc/squid/domain.txt" .aaaa.com  .bbbb.com   //这里是不设置防盗链的域名,并且可以是一个域名列表文件(/etc/squid/domain.txt)
acl nullref referer_regex -i ^$
acl hasref referer_regex -i .+
http_access allow nullref
http_access allow allowdomain
http_access deny hasref
deny_info http://www.example.com/test.jpg hasref

aufs 存储机制

优化squid性能

一.文件系统调节

1.硬盘不要使用RAID

2.使用性能好的FS(例如: ReiserFS)

在fstab里面添加noatime,async项,提高文件系统的性能.

二. aufs存储机制

编辑squid-2.6.STABLE13/src/fs/aufs/store_asyncufs.h

#define ASYNC_WRITE 0 (把0修改为:1)

pthread_create(), SMP优越. (线程制)

编辑squid-2.6.STABLE13/include/autoconf.h

define DEFAULT_FD_SETSIZE 1024{1024修改为:65536}

diskd存储机制

通过消息队列和共享内存来实现进程间通信

使用Diskd存储机制而对 kernel.msgmnb等的调整

kernel.msgmnb = 16384

每个消息队列的最大字节限制

kernel.msgmni = 16 (此值可以根据需要增大)

整个系统的最大数量的消息队列, Squid对每个Cache_dir 使用两个队列, 假如你有2个磁盘,那就有2个队列.

kernel.msgmax = 8192

每个消息的最大size.

[root@jackbillow~]# sysctl -a |grep msgmnb
kernel.msgmnb = 16384
[root@jackbillow ~]# sysctl -a |grep msgmni
kernel.msgmni = 16
[root@jackbillow ~]# sysctl -a |grep msgmax
kernel.msgmax = 8192
[root@jackbillow ~]# sysctl -a |grep shmall
kernel.shmall = 2097152
[root@jackbillow ~]# sysctl -a |grep shmmni
kernel.shmmni = 4096
[root@jackbillow~]# sysctl -a |grep shmmax
kernel.shmmax = 2147483648
[root@jackbillow~]# sysctl -p

squid的persistent_connections优化

Squid有三个和保持连接相关的配置参 数:client_persistent_connections, server_persistent_connections, persistent_request_timeout,缺省client_persistent_connections 和 server_persistent_connections是打开的。

运行squidclient -p80 mgr:pconn的结果一般是:

Client-side persistent connection counts:
req/
conn count
---- ---------
0 41388
1 4614958

Server-side persistent connection counts:

req/
conn count
---- ---------
1 739509
2 99170
3 20429
4 5469

client_persistent_connections: 是否打开要看具体应用,反正我是一般不开的,因为现在的IE都是多线程的;打开client_persistent_connections的效果可以通 过squidclient -p80 mgr:pconn监控。

server_persistent_connections对于静态文件型squid,最好打开,也别忘记把后面apache或其它web server的KeepAlive打开;动态服务要随机应变。

persistent_request_timeout 用缺省值基本没问题,建议保持和后端的apache,nginx的keepalive一致。

如何查看squid的缓存命中率

使用命令:  squidclient -h host -p port mgr:info
比如:  /usr/local/squid/bin/squidclient -h 127.0.0.1 -p 8080 mgr:info

使用这个命令的前提是,你在你的squid.conf 中配置了相关的选项
acl manager proto cache_object
http_access allow manager

Squid 高级优化指南

类似的题目网上已经有很多了,为啥我还要写这么一篇?其实是前段时间接手了一个 squid 优化的事情,在网上搜索了一下,发现很多 squid 优化只限于在 squid 参数和系统参数上面的调整。但是这个实在只是细枝末节的事情,只要不是太弱智的配置导致无法缓存,squid的性能不会有太大差距,也就提高10%左右,只有实际的业务针对 squid 进行一些调整,squid 才会真正爆发出他的能量,很多时候有 100%-200% 的提升。

本文基本是一些方向性的指导,并不涉及像具体配置文件的细节,因此本文里面的内容大部分不能往配置文件里面 copy-paste。。

首先要明确一下,squid 能够用来作什么。很多人没有搞明白 squid 的工作原理,只是听说 squid 性能不错可以用来给网站提速,就直接在自己的 website 前面套了一个 squid ,这基本没有任何用处,即使你都是静态页面,后面apache上面没有开 mod_expires,一样缓存不了,squid只能起到一个连接管理的用处。

一般说来,网站用 squid 加速,目的有二

1:  squid 本身具有缓存功能,可以将webserver输出的内容缓存起来,在缓存没有过期之前来的访问,都直接用缓存里面的内容,这样可以有效减少 webserver 机器上面的请求数量。这是 squid 的主要功用。
2: 网络慢的用户会长时间占用 webserver 的 TCP 连接,webserver 对每个连接占用的资源比较大,如果长时间不能释放出来服务其他请求,性能会有比较大的影响。前面放一个 squid, webserver 就可以迅速处理完逻辑以后,把数据快速发送给 squid, 然后去处理别的逻辑,而 squid 每个 TCP 连接占用的资源很少,不用担心占用太多资源。这个用途也叫做连接管理,有一些网络设备也可以做这个事情,价格都很贵。

下面针对 squid 的两种功用,来讲述如何调整业务逻辑和 squid 参数

零:预操作

在搞 squid 之前,不管你用什么编译配置,需要什么特殊选项,都请 –enable-snmp ,并配置好 mrtg 之类,可以图形化的显示 squid 状态,例如 Request Hit Ratio(RHR), Byte Hit Ratio(BHR), 等等,反馈是做一切事情的基础,优化也不例外。

一:缓存

A: 使用 Expires header  来控制缓存

squid在缓存webserver内容的时候,需要后端webserver输出一些控制信息告诉他页面是不是可以被缓存,以及可以缓存多久。否则 squid 是不会自作主张给你缓存内容的。一个页面到底能不能缓存,只有开发网站的人才知道,因此开发人员有责任在动态页面里面输出 Expires 和 Cache-Control header。简单举一个 php 的例子以说明这两个 header 的值是什么含义,其中$expiretime 的单位是秒。

header(”Expires: ” . gmt_date_format(time()+$expiretime));
header(”Cache-Control: max-age=” . “$expiretime”);

对于静态文件,有两种方式来让 squid 自动给静态文件缓存,一种是使用 apache 的 mod_expires ,可以针对路径或者针对文件类型/扩展名来自动输出 cache 头。详细的请参考 mod_expires 的说明 。另一种是用 squid 的 refresh_pattern 来指定。详细的还是请参考 squid 的配置文件。一般来说,如果后端不是配置很麻烦,建议还是在后端做,前端的配置修改大多数都是违背http协议的,如果出现问题,也比较难排查。

B  根据 squid 访问的模式,进行业务拆分

 进行了 Expires Header 的处理以后,squid 就真正可以起到加速的作用了,你可能也能感觉到,网站的访问速度明显加快。但是不要满足于这点成绩,查看 squid 的 snmp 统计图,通常 hit ratio 并不会太高,有 50% 就了不起了。这就是我们需要进一步优化的,我们的目标是让大部分 squid 都达到 9X% 的命中率。

  为什么 squid 命中这么低呢,这大概有两种原因。大多数的网站都是有一些页面不能够被缓存的,例如登录页面。这些页面请求也从 squid 走,成为分母的一部分,直接就降低了命中率,我们首先可以做的事情是,把这些不能够缓存的页面请求,拆分到单独一个 squid 上面,或者访问量不大的话,干脆把 apache 暴露出来。这样能够缓存的那个 squid 命中率马上上升一截。

 有人可能会说,把不能缓存的页面分拆开去,就光为了让能缓存的那个数字好看,这不是掩耳盗铃么?其实这么做是有意义的,首先就是去掉了不能缓存页面的干扰,使得我们进一步优化 squid 的依据更加准确。其次是不可缓存请求和可缓存请求之间的重要性通常是有差距的,分拆了以后,它们之间不容易互相抢占资源,不会因为下载图片的连接太多把 squid 占满,影响更重要的登录请求。第三就是可缓存内容通常是图片等页面元素, 浏览器在 load 它们的时候,对每个站点的并发连接会有控制,如果分开成不同的IP,可以多一些请求同时执行。提高少许显示速度。

  其实观察 sohu, sina 之类的页面,你会发现它们的页面也是分拆的,可以看到页面里面的图片都是指向 images.sohu.com 之类的地址,虽然它们可能和其他页面一样后台都指向同一个 apache。

 这样做完,缓存命中率大概能上升到 70%-80% 了,运气好的时候完全可以上 90%。

   另一种导致 squid 命中低的原因和这个比较类似,同样都是可缓存的内容,有的可能是软件下载站上面的大文件,有的是新闻站点上面的小图片,如果同一个 squid 对这样差别巨大的文件加速的话,会严重干扰 squid 的缓存策略,两者不能兼顾,要不就是大文件占据了 cache ,把小文件都挤出了 cache, 要不就是小文件特别多,大文件无法进入 cache, 导致大文件经常 miss 。这个比不能缓存的页面还要恶心,因此即使在服务器资源有限的情况下,也要优先拆分这两类型访问。一般来说,文件大小分界线定在 1M 左右就可以了,如果是有软件下载这样特别大的文件,可以在 4M – 10M 左右再拆分一次。对于不同访问类型的 squid, 其系统优化参数也会有所不同,这个我们后面还会讲到。

   只要悉心按照访问模式来拆分业务,大部分起缓存作用的 squid 都可以达到很高的命中率,至少都可以到达 9X%。



C 根据不同的需求,调整参数优化缓存

完成 A 和 B 两步优化以后, squid 的命中率经常可以达到 9x%, 可以说我们已经给 squid 创造了非常优秀的外部环境,下面我们就要从 squid 本身入手,通过调整它的缓存参数和缓存策略,甚至系统的参数,来让 squid 发挥出更好的性能。

在 B 步骤中,我们把 squid 划分成了三种用途,缓存大文件,缓存小文件,不缓存文件,这其中最后一种用途情况下面 squid 不起到缓存效果,只用来做连接管理,因此我们把它放到后面的连接管理里面叙述,这里只讨论和缓存相关的 squid 参数。
squid 有内存缓存和磁盘缓存两级缓存, 通常来说, 只要是专门给 squid 用的机器, 内存缓存都建议开得比较大, 大内存缓存总是有好处的嘛, 但是注意不要使得系统开始吃 swap ,像Linux这样一开始吃 swap 性能就下降比较严重的系统尤其要注意. 这个程度需要自己试验确定.
通常 1G 内存的Linux机器用来跑 squid ,内存缓存可以开到 512M.

有些libc比较差的平台, 例如比较老的 freebsd 系统, 其 malloc 函数的质量不高,可能会造成比较多的内存碎片,导致 squid 运行一段时间以后分配不出来内存挂掉. 这时候推荐在编译时候使用 dlmalloc package. 即使如此, 仍然要再缩小 squid 的内存缓存,以防不幸发生.

磁盘缓存的情况比较复杂, squid 有 ufs, aufs, coss, diskd, null 五种存储后端, 其中 ufs, aufs, diskd 都是在文件系统上面保存很多小文件, coss 是 squid 自己实现了一个简单的文件系统,可以使用一个大文件或者一个磁盘设备来存储. null 则是给不想要磁盘缓存的情况准备的. coss 看起来好像比较拽, 但是以前试验并不足够稳定,因此并不推荐使用. 剩下的三种存储方式,具体选择哪种需要根据操作系统的特性来进行.

ufs 是最传统的存储方式, 我们知道, squid 是一个单进程的程序, 它使用 ufs 存储后端时, 直接在进程里面读写文件. 这是一种很简单的方式, 缺点是当读写磁盘被阻塞的时候, squid 不能够处理请求, 会造成服务质量波动比较大. 因此出现了 aufs 和 diskd 两种存储后端, 原理都是 squid 主服务循环不负责读写文件, 而是通过消息队列或者tcp/pipe连接将数据传送给其他的线程(aufs)/进程(diskd), 然后其他线程/进程进行读写. 很显然,这两种存储方式有一定的通信开销, 因此不一定就比 ufs 好, 需要具体问题具体分析

前面说到, ufs/aufs/diskd都是在文件系统上面存储很多小文件,因此文件系统本身的特性严重影响了squid缓存的性能,对于 Linux ,强烈推荐用 reiserfs 等适合处理小文件的文件系统, bsd 则至少要打开 softupdate, 以及 dirhash 等一切对很多小文件有好处的选项. 在比较新的系统上面, reiserfs 等文件系统的性能已经足够优越, 通常 ufs 就已经可以应付需要. 对于一些老系统,使用 aufs 或者 diskd 是比较好的选择,如果系统的线程库比较好(如Linux,Solaris),那么使用 aufs, 否则 diskd.
也有一些例外情况, 比如多 cpu 的 Linux 2.6 系统, 线程库很优秀, 虽然 ufs 本身已经比较快了,但是 squid 单进程无法利用另外的 cpu , 不如使用 aufs , 让另外的 cpu 也可以起到一些作用, aufs 在编译的时候可以选择使用几个读写线程. 这个个人觉得稍微超过 cpu 个数就可以了.但是并没有实际测试过.

磁盘缓存开多大? 这个问题没有固定答案. 需要经过试验来确定, 一般来说开大一些没有太大问题. 只要你的硬盘足够大。

最后致谢一下 windtear ,这位是 squid 之王, Lord of Squid, 业务分拆是从他那里学来的。致敬。

squid.conf中少了transparent

访问是会出现如下错误:

错误
您所请求的网址(URL)无法获取

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

当尝试进行以下请求时:

GET /forum-6-1.html HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TheWorld)
Host: www.example.com
Connection: Keep-Alive
Cookie: rtime=29; ltime=1312185462343; cnzz_eid=47033647-1307597230-; cnzz_a2967008=9; sin2967008=; pgv_pvi=5092063248; Hm_lvt_19a7cf164294dff4a56c7490c27fa037=1312185462593; __utma=25581497.895693467.1307600638.1312169477.1312185463.79; __utmz=25581497.1307600638.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); lzstat_uv=37664384421587457303|926044@1265351@793358@1072479@1148619@869108@788690@1275240@1246808; i0B_cookietime=2592000; i0B_sid=XogUqO; i0B_visitedfid=6D19D2D21; i0B_auth=ZvBZGLoCB97WXv20ZnMuhh0CPFc1XmWvr6v8Sfh1WgfrmtnLkh84%2B8xBRaQjoh7yN2knN6MlZGKccCThnNCZtu%2FHWcPxjPnpDgs%2BDGmh%2B7r0FxIYI%2FaK09CjRxQ2nQ1uvjKb9bcaFDZia13orh37; i0B_uc_uid=2042498; pgv_info=ssi=s2496081862; Hm_lpvt_19a7cf164294dff4a56c7490c27fa037=1312185462593; __utmb=25581497.1.10.1312185463; __utmc=25581497; checkpm=1; i0B_pmnum=0


发生了下列的错误:

Invalid Request
无效的请求
Some aspect of the HTTP Request is invalid. Possible problems:
HTTP 请求的某些方面是无效的。可能是下列问题:

Missing or unknown request method
缺少请求方式或未知的请求方式
Missing URL
缺少网址
Missing HTTP Identifier (HTTP/1.0)
缺少 HTTP 标识(HTTP/1.0)
Request is too large
请求命令过长
Content-Length missing for POST or PUT requests
POST 或 PUT 请求缺少内容长度
Illegal character in hostname; underscores are not allowed
主机名称中包含不合法的字符;下划线是不允许的。


解决办法:
vim  squid.conf
把"http_port 80" 改成 "http_port 80 transparent"