squid实现代理和cdn缓存
一。 squid介绍
Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。
代理分为 正向代理,透明代理,反向代理
1》正向代理为 局域网中的机器 访问目标地址(比如www.baidu.com) 不可达时 可以通过一个中间代理服务器(可以访问www.baidu.com)进行转发
正向代理 一般用于局域网联网等用途 并且局域网pc机器 需要在客户端进行一些设置 比如浏览器设置局域网代理设置
2》反向代理:互联网中的机器 访问局域网中代理服务器 代理服务器通过各种规则找到对应后台服务器 获取数据响应 反向代理中 访问机器明确访问的
资源就是位于代理服务器 不需要在机器进行任何设置 可以用于设计cdn服务器 代理后端的静态资源
3》透明代理:
正向代理的一种特殊代理 直接在网关中 设置好代理的服务器 pc机器 直接访问网关即可连接
4》web缓存
squid将代理的资源缓存在配置的交换缓存目录下 cache命中率 表示如果某个资源被cache后 下次被访问的命中几率 Web缓存典型的cache命中率在30%到60%之间 也就是访问100个资源 其中有30-60个被命中 缓存命中率越高 后端服务器的压力越小
二。squid安装
squid支持源代码编译(http://www.squid-cache.org/)安装也支持yum源安装
这里使用yum安装 安装环境 centos7 安装最新版 squid3.5 默认squid安装启动其实就是一个正向代理
1>yum 安装过程
yum -y install squid
2>常用的目录
查看所有关于squid的目录
[root@bogon squid]# find / -name squid
/run/squid
/etc/squid
/etc/sysconfig/squid
/etc/pam.d/squid
/etc/logrotate.d/squid
/var/log/squid
/var/spool/squid
/usr/sbin/squid
/usr/lib64/squid
/usr/share/squid
/usr/libexec/squid
/etc/squid 是squid的配置文件目录
/var/log/squid是squid的日志文件目录 access.log表示所有请求的进入日志 cache.log表示cache日志
/var/spool/squid 是缓存对象的目录
3>配置介绍(参考squid中文权威指南 http://www.phpfans.net/manu/Squid/)
这里列出默认的配置 (官网参考http://www.visolve.com/solutions-services/system-services/squid/squid30/contents.php)
[root@bogon squid]# more /etc/squid/squid.conf
# 这里是最小化的配置
# 允许进去网络配置规则
# 适配所有来源的ip地址 acl用于权限控制
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machine
#设置一些安全的端口
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
#定义连接动作
acl CONNECT method CONNECT
#
# 非以上定义端口全部禁止
http_access deny !Safe_ports
# 除了Safe_ports 定义的安全端口外 同时还是非SSL_ports 拒绝连接
http_access deny CONNECT !SSL_ports
# 仅仅允许管理员从localhost进入
http_access allow localhost manager
#其他
http_access deny manager
# 允许localnet定义所有ip地址访问
http_access allow localnet
#允许本机访问
http_access allow localhost
# 除了以上所有规则的 都禁止
http_access deny all
# Squid 监听端口为 3128
http_port 3128
# cache缓存的目录 表示创建 16个父目录 256个子目录
cache_dir ufs /var/spool/squid 100 16 256
# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid
#
# 定义资源缓存刷新规则
#
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
4>检测配置
配置主机名和hosts
hostname bogon
echo 192.168.58.145 >> /etc/hosts
[root@bogon squid]# squid -k parse
2017/09/01 02:00:10| Startup: Initializing Authentication Schemes ...
2017/09/01 02:00:10| Startup: Initialized Authentication Scheme 'basic'
2017/09/01 02:00:10| Startup: Initialized Authentication Scheme 'digest'
2017/09/01 02:00:10| Startup: Initialized Authentication Scheme 'negotiate'
2017/09/01 02:00:10| Startup: Initialized Authentication Scheme 'ntlm'
2017/09/01 02:00:10| Startup: Initialized Authentication.
2017/09/01 02:00:10| Processing Configuration File: /etc/squid/squid.conf (depth 0)
2017/09/01 02:00:10| Processing: acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
2017/09/01 02:00:10| Processing: acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
2017/09/01 02:00:10| Processing: acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
2017/09/01 02:00:10| Processing: acl localnet src fc00::/7 # RFC 4193 local private network range
2017/09/01 02:00:10| Processing: acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
2017/09/01 02:00:10| Processing: acl SSL_ports port 443
2017/09/01 02:00:10| Processing: acl Safe_ports port 80 # http
2017/09/01 02:00:10| Processing: acl Safe_ports port 21 # ftp
2017/09/01 02:00:10| Processing: acl Safe_ports port 443 # https
2017/09/01 02:00:10| Processing: acl Safe_ports port 70 # gopher
2017/09/01 02:00:10| Processing: acl Safe_ports port 210 # wais
2017/09/01 02:00:10| Processing: acl Safe_ports port 1025-65535 # unregistered ports
2017/09/01 02:00:10| Processing: acl Safe_ports port 280 # http-mgmt
2017/09/01 02:00:10| Processing: acl Safe_ports port 488 # gss-http
2017/09/01 02:00:10| Processing: acl Safe_ports port 591 # filemaker
2017/09/01 02:00:10| Processing: acl Safe_ports port 777 # multiling http
2017/09/01 02:00:10| Processing: acl CONNECT method CONNECT
2017/09/01 02:00:10| Processing: http_access deny !Safe_ports
2017/09/01 02:00:10| Processing: http_access deny CONNECT !SSL_ports
2017/09/01 02:00:10| Processing: http_access allow localhost manager
2017/09/01 02:00:10| Processing: http_access deny manager
2017/09/01 02:00:10| Processing: http_access allow localnet
2017/09/01 02:00:10| Processing: http_access allow localhost
2017/09/01 02:00:10| Processing: http_access deny all
2017/09/01 02:00:10| Processing: http_port 3128
2017/09/01 02:00:10| Processing: cache_dir ufs /var/spool/squid 100 16 256
2017/09/01 02:00:10| Processing: coredump_dir /var/spool/squid
2017/09/01 02:00:10| Processing: refresh_pattern ^ftp: 1440 20% 10080
2017/09/01 02:00:10| Processing: refresh_pattern ^gopher: 1440 0% 1440
2017/09/01 02:00:10| Processing: refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
2017/09/01 02:00:10| Processing: refresh_pattern . 0 20% 4320
2017/09/01 02:00:10| Initializing https proxy context
5>启动 (squid命令 参考 squid --help 或者 http://www.phpfans.net/manu/Squid/)
squid -z 初始化缓存目录 可以到 /var/spool/squid 可以使用tree命令 发现父目录 16个 每个下面256子目录 一般缓存数据通过hash算法决定写入哪个目录
squid -N -d1 # -N表示前端运行 -d1表示将错误写入到标准错误输出
6>设置 window机器 设置局域网代理为 squid对应ip和配置端口3128
在linux 检测 tail -f /var/log/squid/access.log 浏览器访问网页 查看日志是否刷新
squid -k shutdown 关闭squid 刷新浏览器 查看效果 是否可以继续访问
常用squid命令简介:
-D 表示后端运行
-k reconfigure|rotate|shutdown|restart|interrupt|kill|debug|check|parse parse解析配置 restart重启 shutdown关闭 reconfigure 修改配置重新读取
-a 指定一个端口 默认覆盖配置文件端口
-f 指定一个具体位置的配置文件
-N 表示前端运行
6>acl控制演示
修改 /etc/squid/
禁用访问qq的图片资源路径 url_regex 表示全路径匹配 urlpath_regex表示匹配除协议 ip和端口以外的其他路径
acl baiduImage url_regex ^http://mat1.gtimg.com/.*$
http_access deny baiduImage
squid -k reconfigure 重新读取配置文件 其他控制参考http://www.phpfans.net/manu/Squid/
7>web界面管理squid
拷被 /usr/lib64/squid下的cachemgr.cgi 到apache(yum -y install httpd)配置的静态物理 /var/www/cgi-bin目录下
打开 /etc/httpd/conf/httpd.conf DocumentRoot下添加一行
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
该行表示/var/www/cgi-bin使用cgi解析 访问路径为 cgi-bin
访问 http://localhost/cgi-bin/cachemgr.cgi访问
squid支持使用命令行工具 squidclient进行缓存管理 常用操作如下
squidclient -h squid主机名 -p squid端口
squidclient -p 80 mgr:info # squid 的运行统计信息
squidclient -p 80 mgr:mem # 内存使用情况
squidclient -p 80 mgr:diskd #硬盘缓存使用情况
squidclient -p 80 mgr:objects #已经缓存的列表
squidclient -p 80 mgr:io #IO 情况
#删除某个url对应的缓存
squidclient -p 80 -m PURGE "http://192.168.58.145:8088/"
#删除所有缓存对象
#awk '{print $7}' /usr/local/squid/var/logs/access.log \
| grep www.example.com \
| xargs -n 1 squidclient -m PURGE
三。squid反向代理
模拟环境
192.168.58.145:8088 httpd服务 /var/www/html 添加静态网页或者图片
192.168.58.146:80 httpd服务 /var/www/html 添加静态网页或者图片 和145 httpd文件相同
192.168.58.145:80 squid反向代理
修改squid配置文件 vi /etc/squid/squid.conf 修改如下代码
http_port 80 accel vhost vport # accel表示使用加速(缓存) vhost vport表示使用虚拟ip和端口
cache_peer 192.168.58.145 parent 8088 0 weight=2 #抓取的后端服务器的ip parent表示后台服务器(slibing抓取同级squid) 8088后台端口 0表示是否使用icp端口
cache_peer 192.168.58.146 parent 80 0 weight=1 #可以设置其他选项 比如权重等 负载相关参数(具体参考http://www.visolve.com/solutions-services/system-services/squid/squid30/neighboursel.php#cache_peer)
offline_mode on 表示不会后台验证资源是否有效 直接从缓存中获取
访问 http://192.168.58.146/test.jpg 使用 tail -f /var/log/access.log查看缓存效果
也可以使用浏览器查询响应头 或者使用curl -I 查看响应头一般会多出一个X-Cache相应参数
X-Cache: HIT from bogon
X-Cache-Lookup: HIT from bogon:80
日志文件非常重要 需要获取到其中缓存的占比
查看缓存击中率
cat /var/log/squid/access.log |grep TCP_MEM_HIT
相应于HTTP请求,下列标签可能出现在access.log文件的第四个空格后.
TCP_HIT
Squid发现请求资源的貌似新鲜的拷贝,并将其立即发送到客户端.
TCP_MISS
Squid没有请求资源的cache拷贝.
TCP_REFERSH_HIT
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.原始服务器返回304(未修改)响应,指示squid的拷贝仍旧是新鲜的.
TCP_REF_FAIL_HIT
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.然而,原始服务器响应失败,或者返回的响应Squid不能理解.在此情形下,squid发送现有cache拷贝(很可能是陈旧的)到客户端.
TCP_REFRESH_MISS
Squid发现请求资源的貌似陈旧的拷贝,并发送确认请求到原始服务器.原始服务器响应新的内容,指示这个cache拷贝确实是陈旧的.
TCP_CLIENT_REFRESH_MISS
Squid发现了请求资源的拷贝,但客户端的请求包含了Cache-Control: no-cache指令.Squid转发客户端的请求到原始服务器,强迫cache确认.
TCP_IMS_HIT
客户端发送确认请求,Squid发现更近来的、貌似新鲜的请求资源的拷贝.Squid发送更新的内容到客户端,而不联系原始服务器.
TCP_SWAPFAIL_MISS
Squid发现请求资源的有效拷贝,但从磁盘装载它失败.这时squid发送请求到原始服务器,就如同这是个cache丢失一样.
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_DENIED
因为http_access或http_reply_access规则,客户端的请求被拒绝了.注意被http_access拒绝的请求在第9域的值是NONE/-,然而被http_reply_access拒绝的请求,在相应地方有一个有效值.
TCP_OFFLINE_HIT
当offline_mode激活时,Squid对任何cache响应返回cache命中,而不用考虑它的新鲜程度.
TCP_REDIRECT
重定向程序告诉Squid产生一个HTTP重定向到新的URI(见11.1节).正常的,Squid不会记录这些重定向.假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS预处理指令.
NONE
无分类的结果用于特定错误,例如无效主机名.
相应于ICP查询,下列标签可能出现在access.log文件的第四域.
UDP_HIT
Squid在cache里发现请求资源的貌似新鲜的拷贝.
UDP_MISS
Squid没有在cache里发现请求资源的貌似新鲜的拷贝.假如同一目标通过HTTP请求,就可能是个cache丢失.请对比UDP_MISS_NOFETCH.
UDP_MISS_NOFETCH
跟UDP_MISS类似,不同的是这里也指示了Squid不愿去处理相应的HTTP请求.假如使用了-Y命令行选项,Squid在启动并编译其内存索引时,会返回这个标签而不是UDP_MISS.
UDP_DENIED
因为icp_access规则,ICP查询被拒绝.假如超过95%的到某客户端的ICP响应是UDP_DENIED,并且客户端数据库激活了(见附录A),Squid在1小时内,停止发送任何ICP响应到该客户端.若这点发生,你也可在cache.log里见到一个警告.
UDP_INVALID
Squid接受到无效查询(例如截断的消息、无效协议版本、URI里的空格等).Squid发送UDP_INVALID响应到客户端.