C1-Squid_Cache-Server
拓扑:
- DNS 10.0.100.71
- Haproxy 10.0.100.82
- Squid 10.0.100.72/73
- Nginx 10.0.100.75/76
- NFS 10.0.100.70
- DNS
- | (static)
- Haproxy ------> Squid.72/73 (origin server Nginx.75/76)
- |(dynamic)
- Nginx
- |
- NFS
1 准备工作
1.1 修改文件描述符
文件描述符:文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。
第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。
更甚的是,unix通常有一个系统级的限制。因为squid的工作方式,文件描述符的限制可能会极大的影响性能。
当squid用完所有的文件描述符后,它不能接收用户新的连接。也就是说,用完文件描述符导致拒绝服务。
直到一部分当前请求完成,相应的文件和socket被关闭,squid不能接收新请求。当squid发现文件描述符短缺时,它会发布警告。
在运行./configure之前,检查你的系统的文件描述符限制是否合适,能给你避免一些麻烦。
大多数情况下,1024个文件描述符足够了。非常忙的cache可能需要4096或更多。
//査看内核文件描述符
- [root@squid ~]# sysctl -a | grep -i 'fs.file-max'
fs.file-max = 100976
//或者
- [root@squid ~]# cat /proc/sys/fs/file-max
100976
//査看进程文件描述符
- [root@squid ~]# ulimit -n
- 1024
// 设置进程文件描述符
- //这里设置的文件描述符是65536 (需要重启系统)
- [root@squid ~]# echo -e '* soft nofile 65536
- * hard nofile 65536' >> /etc/security/limits.conf
- //査看进程文件描述符
- [root@squid ~]# ulimit -n
- 65536
1.2 修改临时端口范围
临时端口是 TCP/IP 栈分配给出去连接的本地端口。换句话说,当 squid 发起一条连接到另一台服务器,内核给本地 socket 分配一个端口号。临时端口号的短缺对非常忙的代理服务器(例如每秒数百个连接)来说,会较大的影响性能。这是因为一些 TCP 连接在它们被关闭时进入 TIME_WAIT 状态。当连接进入TIME_WATI 状态时,临时端口号不能被重用。
査看当前连接状态中的TIME_WAIT
- [root@squid ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
- TIME_WAIT 10212
- CLOSE_WAIT 78
- FIN_WAIT1 401
- FIN_WAIT2 1
- ESTABLISHED 1463
- SYN_RECV 304
- 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 源码包
- wget -c http://www2.tw.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE9.tar.gz
- tar zxf squid-2.7.STABLE9.tar.gz
- cd squid-2.7.STABLE9
2.2 配置
- ./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 编译安装
- make && make install
3 配置squid
//注意:squid 忽略空行和注释掉的行(以#开始),squid.conf 文件里的许多东西是大小写敏感的
3.1 添加 squid 用户
- useradd squid -s /sbin/nologin -d /dev/null
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
- passwd squid
Changing password for user squid.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
3.2 建立cache 目录
- mkdir -p /var/cache{1,2,3,4}
3.3 修改目录属主
- chown -R squid.squid /var/cache{1,2,3,4}
- chown -R squid.squid /usr/local/squid/var/logs/
3.4 编辑 squid.conf 配置文件 (PS:以最新附件为准!!)
- cat > /usr/local/squid/etc/squid.conf << EOF
- #base
- #设定 squid的主机名,如无此项 squid 将无法启动。
- visible_hostname cache01.test.com
- #监听80端口配置 squid为加速模式
- http_port 80 accel vhost vport
- #icp 端口
- icp_port 3130
- #squid pid 文件位置
- pid_filename /usr/local/squid/var/logs/squid.pid
- #设置squid使用的用户(squid在执行完需要特别权限的任务后,使用的用户)
- cache_effective_user squid
- #设置squid使用的组
- cache_effective_group squid
- #设置管理联系信息
- cache_mgr admin@test.com
- #邻居
- #配置 cache02为其邻居,当 cache01(squid) 在其缓存中没有找到请求的资源时,通过 ICP 查询去其邻居中取得缓存
- cache_peer cache02.test.com sibling 80 3130
- cache_peer cache03.test.com sibling 80 3130
- #cache01 的两个父节点,originserver 参数指明是源服务器,
- #round-robin 参数指明 squid 通过轮询方式将请求分发到其中一台父节点;
- #squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了;
- #那么 squid 会从剩余的 origin 服务器中抓取数据
- cache_peer 10.0.100.75 parent 80 0 no-query originserver round-robin name=webServer1
- cache_peer 10.0.100.76 parent 80 0 no-query originserver round-robin name=webServer2
- cache_peer 10.0.100.70 parent 80 0 no-query originserver round-robin name=webServer3
- #将 monitor.test.com 域的请求通过 RR 轮询方式转发到三个父节点中的一个
- cache_peer_domain webServer3 monitor.test.com
- cache_peer_domain webServer1 webServer2 bbs.test.com
- cache_peer_domain webServer1 webServer2 forum.test.com
- cache_peer_domain webServer1 webServer2 blog.test.com
- cache_peer_domain webServer1 webServer2 www.test.com
- #cache的设置
- #squid 用于缓存的内存量
- cache_mem 512 MB
- #控制存储在磁盘上的对象的置换,它们的值是最大 cache 体积的百分比,最大cache体积是所有 cache_dir大小的总和
- #如果总共磁盘使用低于 cache_swap_low,squid 不会删除 cache 目标,如果 cache 体积增加,squid 会逐渐删除目标。
- cache_swap_low 80
- cache_swap_high 90
- #缓存对象的最大和最小体积,比 maximum_object_size 更大的响应不会被缓存在磁盘,然而它们仍然是代理方式的。
- maximum_object_size 4096 KB
- minimum_object_size 0 KB
- #内存中缓存的最大对象 512K
- maximum_object_size_in_memory 1024 KB
- #cache_dir 存储机制 cache的目录 cache目录大小 第一级和第二级目录的数量
- cache_dir ufs /var/cache3 5120 16 256
- #声明 squid 以ufs方式存储cache文件到磁盘,大小5GB,16个一级以及256个二级目录
- cache_dir ufs /var/cache4 5120 16 256
- #此指令间接的控制磁盘缓存。它帮助 squid 决定某个缓存响应是存活还是过期.
- #规则仅仅应用到没有明确过时期限的响应。原始服务器能使用 Expires 头部,或者 Cache-Control:max-age 指令来指定过时期限。
- #refresh_pattern [忽略大小写] <正则> <缓存响应最低分钟数> <在最低和最高时间限制之间的响应> <缓存响应最大分钟数> [忽略请求里的任何no-cache指令]
- #理解 squid 检查不同值的顺序非常重要。如下是 squid 的 refresh_pattern 算法的简单描述:
- #假如响应年龄超过 refresh_pattern 的 max 值,该响应过期;
- #假如 LM-factor 少于 refresh_pattern 百分比值,该响应存活;
- #假如响应年龄少于 refresh_pattern 的 min 值,该响应存活;
- #其他情况下,响应过期。
- refresh_pattern -i \.jpg 43200 90% 604800 ignore-reload
- refresh_pattern -i \.gif 43200 90% 604800 ignore-reload
- refresh_pattern -i \.bmp 43200 90% 604800 ignore-reload
- refresh_pattern -i \.png 43200 90% 604800 ignore-reload
- refresh_pattern . 1440 10% 2880 ignore-reload
- #LOG(日志的设置)
- #使用普通日志文件格式(access.log 文件有 2 种格式:普通格式和原始格式。)
- emulate_httpd_log on
- #轮转日志保留7天
- logfile_rotate 7
- #定义access log 格式
- logformat combined %{X-Forwarded-For}>h %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
- #logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
- #客户端请求日志,使用定义的Log 格式
- access_log /usr/local/squid/var/logs/access.log combined
- #记录 Squid 关于存储或删除 cache 目标的决定
- cache_store_log /usr/local/squid/var/logs/store.log
- #cache 包含状态性的和调试性的消息
- cache_log /usr/local/squid/var/logs/cache.log
- #ACL(访问控制的设置)
- acl localnet src 10.0.100.72 10.0.100.73 10.0.100.74
- acl all src 0.0.0.0/0.0.0.0
- http_access allow all
- icp_access allow localnet
- EOF
4 运行 Squid
4.1 初始化cache 目录
//在首次运行 squid,或者增加新的 cache 目录时,你必须使用 -z 参数,用于初始化 cache,或者交换目录选项。
- /usr/local/squid/sbin/squid -z
4.2 验证配置文件,假如你看不到输出,配置文件正常。
- /usr/local/squid/sbin/squid -k parse
4.3 调试 squid
//-N 阻止 squid 变成后台服务进程
//-d level 让 squid 将它的调试信息写到标准错误
- /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 选项也是安全的。
- /usr/local/squid/sbin/squid -s
4.5 验证squid 是否运行
- lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
squid 18750 squid 19u IPv4 44519 TCP *:http (LISTEN)
4.6 开机自动启动squid
- 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点 执行
- crontab -e
- 0 1 * * * /usr/local/squid/sbin/squid -k rotate
5 squid 目录结构
//在安装完后,你将在 squid 的安装目录里(默认是/usr/local/squid)见到下列目录和文件:
- 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头标记:
- Last-Modified: 告诉反向代理页面什么时间被修改
- Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
- Cache-Control: 告诉反向代理页面是否应该被缓冲
- Pragma: 告诉反向代理页面是否应该被缓冲.
参考
Squid 中文权威指南
利用 squid 反向代理提高网站性能
#update 20120810
#update20130315
结束
更多请:
linux 相关 37275208
vmware 虚拟化相关 166682360