zoukankan      html  css  js  c++  java
  • Squid 操作实践

    • Squid简介

    • Squid可以做什么

    • 性能要素

    • Squid安装

    • Squid快速体验

    • Squid配置


    Squid简介

    Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. Squid has extensive access controls and makes a great server accelerator. It runs on most available operating systems, including Windows and is licensed under the GNU GPL

    翻译过来大致意思:

     Squid是一个支持HTTP,HTTPS,FTP等众多协议的缓存代理。可以降低带宽 和 提高响应时间


    squid是硬盘缓存,其使用内存作缓存内容的索引
    (一个索引在32位系统中大小是75bytes,在64位系统中是112bytes)。
    可以把squid想象成数据库,硬盘上是数据,内存中是索引:查询内存索引,发现内存位置,发出去


    性能要素

    1. 大内存(最重要,影响最大);快速大硬盘(第二要素,更多缓存,看网站实际数据量了,要快速的,最好是1万转以上的,如sas10K或西部数据的猛禽系列);CPU(较为次要,影响不大,特别是多核处理器基本没用)。

    2. 建议匹配配置:每G磁盘空间需要32M内存。这样,512M内存的系统,能支持16G的磁盘缓存。你的情况当然会不同。
      内存需求依赖于如下事实:缓存目标大小,CPU体系(32位或64位),同时在线的用户数量,和你使用的特殊功能。估算:建立一个有足够磁盘空间,可存储 3-7天web流量数据的系统。如带宽1M,则需要约3600*1M的数据缓存(3.5G),如果一天提供8小时有效访问,则需要缓存10-28G(看重复情况了)。但Squid官方网站说法:squid使用内存表索引硬盘缓存内容,硬盘内容/内存索引=177,但要同时考虑到squid程序内存,cache_mem,硬盘缓冲cache等占用的内存。因此,我的估算:2G内存的系统,使用1.5G内存作squid索引,对应硬盘150G。

    3. 关于硬盘说明:requests per second = 1000/seek time/硬盘数,一块硬盘是比较准确的,多块硬盘就不好说了。一定要用random-seek time小的盘,而随机寻道时间短意味着转速要快,越快其随机寻道时间越短!

    Squid可以做什么

    squid可以做代理,也可以做防火墙,也可以提高是网站加速器,节省服务器带宽资源(为公司省钱)


    Squid安装

    本人操作系统Ubuntu12.04(使用vagrant创建的虚拟机)


    $ sudo apt-get install squid3
    $ sudo service squid3 stop/restart


    Squid快速体验

    先备份默认配置文件

    $ sudo cp /etc/squid3/squid.conf /etc/squid3/squid.default.conf


    配置接受请求(默认不接受任何请求)

    $ http_access deny all  修改成  http_access allow all


    给代理起个名字(搜索visible_hostname )

    $ visible_hostname testProxy
    $ cache_mgr admin@54php.cn


    设置dns服务地址 : 打造私有的DNS 服务


    $ vim /etc/squid3/squid.conf #search dns_nameservers
    dns_nameservers 192.168.22.24 192.168.22.25


    重启服务

    $ sudo service squid3 restart


    然后找个浏览器设置HTTP代理地址 和  端口(默认3128)

    Squid配置

    文件和日志相关配置

    #指定cache在硬盘上存放的路径,最大存储40G,16个一级目录,256个二级目录
    #修改完cache_dir路径重启之前要squid3 -z
    cache_dir ufs /data/logs/squid3/cache  40960  16 256 
    
    #squid启动和调试等信息
    cache_log /data/logs/squid3/cache.log 
    
    #squid请求日志
    access_log /data/logs/squid3/access.log squid 
    
    #记录进入和离开缓存的每个目标的记录
    cache_store_log /data/logs/squid3/store.log


    cache_mem  2048 MB           #squid使用共享内存大小,一般设置为内存1/3左右
    cache_swap_low 85            #配合cache_mem使用,当达到百分之85后,就把旧的内容替换直到降到百分之85
    cache_swap_high 95

    #日志保留最近30个文件,每天轮询三次,即保留最近十天的内容.

    logfile_rotate  30


    访问控制(重点)关键字 acl http_access

    acl 语法,每一行的访问控制都必须有 名字 和 类型,如下

    acl aclname acltype param


    常见acltype列表


    类型描述
    例子
    src客户端ipacl aclname src  192.168.22.21  192.168.22.0/24
    dst目标ip,既访问URL的ipacl aclname dst 220.181.57.217 220.181.57.0/24
    arpmac地址acl aclname arp 08:00:27:dd:97:09
    srcdomain
    没想到应用场景
    dstdomain目标服务器域名acl aclname dstdomain   .foo.com
    srcdom_regex正则表达式没想到应用场景
    dstdom_regex正则表达式acl aclname dstdom_regex [-i] .foo.com
    url_regex访问url正则acl aclname url_regex [-i] ^http:// ...
    urlpath_regex访问path正则acl aclname urlpath_regex [-i] .gif$
    port目前端口
    acl aclname port 80 70 21 0-1024
    proto协议acl aclname proto HTTP FTP ...
    http_statushttp 状态acl aclname http_status 200 301 500- 400-403 ...
    method
    acl aclname method GET POST ...
    browseruser-agent匹配acl aclname browser [-i] regexp ...
    referer_regexreferer匹配acl aclname referer_regex [-i] regexp ...
    req_mime_type请求mine类型

    acl aclname req_mime_type -i ^multipart/form-data$

    acl aclname rep_mime_type -i ^application/x-javascript$


    http_access 语法格式

    http_access allow|deny [!]aclname


    结合acl  和 http_access 举例

    acl white_ip_list  src 192.168.22.0/24
    acl deny_domain dstdomain .qq.com .taobao.com  
    http_access deny deny_domain #等价于http_access allow !deny_domain
    http_access allow white_ip_list


    refresh_pattern的作用

    主要用于一个页面进入cache后,它在cache中停留的时间。refresh_pattern规则仅仅应用到没有明确过时期限的响应。原始服务器能使用Expires头部,或者Cache-Control:max-age指令来指定过时期限

    #语法
    refresh_pattern [-i] regexp min percent max [options]

    min参数就是分钟数,它是过时响应的最低时间限制,如果某个响应驻留在cache里的时间没有超过这个最低限制,那么它不会过期


    max参数也是分钟数,它是过时响应的最高时间限制,如果某个响应驻留在cache里的时间高于这个最高限制,那么它必须被刷新


    在最低和最高时间限制之间的响应,会面对squid的最后修改系数LM-factor算法LM-factor=(response age)/(resource age)


    options可能值如下

    override-expire
    该选项导致squid在检查Expires头部之前,先检查min值。这样,一个非零的min时间让squid返回一个未确认的cache命中,即使该响应准备过期
    
    override-lastmod 
    改选项导致squid在检查LM-factor百分比之前先检查min值
    
    reload-into-ims 
    该选项让squid在确认请求里,以no-cache指令传送一个请求。换句话说,squid在转发请求之前,对该请求增加一个If-Modified- Since头部。注意这点仅仅在目标有Last-Modified时间戳时才能工作。外面进来的请求保留no-cache指令,以便它到达原始服务器。 
    一般情况可以使用 reload-into-ims。它其实是强行控制对象的超时时间,这违反了http协议的精神,但是在带宽较窄的场合,可以提高明显系统相应时间
    
    ignore-reload 
    该选项导致squid忽略请求里的任何no-cache指令。 
    所以。如果希望内容一进入cache就不删除,直到被主动purge掉为止,可以加上ignore-reload选项,这个我们常用在mp3,wma,wmv,gif之类


    reload-into-ims例子如下:

    refresh_pattern -i .html 1440 50% 10080 reload-into-ims

    refresh_pattern -i .htm 1440 50% 10080 reload-into-ims

    refresh_pattern -i .shtml 1440 50% 10080 reload-into-ims

    refresh_pattern -i .png 4320  50% 20160 reload-into-ims

    refresh_pattern -i .gif 4320  50% 20160 reload-into-ims

    refresh_pattern -i .bmp 4320  50% 20160 reload-into-ims

    refresh_pattern -i .jpg 4320  50% 20160 reload-into-ims

    refresh_pattern -i .js 4320  50% 20160 reload-into-ims

    refresh_pattern -i .css 4320  50% 20160 reload-into-ims

    refresh_pattern -i .swf 4320  50% 20160 reload-into-ims


    ignore-reload例子如下:

    refresh_pattern -i .mp3$ 1440 50% 2880 ignore-reload 
    refresh_pattern -i .wmv$ 1440 50% 2880 ignore-reload 
    refresh_pattern -i .rm$ 1440 50% 2880 ignore-reload 
    refresh_pattern -i .swf$ 1440 50% 2880 ignore-reload 
    refresh_pattern -i .mpeg$ 1440 50% 2880 ignore-reload 
    refresh_pattern -i .wma$ 1440 50% 2880 ignore-reload 


    LM-factor

    LM-factor=(response age)/(resource age) 
    举个例子,这里只考虑percent, 不考虑min 和max 
    例如:refresh_pattern 20% 
    假设源服务器上www.aaa.com/index.htm -----lastmodified 是 2007-04-10 02:00:00 
    squid上 proxy.aaa.com/index.htm index.htm进入cache的时间 2007-04-10 03:00:00 

    1)如果当前时间 2007-04-10 03:00:00 
    resource age =3点-2点=60分钟 
    response age =0分钟 
    index.htm还可以在cache停留的时间(resource age)*20%=12分钟 
    也就是说,index.htm进入cache后,可以停留12分钟,才被重新确认。 

    2)如果当前时间 2007-04-10 03:05:00 
    resource age =3点-2点=60分钟 
    response age =5分钟 
    index.htm还可以在cache停留的时间(resource age)*20%=12分钟-5=7 
    LM-factor=5/60=8.3%<20% 

    一直到2007-04-10 03:12:00 LM-factor=12/60=20% 之后,cache中的页面index.htm终于stale。 
    如果这时没有index.htm的请求,index.htm会一直在缓存中,如果有index.htm请求,squid收到该请求后,由于已经过期, squid会向源服务器发一个index.htm是否有改变的请求,源服务器收到后,如果index.htm没有更新,squid就不用更新缓存,直接把缓存的内容放回给客户端,同时,重置对象进入cache的时间为与源服务器确认的时间,比如2007-04-10 03:13:00,如果正好在这个后重新确认了页面。重置后,resource age变长,相应在cache中存活的时间也变长。 

    如果有改变则把最新的index.htm返回给squid,squid收到会更新缓存,然后把新的index.htm返回给客户端,同时根据新页面中的Last_Modified和取页面的时间,重新计算resource age,进一步计算出存活时间。 
    实际上,一个页面进入cache后,他的存活时间就确定了,即 (resource age) * 百分比,一直到被重新确认


    cache_peer

    cache_peer 语法格式

    cache_peer hostname type http-port icp-port [options]
    名称描述
    typeparent,sibling,multicast
    proxy-port
    此处应该填写可以接受http请求的服务端口,squid服务常用端口是3128,web服务常用端口是80
    icp-port
    用于查询邻居cache服务中的对象,不支持icp或者HTCP的就设置为0
    optionsno-query关闭icp查询,不做查询操作,直接获取数据

    originserver原始服务器(web服务器)

    no-digest关闭cache digests请求,代理服务器之间不做摘要表查询,直接用ICP协议沟通(同级代理)

    proxy_only
    直接获取对方缓冲,转交给代理服务器的客户端,而不存入本地

    round-robin如果设置数部上层服务器,那么轮流查询父级服务器,此时weight参数才会起作用

    sourcehash已客户端ip做负载均衡




    直接转发到web服务器


    从客户端过来的请求,如果是 blog.dr.local.com,则Squid向 Server 192.168.22.21 的端口80发送请求

    从客户端过来的请求,如果是 admin.dr.local.com static.dr.local.com ,则Squid向 Server 192.168.22.24 的端口80发送请求

    cache_peer 192.168.22.21 parent 80 0 no-query originserver weight=10 name=a
    cache_peer 192.168.22.24 parent 80 0 no-query originserver weight=1  name=b
    
    cache_peer_domain a blog.dr.local.com
    cache_peer_domain b admin.dr.local.com static.dr.local.com


    负载均衡配置

    表明对blog.dr.local.com的请求,squid向192.168.22.21的80端口和192.168.22.24的80端口发出请求

    cache_peer 192.168.22.21 parent 80 0 no-query  no-digest originserver weight=10 name=a  sourcehash
    cache_peer 192.168.22.24 parent 80 0 no-query  no-digest originserver weight=1  name=b  sourcehash
    
    cache_peer_domain a blog.dr.local.com
    cache_peer_domain b blog.dr.local.com


    日志


    新缓存命中

    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等形式记录。

    access拒绝

    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。正常的,Squid不会记录这些重定向。假如要这样做,必须在编译squid前,手工定义LOG_TCP_REDIRECTS
    预处理指令。


    NONE

    这指明Squid对本次请求,不会与任何其他服务器(邻居或原始服务器)通信。它通常与cache命中、拒绝请求、cache管理请求、错误、和所有的ICP查询这些类型联合出现。


    DIRECT

    Squid直接转发请求到原始服务器。该域的第2半部分显示原始服务器的IP地址,或主机名
    --假如禁止了log_ip_on_direct。



    查询squid情况

    $ sudo apt-get install squidclient
    $ squidclient -p 3128 mgr:info


    参考文章:http://www.squid-cache.org/


    原文地址:Squid 操作实践
    标签:squid   dns   cache_peer   refresh_pattern   proxy   reverse   

    智能推荐

  • 相关阅读:
    Docker 清理命令汇总
    Apache2.4.x版wampserver本地php服务器如何让外网访问及启用.htaccess
    github访问受限,通过更改host进行直接访问
    Python开发qq批量登陆
    Window安装Anaconda后,conda不是内部或者外部命令
    linux清空文件夹命令问题
    discuz添加管理员,找回管理员方法
    discuz论坛模板文件目录
    PyCharm创建文件时自动添加头注释
    python跳一跳辅助学习
  • 原文地址:https://www.cnblogs.com/apanly/p/5165294.html
Copyright © 2011-2022 走看看