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响应到客户端.

  



原文地址:https://www.cnblogs.com/liaomin416100569/p/9331194.html