squid实现代理和cdn缓存

xiaoxiao2021-02-28  66

一。 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.6miu.com/read-83358.html

最新回复(0)