9 20
squid安装与部署

前阵子开始构思用go+leveldb实现一个分布式缓存方案,顺便调研了一下squid,下面是这阵子对squid的一些总结:

代理缓存服务很多,squid是其中一个比较成熟的工具(类似的有:varnish、ATS、nginx-proxycache等)。Squid用途广泛的,可以作为缓存服务器,可以过滤流量帮助网络安全,也可以作为代理服务器链中的一环,向上级代理转发数据或直接连接互联网。

squid cache的总体架构可以理解为下图的展示方式

sq1

我们主要针对squid的缓存功能,下面会详细介绍:

安装

squid的官网有针对不同操作系统的编译安装流程: https://wiki.squid-cache.org/SquidFaq/CompilingSquid

yum安装

本文测试服务器OS为centos,所以直接使用yum命令安装就可以了

yum -y install squid

源码编译安装

如果选择用源码编译安装的话,先确认以下的依赖是否准备妥当:

perl gcc gcc-c++ autoconf automake make sudo wget

额外的还有

libxml2-devel libcap-devel libtool-ltdl-devel

然后可以执行相关安装命令:

$ ./configure  \
--enable-epoll \
--enable-htcp \
--enable-stacktraces \
--enable-storeio=ufs,aufs,diskd \
--enable-removal-policies=lru,heap \
--enable-icmp \
--enable-default-err-language=Simplify_Chinese \
--enable-err-languages="Simplify_Chinese English" \
--enable-cache-digests \
--enable-auth \
--enable-auth-basic="NCSA" \
--enable-useragent-log \
--enable-referer-log \
--enable-linux-netfilter \
--enable-delay-pools \
--enable-follow-x-forwarded-for \
--enable-kill-parent-hack \
--enable-gnuregex \
--enable-underscore \
--enable-arp-acl \
--enable-x-accelerator-vary \
--disable-ident-lookups \
--disable-ssl \
--disable-wccp \
--disable-internal-dns \
--disable-mempools \
--with-default-user=squid \
--with-pthreads \
--with-aio \
--with-large-files \
--with-filedescriptors=65535
--with-included-ltdl

最后执行构建安装命令,即可完成squid的安装

make && make install

编译主要参数说明:

--enable-epoll  指定使用epoll()函数,提升性能

--enable-htcp HTCP 是超文本缓存协议--类似于ICP的内部缓存协议

--enable-stacktraces 系统支持在程序崩溃时,自动产生数据追踪,数据追踪信息被写到cache.log文件

--enable-storeio=ufs,aufs,diskd Squid支持大量的不同存储模块,可以在这里指定

--enable-removal-policies=lru,heap  Squid缓存替换策略

--enable-icmp 加入icmp支持

--enable-default-err-language=Simplify_Chinese 

--enable-err-languages="Simplify_Chinese English" 

--enable-cache-digests 使能缓存摘要,加快检索缓存的速度

--enable-auth  启用模块身份认证

--enable-auth-basic="NCSA"  持NCSA身份验证

--enable-useragent-log 激活来自客户请求的HTTP用户代理头的日志

--enable-referer-log  激活来自客户请求的HTTP referer日志

--enable-linux-netfilter 可以支持透明代理

--enable-delay-pools  支持限制带宽配置

--enable-follow-x-forwarded-for 当一个请求被另一些代理服务器转发时通过从http头中寻找X-Forwarded-For来发现直接或间接的客户端的IP地址

--enable-kill-parent-hack 掉suqid的时候,要不要连同父进程一起关掉

--enable-gnuregex  支持GNU正则表达式

--enable-underscore 允许解析的URL中出现下划线

--enable-arp-acl         可在规则中设置通过MAC地址进行管理,防止IP欺骗

--enable-x-accelerator-vary  该功能squid被配置成加速器时使用,在响应请求时,从后台原始服务中读取X-Accelerator-Vary头信息。

--disable-ident-lookups 防止系统使用RFC931规定的身份识别方法

--disable-ssl  禁用squid的SSL/TLS 安全连接

--disable-wccp 用于阻止或分发HTTP请求到一个或多个caches

--disable-internal-dns 禁用内部DNS查询

--disable-mempools   关闭内存池,以防止squid运行时间长了会变慢

--with-default-user=squid 默认用户,应首先创建

--with-pthreads  支持POSIX线程

--with-aio         支持POSIX AIO

--with-large-files 支持大文件,如日志文件等

--with-filedescriptors=65535 文件描述符个数,必须是64的整数倍

当安装完成后,我们先不急着squid的部署测试,我们先大概了解一下squid的配置文件:

$ vi /etc/squid/squid.conf

squid的配置项涉及ACL、集群配置、缓存配置、请求拦截等。官网有份很详细的说明 (3.5版本为例):

http://www.squid-cache.org/Versions/v3/3.5/cfgman/

建议大家先快速先过一下这些配置的相关事项,让脑袋先 缓存 这个大概的功能脉络起来。

环境部署

安装squid后,我们开始构建我们的squid测试集群,毕竟单机版的squid直接部署跑起来就可以了,意义不大,本文目的是集群测试请求,所以cache_peer的相关配置是比较重要的,所以下面的例子都围绕着squid的两种集群方式 parent(上层节点)sibling(邻居节点) 来说明。

请求步骤:sibling是通过ICP向同伴squid发送请求,一旦在同伴squid中发现了缓存命中,则由这个缓存命中返回给客户端,如果没有发现则到parent的squid去拿或者到realserver去拿

先简单说一下集群配置的相关基本特点:

  • parent 上下层结构会采用 weight-roundrobin 算法去具体上层节点转发请求,但当多个上层存储节点的时候,命中率会不是太稳定

  • 基于parent模式采用配置cache_peer_domain负载分发处理,优点是上层存储节点不需要全量存储数据,只需要按需存储部分数据,由proxy负载把请求指向目标上层节点中,比之前多parent模式的优点体验在:上层存储节点按需存储,存储量不会很大。举个例子: 请求方(nginx/HA)先配备域名 a.test.com 和 b.test.com 它们都指向squid proxy的ip (172.17.0.2)。当请求图片A前,图片A哈希后路由到域名b.test.com, 然后请求方使用b.test.com调用squid proxy,proxy会根据域名把请求路由到指定的上层存储节点A中。

    注:我测试的squid的是stable的3.x版本,squid 4.x也提供类似cache_peer_domain的配置(cache_peer_access)

    下面是4.x版本的配置例子:

    cache_peer ip.of.server1 parent 80 0 no-query originserver name=server_1
    acl sites_server_1 dstdomain www.example.com example.com
    cache_peer_access server_1 allow sites_server_1
    
    cache_peer ip.of.server2 parent 80 0 no-query originserver name=server_2
    acl sites_server_2 dstdomain www.example.net download.example.com .example.net
    cache_peer_access server_2 allow sites_server_2
    
  • 为了避免缓存中心的单点问题和减少缓存中心各节点的请求压力,可以采用路由+parent+sibling的结构模式。请求访问某缓存节点A, 当A没有相关数据,它会先向sibling(邻居节点)借,如果邻居节点没有,节点A再尝试为自己的parent(上层节点)拿。本模式中节点A访问自己的邻居节点只会尝试去邻居的内存里面找,并不会去邻居的parent去找,不过我认为这个是合理的,否则请求链会很长。

  • 官方把sibling的搭建方式称为“代理节点的集群模式”,默认来说的确会受到邻居节点内存策略影响。 所以官方有个选项 “proxy-only” , 默认是关闭的,如果把这个开关关闭上的话,节点A拿到邻居数据的时候,自己会存储一份副本。 这样下次有重复请求的时候,就不需要再问邻居了。这种策略的前提是节点A的内存要足够满足需要, 否则内存达到临界点,会 把自身的部分数据清理掉(目前了解到的情况)。关于sibling和parent理论上是不冲突的,sibling是基于parent增加一层缓存策略

有了上面的基本了解后,我们就动手部署相关环境来实现一个资源请求的分布式缓存demo。通过这个demo,我们目标是掌握一些缓存处理的手段。分布式缓存的知识其实很广泛,需要我们不断深入学习才行,例如如何有效的in-memory,如何高效地file store等;不过这些不在本文讨论范围内了。

环境准备

实验阶段,我准备了5台机器(docker容器)用于搭建缓存架构:

172.17.0.2 缓存proxy(负责接收http请求)

172.17.0.3 parent 1

172.17.0.4 parent 2

172.17.0.5 sibling 1

172.17.0.6 sibling 2

为了进行简单的请求测试,部分机器(sibling节点)的80端口服务,我们就启用apache httpd服务来接收具体的访问请求,其它的我们默认使用3128端口,下面的配置实例中我会特别说明;跟集群配置的一些不相关的配置我先省略掉,因为这部分配置包括memsize,coredump目录设置,acl等都是因环境而异的,我们先不关注 :)

结构示意如下:

sq2

参考配置

主代理proxy的配置如下:

172.17.0.2 squid.conf主要配置(省略部分功能的配置):

squid占用80端口,停止httpd进程

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
(略)
acl jobsdomain dstdomain a.test.com b.test.com
acl Snmppublic snmp_community public
cache deny QUERY

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

http_access allow localnet
http_access allow localhost
icp_access allow all

http_access allow all
never_direct allow all

#snmp options
snmp_access allow Snmppublic

# Squid normally listens to port 3128
http_port 80 accel vhost vport
icp_port 3130
snmp_port 3456

#cache_peer 172.17.0.3 parent 80 0 no-query no-digest originserver name=testvip
#cache_peer 172.17.0.2 parent 80 0 no-query no-digest originserver  round-robin weight=2
cache_peer 172.17.0.3 parent 80 3130 originserver name=aa
cache_peer 172.17.0.4 parent 80 3130 originserver name=bb
#cache_peer 172.17.0.5 sibling 80 3130 proxy-only
cache_peer 172.17.0.5 sibling 80 3130
cache_peer 172.17.0.6 sibling 80 3130 proxy-only

visible_hostname demo.test.com

cache_peer_domain aa a.test.com
cache_peer_domain bb b.test.com

always_direct allow !jobsdomain

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /data/squid/cache 100 16 256
#logformat main %>a  %{%Y-%m-%d %H:%M:%S}tl  %>Hs     %<st    %ru     %{Referer}>h    %Ss:%Sh
logformat squid %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt

cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log

cache_effective_user squid
cache_effective_group squid
cache_mgr quanix@163.com
cache_swap_low 90
cache_swap_high 95
#maximum_object_size 40960 KB
#maximum_object_size_in_memory 80 KB
#cache_mem 100 MB

maximum_object_size 30 KB
maximum_object_size_in_memory 30 KB
cache_mem 100 KB

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

request_header_max_size 128 KB
forwarded_for on

(省略)

上层节点1的配置如下:

172.17.0.3 squid.conf主要配置(省略部分功能的配置):

squid占用3128端口,开启httpd进程

(省略)
http_access allow manager localhost
http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localnet
http_access allow localhost
icp_access allow all

http_access allow all
#never_direct allow all

# Squid normally listens to port 3128
http_port 3128
#http_port 80 accel vhost vport
icp_port 3130

#cache_peer 172.17.0.4 sibling 80 0

(省略)

上层节点2的配置如下:

172.17.0.4 squid.conf主要配置(省略部分功能的配置):

squid占用3128端口,开启httpd进程

(省略)
http_access allow manager localhost
http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localnet
http_access allow localhost
icp_access allow all

http_access allow all
#never_direct allow all

# Squid normally listens to port 3128
http_port 3128
#http_port 80 accel vhost vport
icp_port 3130

#cache_peer 172.17.0.3 sibling 80 0

(省略)

邻居节点1的配置如下:

172.17.0.5 squid.conf主要配置(省略部分功能的配置):

squid占用80端口,停止httpd进程

(省略)
acl jobsdomain dstdomain a.test.com b.test.com

cache deny QUERY

http_access allow manager localhost
http_access deny manager

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

http_access allow localnet
http_access allow localhost
icp_access allow all

# And finally deny all other access to this proxy
#http_access deny all
http_access allow all
never_direct allow all

# Squid normally listens to port 3128
#http_port 3128
http_port 80 accel vhost vport
icp_port 3130

#cache_peer 172.17.0.3 parent 80 0 no-query no-digest originserver name=testvip
#cache_peer 172.17.0.2 parent 80 0 no-query no-digest originserver  round-robin weight=2
cache_peer 172.17.0.3 parent 80 3130 originserver name=aa
cache_peer 172.17.0.4 parent 80 3130 originserver name=bb

#visible_hostname demo.test.com

cache_peer_domain aa a.test.com
cache_peer_domain bb b.test.com

always_direct allow !jobsdomain

# Uncomment and adjust the following to add a disk cache directory.
cache_dir ufs /data/squid/cache 100 16 256
logformat main %>a  %{%Y-%m-%d %H:%M:%S}tl  %>Hs     %<st    %ru     %{Referer}>h    %Ss:%Sh
cache_access_log /var/log/squid/access.log
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log

cache_effective_user squid
cache_effective_group squid
cache_mgr quanix@163.com
cache_swap_low 90
cache_swap_high 95
maximum_object_size 40960 KB
maximum_object_size_in_memory 80 KB
cache_mem 100 MB

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

request_header_max_size 128 KB
forwarded_for on

(省略)

邻居节点2的配置如下:

172.17.0.6 squid.conf主要配置(省略部分功能的配置):

squid占用80端口,停止httpd进程

(省略)
acl jobsdomain dstdomain a.test.com b.test.com

cache deny QUERY

http_access allow manager localhost
http_access deny manager

http_access deny !Safe_ports

http_access deny CONNECT !SSL_ports

http_access allow localnet
http_access allow localhost
icp_access allow all

# And finally deny all other access to this proxy
#http_access deny all
http_access allow all
never_direct allow all

# Squid normally listens to port 3128
#http_port 3128
http_port 80 accel vhost vport
icp_port 3130

#cache_peer 172.17.0.3 parent 80 0 no-query no-digest originserver name=testvip
#cache_peer 172.17.0.2 parent 80 0 no-query no-digest originserver  round-robin weight=2
cache_peer 172.17.0.3 parent 80 3130 originserver name=aa
cache_peer 172.17.0.4 parent 80 3130 originserver name=bb

#visible_hostname demo.test.com

cache_peer_domain aa a.test.com
cache_peer_domain bb b.test.com

always_direct allow !jobsdomain

(省略)

请求测试

完成节点的配置后,我们可以重新启动我们的squid服务了

在每个节点分别执行如下命令:

$ squid -k parse # 配置文件格式检查

$ squid -z # 初始化缓存目录

$ service squid start # 服务器启动squid服务

我们使用 172.17.0.1 作为请求的客户端机器,它负责向proxy(172.17.0.2)发起资源缓存申请

172.17.0.3 (parent1) 和 172.170.4 (parent2) 分别先启用httpd,模拟响应资源请求的服务,测试的资源放在默认的 /var/www/html

service httpd start

为了简化测试,parent1和parent2同时作为proxy、sibling、sibling2的上层节点

我们再把实验的所有节点分别启用squid服务

$ service squid start

然后,我们需要让sibling1存储指定的缓存数据先

我们在 172.17.0.1 的hosts文件中,增加以下配置:

172.17.0.5 a.test.com
172.17.0.5 b.test.com

我们在172.17.0.1上进行以下请求:

curl http://a.test.com/t1.html

我们可以看到 sibling1 的访问日志立刻会有反应了:

$ tail -30f /var/log/squid/access.log

... ...
1505976565.994      0 172.17.0.1 TCP_MEM_HIT/200 392 GET http://a.test.com/t1.html - NONE/- text/html

这个时候,sibling1的缓存中存放了t1.html的资源数据。

我们再次修改 172.17.0.1 的hosts文件中,调整以下配置

172.17.0.6 a.test.com
172.17.0.6 b.test.com

用类似的方式请求 sibling2:

curl http://b.test.com/t2.html

查看sibling2的访问日志,可以看到请求的信息:

... ...
1505976785.040      0 172.17.0.1 TCP_MEM_HIT/200 397 GET http://b.test.com/t2.html - NONE/- text/html

这样,sibling1和sibling2就分别缓存了t1.html和t2.html的资源

我们再次调整 172.17.0.1的hosts文件,修改如下:

172.17.0.2 a.test.com
172.17.0.2 b.test.com

这样,我们把请求都分发到proxy上,接下来我们把上面的t1.html和h2.html在请求一次:

curl http://a.test.com/t1.html
curl http://b.test.com/t2.html

可以看到proxy节点的访问日志出现以下的信息:

1505977060.498      7 172.17.0.1 TCP_MISS/200 502 GET http://a.test.com/t1.html - SIBLING_HIT/172.17.0.5 text/html
1505977072.654      1 172.17.0.1 TCP_MISS/200 508 GET http://b.test.com/t2.html - SIBLING_HIT/172.17.0.6 text/html

这些信息表示,如果proxy没有请求的相关缓存数据,它会去自己的邻居节点(sibling1和sibling2)去“借”数据,然后自己缓存起来(注:如果proxy的sibling配置中设置了proxy-only,自己不会缓存起来,每次都去借数据)

那问题是,如果邻居节点也没有对应的缓存信息呢?

我们尝试进行以下请求:

curl http://b.test.com/q.html

可以看到proxy节点的日志反馈:

1505977429.726      8 172.17.0.1 TCP_MISS/200 3150 GET http://b.test.com/uu1.html - FIRST_PARENT_MISS/bb text/html
1505977433.183      0 172.17.0.1 TCP_MEM_HIT/200 3156 GET http://b.test.com/uu1.html - NONE/- text/html

这表示,如果邻居节点没数据命中,proxy会去自己的“上层节点(parent)“去请求。

通过上面的模拟实例,我们基本能勾勒出squid层级节点的相关配置部署思路了。

监控方案

通过snmp协议去拿 cache server的命中率,集群信息,上线层节点信息,响应频率等指标。我觉得这样是成本相对低的方案。我认为我们前期不要做专门的监控系统和模块了,直接通过snmp协议进行相关性能数据指标采集。

只需要在需要监控的缓存节点配置中加入

 acl Snmppublic snmp_community public
 snmp_access allow Snmppublic
 snmp_port 3456

我测试使用的是3456作为snmp的端口,配置完成后重启squid服务 检查配置是否生效

squid check && netstat -an | grep udp | grep 3456  

然后,可以在其它的机器使用snmpwalk工具进行我们cache server的信息查询(相关的oid不在这里列出)

snmpwalk -v 1 -c public -m SQUID-MIB -Cc 172.17.0.2:3456 squid

我挑选了部分通过上面命令拿到的信息:

… ...
SQUID-MIB::cacheMemUsage.0 = INTEGER: 245
SQUID-MIB::cacheCpuTime.0 = INTEGER: 0
SQUID-MIB::cacheCpuUsage.0 = INTEGER: 0
SQUID-MIB::cacheMaxResSize.0 = INTEGER: 336688
SQUID-MIB::cacheNumObjCount.0 = Gauge32: 34
SQUID-MIB::cacheCurrentLRUExpiration.0 = Timeticks: (0) 0:00:00.00
SQUID-MIB::cacheCurrentUnlinkRequests.0 = Gauge32: 0
SQUID-MIB::cacheCurrentUnusedFDescrCnt.0 = Gauge32: 524277
SQUID-MIB::cacheCurrentResFileDescrCnt.0 = Gauge32: 100
SQUID-MIB::cacheCurrentFileDescrCnt.0 = Gauge32: 11
SQUID-MIB::cacheCurrentFileDescrMax.0 = Gauge32: 19
SQUID-MIB::cacheProtoClientHttpRequests.0 = Counter32: 13
SQUID-MIB::cacheHttpHits.0 = Counter32: 6
SQUID-MIB::cacheHttpErrors.0 = Counter32: 0
SQUID-MIB::cacheHttpInKb.0 = Counter32: 1
SQUID-MIB::cacheHttpOutKb.0 = Counter32: 16
SQUID-MIB::cacheIcpPktsSent.0 = Counter32: 6
SQUID-MIB::cacheIcpPktsRecv.0 = Counter32: 6
SQUID-MIB::cacheIcpKbSent.0 = Counter32: 0
SQUID-MIB::cacheIcpKbRecv.0 = Counter32: 0
SQUID-MIB::cacheServerRequests.0 = INTEGER: 4
SQUID-MIB::cacheServerErrors.0 = INTEGER: 0
SQUID-MIB::cacheServerInKb.0 = Counter32: 1
SQUID-MIB::cacheServerOutKb.0 = Counter32: 0
SQUID-MIB::cacheCurrentSwapSize.0 = Gauge32: 32
SQUID-MIB::cacheClients.0 = Gauge32: 2
… ...
SQUID-MIB::cachePeerAddress.1 = STRING: "172.17.0.3"
SQUID-MIB::cachePeerAddress.2 = STRING: "172.17.0.4"
SQUID-MIB::cachePeerAddress.3 = STRING: "172.17.0.5"
SQUID-MIB::cachePeerPortHttp.1 = INTEGER: 80
SQUID-MIB::cachePeerPortHttp.2 = INTEGER: 80
SQUID-MIB::cachePeerPortHttp.3 = INTEGER: 80
SQUID-MIB::cachePeerPortIcp.1 = INTEGER: 3130
SQUID-MIB::cachePeerPortIcp.2 = INTEGER: 3130
SQUID-MIB::cachePeerPortIcp.3 = INTEGER: 3130
… ...
SQUID-MIB::cacheClientHttpHits.172.17.0.1 = Counter32: 6
…. … 

*** 几个SQUID重要参数:

maximum_object_size 是 能cache最大的文件大小.对应wmv,rm文件,建议设置为32768 kB

maximum_object_size_in_memory 是在内存中cache的最大文件大小. cache_mem 是SQUID可用到的最大内存

首先要分析squid所cache内容:

运行

$ squidclient -p 80 cache_object://localhost/info

能看到如下内容:

Storage Swap size: 7549104 KB
Storage Mem size: 418804 KB
Mean Object Size: 160.46 KB

Mean Object Size是平均内容大小,一般要把maximum_object_size_in_memory设置成离它最近的128的倍数.在这个例子中maximum_object_size_in_memory 的值应该是256kB.

cache_mem 一般设置成服务器内存的一半或更多,只要运行过程中LINUX没有使用SWAP就可以.

总结来说, squid的工作方式和原理基本如上面所述

最近自己开始根据squid的处理流程,写了一个基于Go的缓存玩具出来,代码如下 : DFC

常见问题

1、访问被拒

  • 解决方法:

    1、代理服务器机器的DNS配置问题,代理服务器机器不能找到指定url的ip地址导致。检查/etc/resolv.conf文件配置是否正确,如不正确添加正确的配置信息,比如说:

    nameserver ###.###.###.###
    nameserver ###.###.###.###
    

    可以配置多个DNS server。

    重新启动squid服务。

    2、访问控制http_access allow all

2、使用squidclient命令出现403问题

  • 解决方法:

    在squid.conf配置中添加允许后重启squid服务。

    acl AdminBoxes src 127.0.0.1 172.16.0.1 192.168.0.1
    acl Purge method PURGE
    http_access allow AdminBoxes Purge
    http_access deny Purge
    
  • squidclient基本用法:

    *取得squid运行状态信息: squidclient -p 80 mgr:info
    *取得squid内存使用情况: squidclient -p 80 mgr:mem
    *取得squid已经缓存的列表: squidclient -p 80 mgr:objects
    *取得squid的磁盘使用情况: squidclient -p 80 mgr:diskd
    *强制更新某个url:squidclient -p 80 -m PURGE http://lihaoquan.me/about.md
    

3、cache相关

  • cache_mem:有时候Squid占用内存量似乎不受这个参数的控制,此参数不必设得太大,适量就行。

  • cache_dir采用二级目录方式保存cache object,做配置时不宜过大,建议为规划容量的1倍,否则建立swap目录会花费较多时间。推荐保留10%的空间。这些额外的空间用于存放squid的swap.state文件和临时文件。

  • 可以配置多个cache_dir,建议每个cache_dir都放在不同的物理硬盘上,以改善IO效率

  • log和cahce_dir不要放在一个物理盘上

  • cache_dir所在的盘建议使用ReiserFS格式 (默认ufs)

  • mount cache_dir盘时建议使用noatime参数

  • 动态内容的CACHE.

    要保证内容更新及时的同时,提高访问速度,降低数据库负担不是个简单任务.经实践发现如下办法取得很好效果:配置SQUID,对动态内容强制CACHE,用到的配置参数是refresh_pattern

    refresh_pattern ^/forum/viewthread.php 1440 1000% 1440 ignore-reload
    
    /forum/viewthread.php的内容将强制保持1天
    

4、减少 TIME_WAIT

这部分很多实用tcp、udp的服务都要用到减少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

参考资料