C1-Squid_Cache-Server

拓扑:

  1. DNS      10.0.100.71 
  2. Haproxy  10.0.100.82 
  3. Squid    10.0.100.72/73 
  4. Nginx    10.0.100.75/76 
  5. NFS      10.0.100.70 
  6.  
  7. DNS 
  8.   |     (static) 
  9. Haproxy  ------>  Squid.72/73 (origin server Nginx.75/76) 
  10.   |(dynamic) 
  11. Nginx 
  12.   | 
  13. NFS 



1 准备工作
1.1 修改文件描述符
文件描述符:文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。
第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。
更甚的是,unix通常有一个系统级的限制。因为squid的工作方式,文件描述符的限制可能会极大的影响性能。
当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务
直到一部分当前请求完成,相应的文件和socket被关闭,squid不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。
在运行./configure之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。
大多数情况下,1024个文件描述符足够了。非常忙的cache可能需要4096或更多

//査看内核文件描述符

  1. [root@squid ~]# sysctl -a | grep -i 'fs.file-max' 

fs.file-max = 100976
//或者

  1. [root@squid ~]# cat /proc/sys/fs/file-max  

100976

//査看进程文件描述符

  1. [root@squid ~]# ulimit -n 
  2. 1024 


// 设置进程文件描述符

  1. //这里设置的文件描述符是65536 (需要重启系统) 
  2. [root@squid ~]# echo -e '* soft nofile 65536 
  3. * hard nofile 65536'  >> /etc/security/limits.conf 
  4. //査看进程文件描述符 
  5. [root@squid ~]# ulimit -n 
  6. 65536 


1.2 修改临时端口范围
临时端口是 TCP/IP 栈分配给出去连接的本地端口。换句话说,当 squid 发起一条连接到另一台服务器,内核给本地 socket 分配一个端口号。临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些 TCP 连接在它们被关闭时进入 TIME_WAIT 状态。当连接进入TIME_WATI 状态时,临时端口号不能被重用。
査看当前连接状态中的TIME_WAIT

  1. [root@squid ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}' 
  2. TIME_WAIT 10212
  3. CLOSE_WAIT 78 
  4. FIN_WAIT1 401 
  5. FIN_WAIT2 1 
  6. ESTABLISHED 1463 
  7. SYN_RECV 304 
  8. LAST_ACK 18 


//査看临时端口范围
[root@squid ~]# sysctl -a | grep -i 'port_range'
net.ipv4.ip_local_port_range = 32768    61000

//修改临时端口范围
echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range
或者编辑/etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024    65000
sysctl -p    //不必重启系统,立即生效。


2 安装 squid
2.1 下载squid 源码包

  1. wget -c http://www2.tw.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9.tar.gz 
  2. tar zxf squid-2.7.STABLE9.tar.gz 
  3. cd squid-2.7.STABLE9 


2.2 配置

  1. ./configure --prefix=/usr/local/squid --enable-epoll --enable-stacktraces --enable-follow-x-forwarded-for --enable-snmp --enable-storeio=ufs,diskd --enable-useragent-log --enable-referer-log --enable-forward-log --with-large-files --with-maxfd=65536  

//配置参数信息
--prefix=/squid 这里为squid的安装目录
--enable-epoll 支持epoll的IO模式,2.6以上内核才具有
--enable-stacktraces 某些系统支持在程序崩溃时,自动产生数据追踪。当你激活该功能后,如果squid崩溃,数据追踪信息被写到cache.log文件。这些信息对开发和程序bug调试有用
--enable-follow-x-forwarded-for 当一个请求被另一些代理服务器转发时通过从http头中寻找X-Forwarded-For来发现直接或间接的客户端的IP地址
--enable-snmp 简单网络管理协议(SNMP)是监视网络设备和服务器的流行方法。该选项导致编译过程去编译所有的SNMP相关的代码,包括一个裁切版本的CMU SNMP库
--enable-storeio=ufs,diskd Squid 支持大量的不同存储模块。通过使用该选项,你告诉squid 编译时使用哪个模块
--enable-useragent-log 该选项激活来自客户请求的HTTP 用户代理头的日志
--enable-referer-log 该选项激活来自客户请求的HTTP referer 日志
--enable-forward-log 支持实验forward-log指令
--with-large-files 支持大的文件
--with-maxfd=65536 覆盖的最大数量的filedescriptors

2.3 编译安装

  1. make && make install  



3 配置squid
//注意:squid 忽略空行和注释掉的行(以#开始),squid.conf 文件里的许多东西是大小写敏感的

3.1 添加 squid 用户

  1. useradd squid -s /sbin/nologin -d /dev/null  

useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.

  1. passwd squid 

Changing password for user squid.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

3.2 建立cache 目录

  1. mkdir -p /var/cache{1,2,3,4} 


3.3 修改目录属主

  1. chown -R squid.squid /var/cache{1,2,3,4} 
  2. chown -R squid.squid /usr/local/squid/var/logs/ 


3.4 编辑 squid.conf 配置文件 (PS:以最新附件为准!!)

  1. cat > /usr/local/squid/etc/squid.conf << EOF 
  2. #base 
  3. #设定 squid的主机名,如无此项 squid 将无法启动。 
  4. visible_hostname cache01.test.com 
  5. #监听80端口配置 squid为加速模式 
  6. http_port 80 accel vhost vport 
  7. #icp 端口 
  8. icp_port 3130 
  9. #squid pid 文件位置 
  10. pid_filename /usr/local/squid/var/logs/squid.pid 
  11. #设置squid使用的用户(squid在执行完需要特别权限的任务后,使用的用户) 
  12. cache_effective_user   squid 
  13. #设置squid使用的组 
  14. cache_effective_group  squid 
  15. #设置管理联系信息 
  16. cache_mgr admin@test.com 
  17.   
  18.  
  19. #邻居 
  20. #配置 cache02为其邻居,当 cache01(squid) 在其缓存中没有找到请求的资源时,通过 ICP 查询去其邻居中取得缓存 
  21. cache_peer cache02.test.com sibling 80 3130 
  22. cache_peer cache03.test.com sibling 80 3130 
  23. #cache01 的两个父节点,originserver 参数指明是源服务器, 
  24. #round-robin  参数指明 squid 通过轮询方式将请求分发到其中一台父节点; 
  25. #squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了; 
  26. #那么 squid 会从剩余的 origin 服务器中抓取数据 
  27. cache_peer 10.0.100.75 parent 80 0 no-query originserver round-robin name=webServer1 
  28. cache_peer 10.0.100.76 parent 80 0 no-query originserver round-robin name=webServer2 
  29. cache_peer 10.0.100.70 parent 80 0 no-query originserver round-robin name=webServer3 
  30. #将 monitor.test.com 域的请求通过 RR 轮询方式转发到三个父节点中的一个 
  31. cache_peer_domain webServer3 monitor.test.com 
  32. cache_peer_domain webServer1 webServer2 bbs.test.com 
  33. cache_peer_domain webServer1 webServer2 forum.test.com 
  34. cache_peer_domain webServer1 webServer2 blog.test.com 
  35. cache_peer_domain webServer1 webServer2 www.test.com 
  36.  
  37.  
  38. #cache的设置 
  39. #squid 用于缓存的内存量 
  40. cache_mem 512 MB 
  41. #控制存储在磁盘上的对象的置换,它们的值是最大 cache 体积的百分比,最大cache体积是所有 cache_dir大小的总和 
  42. #如果总共磁盘使用低于 cache_swap_low,squid 不会删除 cache 目标,如果 cache 体积增加,squid 会逐渐删除目标。 
  43. cache_swap_low 80 
  44. cache_swap_high 90 
  45. #缓存对象的最大和最小体积,比 maximum_object_size 更大的响应不会被缓存在磁盘,然而它们仍然是代理方式的。 
  46. maximum_object_size 4096 KB 
  47. minimum_object_size 0 KB 
  48. #内存中缓存的最大对象 512K   
  49. maximum_object_size_in_memory 1024 KB 
  50. #cache_dir 存储机制 cache的目录 cache目录大小 第一级和第二级目录的数量 
  51. cache_dir ufs /var/cache3 5120 16 256 
  52. #声明 squid 以ufs方式存储cache文件到磁盘,大小5GB,16个一级以及256个二级目录 
  53. cache_dir ufs /var/cache4 5120 16 256 
  54.  
  55. #此指令间接的控制磁盘缓存。它帮助 squid 决定某个缓存响应是存活还是过期. 
  56. #规则仅仅应用到没有明确过时期限的响应。原始服务器能使用 Expires 头部,或者 Cache-Control:max-age 指令来指定过时期限。 
  57. #refresh_pattern [忽略大小写] <正则> <缓存响应最低分钟数> <在最低和最高时间限制之间的响应> <缓存响应最大分钟数>  [忽略请求里的任何no-cache指令] 
  58. #理解 squid 检查不同值的顺序非常重要。如下是 squid 的 refresh_pattern 算法的简单描述: 
  59. #假如响应年龄超过 refresh_pattern 的 max 值,该响应过期; 
  60. #假如 LM-factor 少于 refresh_pattern 百分比值,该响应存活; 
  61. #假如响应年龄少于 refresh_pattern 的 min 值,该响应存活; 
  62. #其他情况下,响应过期。 
  63. refresh_pattern -i \.jpg  43200 90% 604800 ignore-reload 
  64. refresh_pattern -i \.gif  43200 90% 604800 ignore-reload 
  65. refresh_pattern -i \.bmp  43200 90% 604800 ignore-reload 
  66. refresh_pattern -i \.png  43200 90% 604800 ignore-reload 
  67. refresh_pattern .         1440  10% 2880   ignore-reload 
  68.  
  69.  
  70. #LOG(日志的设置) 
  71. #使用普通日志文件格式(access.log 文件有 2 种格式:普通格式和原始格式。) 
  72. emulate_httpd_log on 
  73. #轮转日志保留7天 
  74. logfile_rotate 7 
  75. #定义access log 格式 
  76. logformat combined %{X-Forwarded-For}>h %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh 
  77. #logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh 
  78. #客户端请求日志,使用定义的Log 格式 
  79. access_log  /usr/local/squid/var/logs/access.log combined 
  80. #记录 Squid 关于存储或删除 cache 目标的决定 
  81. cache_store_log /usr/local/squid/var/logs/store.log 
  82. #cache 包含状态性的和调试性的消息 
  83. cache_log /usr/local/squid/var/logs/cache.log 
  84.  
  85.  
  86. #ACL(访问控制的设置) 
  87. acl localnet src 10.0.100.72 10.0.100.73  10.0.100.74 
  88. acl all src 0.0.0.0/0.0.0.0 
  89. http_access allow all 
  90. icp_access allow localnet 
  91.  
  92. EOF 

 

4 运行 Squid
4.1 初始化cache 目录
//在首次运行 squid,或者增加新的 cache 目录时,你必须使用 -z 参数,用于初始化 cache,或者交换目录选项。

  1. /usr/local/squid/sbin/squid -z 


4.2 验证配置文件,假如你看不到输出,配置文件正常。

  1. /usr/local/squid/sbin/squid -k parse 


4.3 调试 squid
//-N 阻止 squid 变成后台服务进程
//-d level 让 squid 将它的调试信息写到标准错误

  1. /usr/local/squid/sbin/squid -N -d1 

2012/06/14 13:33:43| Starting Squid Cache version 2.7.STABLE9 for x86_64-unknown-linux-gnu...
2012/06/14 13:33:43| Process ID 18449
2012/06/14 13:33:43| With 32768 file descriptors available
2012/06/14 13:33:43| Using epoll for the IO loop
2012/06/14 13:33:43| Performing DNS Tests...
2012/06/14 13:33:43| Successful DNS name lookup tests...
2012/06/14 13:33:43| DNS Socket created at 0.0.0.0, port 57935, FD 6
2012/06/14 13:33:43| Adding nameserver 192.168.57.71 from /etc/resolv.conf
2012/06/14 13:33:43| Adding nameserver 202.106.0.20 from /etc/resolv.conf
2012/06/14 13:33:43| Adding domain localhost from /etc/resolv.conf
2012/06/14 13:33:43| User-Agent logging is disabled.
2012/06/14 13:33:43| Referer logging is disabled.
2012/06/14 13:33:43| logfileOpen: opening log /usr/local/squid/var/logs/access.log
2012/06/14 13:33:43| Unlinkd pipe opened on FD 11
.....略

4.4 后台运行 squid
//-s 选项导致 squid 将重要的状态和警告信息写到 syslogd。
squid 使用 LOCAL4 设备,和LOG_WARNING 和 LOG_NOTICE 优先权。
syslog 进程实际可能会或不会记录 squid 的消息,这依赖于它被如何配置。
同样的消息被写进 cache.log 文件,所以假如你愿意,忽略-s 选项也是安全的。

  1. /usr/local/squid/sbin/squid -s  


4.5 验证squid 是否运行

  1. lsof -i :80 

COMMAND   PID  USER   FD   TYPE DEVICE SIZE NODE NAME
squid   18750 squid   19u  IPv4  44519       TCP *:http (LISTEN)

4.6 开机自动启动squid

  1. echo '/usr/local/squid/sbin/squid -s ' >> /etc/rc.local 


4.7 squid 的管理功能
//-k function 功能参数是下列之一:
reconfigure 导致运行中的 squid 重新读取配置文件。 #!!
rotate 导致 squid 滚动它的日志,这包括了关闭日志,重命名,和再次打开它们。 #!!
shutdown 发送关闭 squid 进程的信号。   #!!
interrupt 立刻关闭 squid,不必等待活动会话完成。
kill 发送 KILL 信号给 squid,这是关闭 squid 的最后保证。
debug 将 squid 设置成完全的调试模式,假如你的cache 很忙,它能迅速的用完你的磁盘空间。
check 简单的检查运行中的 squid 进程,返回的值显示 squid 是否在运行。
parse 简单的解析 squid.conf 文件,如果配置文件包含错误,进程返回非零值。 #!!

4.8 squid 日志轮询
除非你在 squid.conf 里禁止,squid 会写大量的日志文件。你必须周期性的滚动日志文件,以阻止它们变得太大。
squid 将大量的重要信息写入日志,假如写不进去了,squid 会发生错误并退出。为了合理控制磁盘空间消耗,在 cron 里使用如下命令:
//编辑crontab 每天1点 执行

  1. crontab -e 
  2. 0 1 * * * /usr/local/squid/sbin/squid -k rotate  



5 squid 目录结构
//在安装完后,你将在 squid 的安装目录里(默认是/usr/local/squid)见到下列目录和文件:

  1. ls /usr/local/squid 

bin  etc  libexec  sbin  share  var

5.1 sbin 目录
sbin 目录的程序正常只能被 root 启动
sbin/squid
Squid 的主程序

5.2 bin 目录
bin 目录包含对所有用户可用的程序
bin/RunCache
RunCache 是一个 shell 脚本,你能用它来启动 squid。假如 squid 死掉,该脚本自动重启
它,除非它检测到经常的重启。RunCache 是一个时间遗留的产物,那时 Squid 还不是后台
服务进程。在最近的版本里,RunCache 很少用到,因为 Squid 自动重启它自身,当你不使
用-N 选项时。
bin/RunAccel
RunAccel 与 RunCache 几乎一致,唯一的不同是它增加了一个命令行参数,告诉 squid
在哪里侦听 HTTP 请求。
bin/squidclient
squidclient 是个简单的 HTTP 客户端程序,你能用它来测试 squid。它也有一些特殊功
能,用以对运行的 squid 进程发起管理请求。

5.3 libexec 目录
libexec 目录传统的包含了辅助程序。有一些命令你不能正常的启动。然而,这些程序
通常被其他程序启动。
libexec/unlinkd
unlinkd 是一个辅助程序,它从 cache 目录里删除文件。如你后面看到的一样,文件删
除是个性能瓶颈。通过在外部进程里执行删除操作,Squid 提升了一些执行性能。
libexec/cachemgr.cgi
cachemgr.cgi 是 Squid 管理功能的 CGI 接口。为了使用它,你需要拷贝该程序到你的
WEB 服务器的 cgi-bin 目录。在 14.2 章中有更多描述。
libexec/diskd(optional)
假如你指定了--enable-storeio=diskd,你才能看到它。
libexec/pinger(optional)
假如你指定了--enable-icmp,你才能看到它。

5.4 etc 目录
etc 目录包含 squid 的配置文件。
etc/squid.conf
这是 squid 的主要配置文件。初始的该文件包含了大量的注释,用以解释每一个选项做
什么。在你理解了这些配置指令后,建议你删除这些注释,让配置文件更小和更容易阅读。
注意假如该文件存在,安装过程不会覆盖该文件。
etc/squid.conf.default
这是从源代码目录中拷贝过来的默认配置文件。在升级了 squid 安装后,你也许发现有
一份当前默认配置文件的拷贝是有用的。可能会增加新的配置指令,一些存在的旧指令可能有所改变。
etc/mime.conf
mime.conf 文件告诉 squid 对从 FTP 和 Gopher 服务器获取的数据使用何种 MIME 类型。
该文件是一个关联文件名扩展到 MIME 类型的表。正常而言,你不必编辑该文件。然而,
你可能需要增加特殊文件类型的接口,它们在你的组织内使用。
etc/mime.conf.default
这是从源代码目录里拷贝过来的默认 mime.conf 文件。

5.5 share 目录

share 目录通常包括 squid 的只读数据文件。
share/mib.txt
这是 squid 的 SNMP 管理信息基础(MIB)文件。squid 自身不使用该文件,然而,你
的 SNMP 客户端软件(例如 snmpget 和多路由走向图(MRTG))需要该文件,用以理解来自
squid 的 SNMP 对象可用。
share/icons
share/icons 目录包含大量的小图标文件,squid 用在 FTP 和 Gopher 目录列举里。正常而
言,你不必担心这些文件,但如果需要,你可以改变它们。
share/errors
share/errors 目录包含了 squid 显示给用户看的错误消息模板。这些文件在你安装 squid
时,从源代码目录拷贝而来。如果需要你可以编辑它们。然而,在每次运行 make install 时,
安装过程总会覆盖它们。所以假如你想定制错误消息,建议你把它们放在不同的目录。

5.6 var 目录

var 目录包含了不是很重要的和经常变化的文件。这些文件你不必正常的备份它们。
var/logs
var/logs 目录是 squid 不同日志文件的默认位置。当你第一次安装 squid 时,它是空的。
一旦 squid 开始运行,你能在这里看到名字为 access.log,cache.log 和 store.log 这样的文件。
var/cache
假如你不在 squid.conf 文件里指定,这是默认的缓存目录(cache_dir)。第七章有关于缓
存目录的所有细节

 

6 其它
Squid 反向代理一般只缓存可缓冲的数据(比如 html 网页和图片等),而一些 CGI 脚本程序或者 ASP、JSP 之类的动态程序默认不缓存
它根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面,有四个最重要HTTP头标记:

  1. Last-Modified: 告诉反向代理页面什么时间被修改 
  2. Expires: 告诉反向代理页面什么时间应该从缓冲区中删除 
  3. Cache-Control: 告诉反向代理页面是否应该被缓冲 
  4. Pragma: 告诉反向代理页面是否应该被缓冲. 



参考
Squid 中文权威指南

利用 squid 反向代理提高网站性能

#update 20120810

squid-conf-20120810.txt

#update20130315 

去除版本(错误)信息

去除via 头

 

结束
更多请:
linux 相关 37275208
vmware 虚拟化相关  166682360