Linux服务器集群 - Squid缓存,代理服务

Posted YunGaZeon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux服务器集群 - Squid缓存,代理服务相关的知识,希望对你有一定的参考价值。

一.Squid简介

  Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。

和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。

  它通过缓存和重用频繁请求的web页面来减少带宽和提高响应时间。Squid具有广泛的访问控制,是一个很好的服务器加速器。它运行在大多数可用的操作系统上,包括Windows,并根据GNU GPL获得许可。

  Squid将数据元缓存在内存中,同时也缓存DNS查询的结果,除此之外,它还支持非模块化的DNS查询,对失败的请求进行消极缓存。Squid支持SSL,支持访问控制。由于使用了ICP(轻量Internet缓存协议),Squid能够实现层叠的代理阵列,从而最大限度地节约带宽。  
Squid由一个主要的服务程序squid,一个DNS查询程序dnsserver,几个重写请求和执行认证的程序,以及几个管理工具组成。当Squid启动以后,它可以派生出预先指定数目的dnsserver进程,而每一个dnsserver进程都可以执行单独的DNS查询,这样一来就大大减少了服务器等待DNS查询的时间。

  Squid会在设置的缓存目录下建立多个目录,每一个目录下又建立多个目录,然后才在最里层的目录中存放缓存文件(object)。squid会根据用户请求网页的URL进行哈希,生成缓存文件,存放在某一个目录中。squid启动之后,将在内存中建立一个哈希表,记录硬盘中缓存文件配置的情形。

  定义:一个缓存服务器的守护进程  

  存储分类:磁盘 > 分区 > 目录 > Object(对象,缓存文件)

  索引方式

    • Hash Tables   目录  每个Digest的索引信息
    • Digest Tables    索引  不同分区对应的 Object大概说明

  主要作用

    • 通过缓存的方式为用户提供Web访问加速
    • 对用户的Web访问进行过滤控制

   注意:Squid无健康检测,因此作为反向代理服务器时,后端服务器必须为高可用

  官方网站: http://www.squid-cache.org

 

1.Squid工作原理

Squid代理服务器工作在TCP/IP模型的应用层(7层)

 

当我们客户机通过squid代理去访问web页面时,指定的代理服务器会先检查自己的缓存,

若是缓存中有我们客户机需要的页面,那么squid服务器将直接把缓存中的页面内容返回给客户机,

如果缓存中没有客户端请求的页面,那么squid代理服务器就会向internet发送访问请求,获得返回的web页面后,将网页的数据保存到缓存中并发送给客户机。

Squid工作逻辑结构图

 

具体流程:

  ①当代理服务器中有客户端需要的数据时:   

    a. 客户端向代理服务器发送数据请求;   

    b. 代理服务器检查自己的数据缓存;   

    c. 代理服务器在缓存中找到了用户想要的数据,取出数据;   

    d. 代理服务器将从缓存中取得的数据返回给客户端。

  ②当代理服务器中没有客户端需要的数据时:

    1.客户端向代理服务器发送数据请求;

    2.代理服务器检查自己的数据缓存;

    3.代理服务器在缓存中没有找到用户想要的数据;

    4.代理服务器向Internet 上的远端服务器发送数据请求;

    5.远端服务器响应,返回相应的数据;

    6.代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中

 

 

 

 

2.Squid三种代理类型

  • 正向代理-传统模式:普通的代理服务,需要我们客户端在浏览器、聊天工具等一些程序中设置代理服务器的地址和端口,然后才能使用代理来访问网络,这种方式相比较而言比较麻烦,因为客户机还需手动指定代理服务器,所以一般用于Internet环境。  一个标准的代理缓冲服务被用于缓存静态的网页到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指名代理服务器的IP地址和端口号。客户端上网时,每次都把请求发送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发送给客户端浏览器。
  • 正向代理-透明模式:与传统代理实现的功能是一样的,区别在于客户机不需要手动指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将web访问重定向,实际上仍然交给代理服务器来处理,重定向的过程完全是由squid服务器进行的,所以对于客户机来说,甚至不知道自己使用了squid代理服务,因此,我们称之为透明模式。透明代理多用于局域网环境,如在Linux网关中启用透明代理后,局域网主机无须进行额外设置就能享受更好的上网速度。 透明代理缓冲服务器和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因此不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。
  • 反向代理模式:反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于本地WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向WEB服务器的请求数从而降低了WEB服务器的负载。 反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发给用户。这种方式通过降低了WEB服务器的请求数从而降低了WEB服务器的负载。

       

3.Squid主要组成部分

服务名:squid
主程序:/usr/sbin/squid
配置目录:/etc/squid
主配置文件:/etc/squid/squid.conf
默认监听端口号:TCP 3128
默认访问日志文件:/var/log/squid/access.log

 

4.squid常用配置选项

vi /etc/squid/squid.conf

http_port 3128  (还可以只监听一个IP http_port 192.168.0.1:3128)
cache_mem 64MB  #指定squid能够使用的内存大小
maximum_object_size 4096KB #指定squid最大允许缓存对象的大小,目标缓存文件大于此配置时,不作缓存 reply_body_max_size 10MB allow all #指定允许通过Squid的单个元素大小,当网络数据大于此配置时,不予通过
access_log /var/log/squid/access.log #指定Squid存储日志目录 visible_hostname proxy.test.xom #指定Squid服务器自身的主机名
dns_testnames www.baidu.com www.163.com #指定Squid服务器测试本机是否正常时的测试域名
cache_dir ufs /var/spool/squid 100 16 256   #ufs:缓存数据的存储格式   #/var/spool/squid 缓存目录   #100:缓存目录占磁盘空间大小(M)   #16:缓存空间一级子目录个数   #256:缓存空间二级子目录个数
cache_mgr webmaster@test.com #定义管理员邮箱 http_access deny all #访问控制

 

三.Squid传统模式 搭建

1.实验环境

  1. 系统:皆为Centos 7
  2. 配置:
    1. 关闭NetworkManager,firewalld开放22,80端口,设好yum源
    2. 虚拟机网卡均为host-only仅主机模式,虚拟网络编辑器vmnet仅主机取消DHCP分配
    3. 增加vmnet1的IP地址为10.10.10.240,20.20.20.240
  3. 网络拓扑:
    1. 内网机:10.10.10.11  设置网关为10.10.10.12
    2. Squid服务器:10.10.10.12 网卡0对内,20.20.20.12 网卡1对公
    3. 公网服务器:20.20.20.13 Apache服务器

 

2.设置内网机

设置eth0网卡IP:10.10.10.12 ,网关:10.10.10.12 

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

    TYPE=Ethernet
    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    NM_CONTROLLED=yes
    IPADDR=10.10.10.11
    NETMASK=255.255.255.0
    GATEWAY=10.10.10.12

#service network restart #重启网络

查看是否生效:

#ip route

default via 10.10.10.12 dev eth0 proto static metric 100 
10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.11 metric 100

设置代理服务器

#set "http_proxy=http://root:yourpassword@10.10.10.12:3128/" #临时设置代理

 

3.设置公网服务器

修改IP:20.20.20.13

#vi /etc/sysconfig/network-scripts/ifcfg-eth0

    TYPE=Ethernet
    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    NM_CONTROLLED=yes
    IPADDR=20.20.20.13
    NETMASK=255.255.255.0

#service network restart #重启网络

安装Apache

#yum -y install httpd
#service httpd start

写一个页面

#echo "This is Apache WebServer" >> /var/www/html/index.html

本地访问测试

#curl localhost

 

4.设置Squid服务器

设置内网网卡IP:10.10.10.12,公网网卡IP:20.20.20.12

#vi /etc/sysconfig/network-scripts/ifcfg-eth0
    TYPE=Ethernet
    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    NM_CONTROLLED=yes
    IPADDR=10.10.10.12
    NETMASK=255.255.255.0
#vi /etc/sysconfig/network-scripts/ifcfg-eth1 TYPE=Ethernet BOOTPROTO=static NAME=eth1 DEVICE=eth1 ONBOOT=yes NM_CONTROLLED=yes IPADDR=20.20.20.12 NETMASK=255.255.255.0 #service network restart #重启网络

设置路由转发

#vi /etc/sysctl.conf
    net.ipv4.ip_forward = 1 #开启路由转发

#sysctl -p #刷新系统配置

安装启动Squid

#yum -y install squid
#service squid start

squid配置文件

#vi /etc/squid/squid.conf 

传统模式无需改动

若未关闭防火墙,则需要开放3128端口

#firewall-cmd --zone=public --add-port=3128/tcp --permanent
#firewall-cmd --reload

 

5.测试实验

#内网机访问公网机
#curl 20.20.20.13
This is Apache WebServer

#公网机关闭apache
#service httpd stop

#内网机访问公网机
#curl 20.20.20.13
This is Apache WebServer

公网机关服后,内网机依然可以获取已缓存内容。 

 

四.Squid透明模式 搭建

透明模式与传统模式大部分相同,仅需修改内网机和Squid服务机的配置。

1.内网服务器配置

无需设置代理服务

#去除临时设置的环境变量中的代理配置,set命令可查看所有环境变量
#unset http_proxy

 

 2.Squid服务器配置

 1.修改squid配置

#vi /etc/squid/squid.conf
    http_port 10.10.10.12:3128 transparent 
    visible_hostname www.gazeon.com #随便写,可有可无

#service squid restart #重启squid

2.修改防火墙,配置端口转发

#设置对内网卡zone
#firewall-cmd --permanent --zone=internal --change-interface=eth0

#设置对公网卡zone
#firewall-cmd --permanent --zone=external --change-interface=eth1

#设置IP地址伪装
#firewall-cmd --zone=external --add-masquerade --permanent

#设置NAT转发,将10.10.10.0/24网段交由eth0网卡处理
#firewall-cmd --permanent --direct --passthrough ipv4 -t nat POSTROUTING -o eth0 -j MASQUERADE -s 10.10.10.0/24

#设置端口转发,将80端口接收到的流量,交给IP10.10.10.12即内网卡 3128端口即squid 处理
#firewall-cmd --zone=internal --add-forward-port=port=80:proto=tcp:toport=3128:toaddr=10.10.10.12

#重载
#firewall-cmd --reload

如果防火墙是iptables,则为如下设置

#将网卡为eth0,网段为10.10.10.0/24,端口为80的请求交由3128端口,即squid处理。
#iptables -t nat -A PREROUTING -i eth0 -s 10.10.10.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128

 

3.测试方式与上面相同

 

4.下载限制

1.Squid服务器设置

#dd if=/dev/zero of=1234.txt bs=1M count=15
#vi /etc/squid/squid.conf
    reply_body_max_size 1024*1024*20

#service squid restart

2.公网服务器增加1234.txt文件

3.内网服务器访问下载该文件测试效果

wget 20.20.20.13/1234.txt

 

 

五.Squid反向代理模式 搭建

1.实验环境

  1. 系统:皆为Centos 7
  2. 配置:
    1. 关闭NetworkManager,firewalld开放22,80端口,设好yum源
    2. 虚拟机网卡均为host-only仅主机模式,虚拟网络编辑器vmnet仅主机取消DHCP分配
    3. 增加vmnet1的IP地址为10.10.10.240,20.20.20.240
  3. 网络拓扑:
    1. 内网服务器:机1:10.10.10.11  ,机2:10.10.10.12   Apache服务器
    2. Squid服务器:10.10.10.13 网卡0对内,20.20.20.13 网卡1对公
    3. 公网客户机:20.20.20.14 

 

 

 

2.内网服务器配置

设置IP

#临时设置IP地址,两台均设置
#ifconfig eth0 10.10.10.1X/24
#ip route add default via 10.10.10.13 #设定默认路由为squid服务器ip,相当于"GATEWAY=10.10.10.13"

安装启动Apache

#yum -y install httpd
#service httpd start

分别写一个页面

#echo "This is Apache WebServer via IP 10.10.10.1X" >> /var/www/html/index.html

 

3.Squid服务器配置

设置内网网卡IP:10.10.10.13,公网网卡IP:20.20.20.13

#临时设置IP地址
#ip addr add 10.10.10.13/24 dev eth0
#ip addr add 20.20.20.13/24 dev eth1

开启路由转发

#vi /etc/sysctl.conf
    net.ipv4.ip_forward = 1 #开启路由转发

#sysctl -p #刷新系统配置

开放3128端口

#firewall-cmd --zone=public --add-port=3128/tcp --permanent
#firewall-cmd --reload

安装Squid

#yum -y install squid
#service squid start

配置Squid

#vi /etc/squid/squid.conf

  acl localnet src 20.20.20.0/24 #增加此网段的acl控制
  #在最下面加上以下配置 http_port
20.20.20.13:80 vhost http_access allow all visible_hostname www.gazeon.com cache_peer 10.10.10.11 parent 80 0 originserver round-robin cache_peer 10.10.10.12 parent 80 0 originserver round-robin
   #cache_peer 内网服务器IP 父级代理 80端口 网络中无其他代理 squid以轮询方式转发到节点(squid只有轮询方式) #service squid reload #重新加载配置

 

4.公网客户机设置

设置IP 20.20.20.14

#临时设置IP地址
#ip addr add 20.20.20.14/24 dev eth0

 

5.测试

 公网客户机访问Squid服务器

#curl 20.20.20.13

 

 

六.Squid ACL设置

ACL(Access Control List,访问控制列表) ,根据源地址,目标URL,文件类型等定义列表 。

使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。

squid访问控制有两个要素:ACL元素和访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。

1.ACL格式

1.为了使用控制功能,必须先设置ACL规则并应用。ACL声明的格式如下

acl acl_element_name(列表名称) type_of_acl_element(类型) values_to_acl(内容,值)

  注:

  • acl_element_name 可以是任一个在ACL中定义的名称
  • 任何两个ACL元素不能用相同的名字
  • 每个ACL由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换言之,即任一ACL元素的值被匹配,则这个ACL元素即被匹配。
  • 并不是所有ACL元素都能使用访问列表中的全部类型
  • 不同的ACL元素写在不同行中,squid将把他们组合在一个列表中

2.针对已定义的acl列表进行限制

http_access allow或deny 列表名称

 

2.访问条目

我们可以使用许多不同的访问条目。下面是我们常用的几个:

  • http_access:允许HTTP访问
  • no_cache:定义对缓存请求的响应。

  访问列表的规则由一些类似\'allow\'或‘deny’的关键字构成,用以允许或拒绝向特定或一组ACL元素提供服务。

    1. 一个访问列表可以由多条规则组成
    2. 如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。

    3. 一个访问条目中所有元素将用逻辑与运算连接
      http_access Action 声明1 AND 声明2 AND 声明 OR.
      http_access Action 声明3
      多个http_accesss声明间用或运算连接,但每个访问条目的元素间用与运算连接。

    4. 列表中的规则总是遵循由上而下的顺序
    5. 这些规则按照他们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配就立即结束。

3.ACL元素类型

src:源地址(即客户机IP地址)
dst:目标地址(即服务器IP地址)
srcdomain:源名称(即客户机名称)
dstdomain:目标名称(即服务器名称)
time:一天中的时刻和一周内的一天
url_regex:URL规则表达式匹配
urlpath_regex:URL-path规则表达式匹配,略去协议和主机名
proxy_auth:通过外部程序进行用户验证
maxconn:单一IP的最大连接数

4.规则总结说明

1.如果仅仅只有acl设定而没有http_access 设置默认拒绝

2.如果http_access deny all 未定义,并且自己定义了一个acl范围,默认使用最后一条规则的反向规则(即最后一条为deny,则http_access为allow,反之亦然)

 

七.附录

1.Squid配置详解

cat /etc/squid/squid.conf

#acl all src 0.0.0.0/0.0.0.0 and http_access allow all选项定义了一个访问控制列表。详细情况参见和Squid软件
#携带的文档。这里的访问控制列表允许所有对代理服务的访问,因为这里该代理是加速web服务器。
acl all src 0.0.0.0/0.0.0.0                 #允许所有IP访问
acl manager proto http                 #manager url协议为http
acl localhost src 127.0.0.1/255.255.255.255  #允午本机IP
acl to_localhost dst 127.0.0.1                 #允午目的地址为本机IP
acl Safe_ports port 80                # 允许安全更新的端口为80
acl CONNECT method CONNECT        #请求方法以CONNECT
http_access allow all                #允许所有人使用该代理.因为这里是代理加速web服务器
http_reply_access allow all                #允许所有客户端使用该代理

acl OverConnLimit maxconn 16        #限制每个IP最大允许16个连接,防止攻击
http_access deny OverConnLimit

icp_access deny all                        #禁止从邻居服务器缓冲内发送和接收ICP请求.
miss_access allow all                #允许直接更新请求
ident_lookup_access deny all                                #禁止lookup检查DNS
http_port 8080 transparent                                #指定Squid监听浏览器客户请求的端口号。

hierarchy_stoplist cgi-bin ?                #用来强制某些特定的对象不被缓存,主要是处于安全的目的。
acl QUERY urlpath_regex cgi-bin \\?
cache deny QUERY

cache_mem 1 GB        #这是一个优化选项,增加该内存值有利于缓存。应该注意的是:
                     #一般来说如果系统有内存,设置该值为(n/)3M。现在是3G 所以这里1G
fqdncache_size 1024        #FQDN 高速缓存大小
maximum_object_size_in_memory 2 MB        #允许最大的文件载入内存

memory_replacement_policy heap LFUDA  #动态使用最小的,移出内存cache
cache_replacement_policy heap LFUDA         #动态使用最小的,移出硬盘cache

cache_dir ufs /home/cache 5000 32 512  #高速缓存目录 ufs 类型 使用的缓冲值最大允午1000MB空间,
#32个一级目录,512个二级目录

max_open_disk_fds 0                                 #允许最大打开文件数量,0 无限制
minimum_object_size 1 KB                         #允午最小文件请求体大小
maximum_object_size 20 MB                 #允午最大文件请求体大小

cache_swap_low 90                            #最小允许使用swap 90%
cache_swap_high 95                            #最多允许使用swap 95%

ipcache_size 2048                                # IP 地址高速缓存大小 2M
ipcache_low 90                                #最小允许ipcache使用swap 90%
ipcache_high 95                                  #最大允许ipcache使用swap 90%


access_log /var/log/squid/access.log squid        #定义日志存放记录
cache_log /var/log/squid/cache.log squid
cache_store_log none                        #禁止store日志

emulate_httpd_log on        #将使Squid仿照Web服务器的格式创建访问记录。如果希望使用
                                #Web访问记录分析程序,就需要设置这个参数。

refresh_pattern . 0 20% 4320 override-expire override-lastmod reload-into-ims ignore-reload   #更新cache规则

acl buggy_server url_regex ^http://.... http://          #只允许http的请求
broken_posts allow buggy_server

acl apache rep_header Server ^Apache                 #允许apache的编码
broken_vary_encoding allow apache

request_entities off                                        #禁止非http的标分准请求,防止攻击
header_access header allow all                        #允许所有的http报头
relaxed_header_parser on                                #不严格分析http报头.
client_lifetime 120 minute                                #最大客户连接时间 120分钟

cache_mgr sky@test.com                        #指定当缓冲出现问题时向缓冲管理者发送告警信息的地址信息。

cache_effective_user squid                        #这里以用户squid的身份Squid服务器
cache_effective_group squid

icp_port 0                       #指定Squid从邻居服务器缓冲内发送和接收ICP请求的端口号。
                     #这里设置为0是因为这里配置Squid为内部Web服务器的加速器,
                     #所以不需要使用邻居服务器的缓冲。0是禁用

# cache_peer 设置允许更新缓存的主机,因是本机所以127.0.0.1
cache_peer 127.0.0.1 parent 80 0 no-query default multicast-responder no-netdb-exchange
cache_peer_domain 127.0.0.1                                 
hostname_aliases 127.0.0.1

error_directory /usr/share/squid/errors/Simplify_Chinese        #定义错误路径

always_direct allow all                # cache丢失或不存在是允许所有请求直接转发到原始服务器
ignore_unknown_nameservers on        #开反DNS查询,当域名地址不相同时候,禁止访问
coredump_dir  /var/log/squid                 #定义dump的目录

max_filedesc 2048                #最大打开的文件描述

half_closed_clients off        #使Squid在当read不再返回数据时立即关闭客户端的连接。
                                #有时read不再返回数据是由于某些客户关闭TCP的发送数据
                                #而仍然保持接收数据。而Squid分辨不出TCP半关闭和完全关闭。

buffered_logs on #若打开选项“buffered_logs”可以稍稍提高加速某些对日志文件的写入,该选项主要是实现优化特性。

#防止天涯盗链,转嫁给百度
acl tianya referer_regex -i tianya
http_access deny tianya
deny_info  tianya
#阻止baidu蜘蛛
acl baidu req_header User-Agent Baiduspider
http_access deny baidu
#限制同一IP客户端的最大连接数
acl OverConnLimit maxconn 128
http_access deny OverConnLimit

#防止被人利用为HTTP代理,设置允许访问的IP地址
acl myip dst 222.18.63.37
http_access deny !myip

#允许本地管理
acl Manager proto cache_object
acl Localhost src 127.0.0.1 222.18.63.37
http_access allow Manager Localhost
cachemgr_passwd 53034338 all
http_access deny Manager

#仅仅允许80端口的代理
acl all src 0.0.0.0/0.0.0.0
acl Safe_ports port 80 # http
http_access deny !Safe_ports
http_access allow all

#Squid信息设置
visible_hostname happy.swjtu.edu.cn
cache_mgr  ooopic2008@qq.com

#基本设置
cache_effective_user squid
cache_effective_group squid
tcp_recv_bufsize 65535 bytes

#2.6的反向代理加速配置
cache_peer 127.0.0.1 parent 80 0 no-query originserver

#错误文档
error_directory /usr/local/squid/share/errors/Simplify_Chinese

#单台使用,不使用该功能
icp_port 0

hierarchy_stoplist cgi-bin ?

acl QUERY urlpath_regex cgi-bin \\? .php .cgi .avi .wmv .rm .ram .mpg .mpeg .zip .exe
cache deny QUERY

acl apache rep_header Server ^Apache
broken_vary_encoding allow apache


refresh_pattern ^ftp:           1440 20%     10080
refresh_pattern ^gopher:        1440 0%    1440
refresh_pattern .             0    20%     4320

cache_store_log none
pid_filename /usr/local/squid/var/logs/squid.pid
emulate_httpd_log on
View Code

 

 

2.Squid常用命令

#初始化在squid.conf里配置的cache目录
squid -z
#如果有错误提示,请检查cache目录的权限,可以更改目录权限
chown -R squid:squid /cache目录

#对squid.conf排错,即验证squid.conf的语法和配置
squid -k parse
#如果在squid.conf中有语法或配置错误,这里会返回提示,若无返回,尝试启动squid

#前台启动squid,并输出启动过程
/usr/local/squid/sbin/squid -N -d1
#如果有ready to server reques相关信息,说明squid启动成功
#然后ctrl+c ,停止squid,并以后台运行的方式启动它

#启动squid在后台运行
squid -s
#可以使用ps -ax | grep squid 来查看squid进程是否存在

#停止squid
squid -k shutdown

#重新引导修改过的squid.conf
squid -k reconfigure -f /XXX/squid.conf
#当squid进行配置更改后,可以使用该命令进行squid配置重载

#把squid添加到系统启动项
vim /etc/rc.local
/usr/local/squid/sbin/squid -s

#修改cache缓存目录的权限
chown -R squid.squid /cache目录
#cache缓存目录根据自己的配置更改,squid用户和组是squid,squid

#修改squid日志目录的权限
chown -R squid.squid 定义的日志文件所在目录
#这一步并不是适合每一个使用squid的用户,意为让squid有权限在该目录里进行写操作

#查看你的日志文档
more /usr/local/squid/var/logs/access.log | grep TCP_MEM_HIT
#该指令可以看到在squid运行过程中,有那些文件被squid缓存到内存中,并返回给访问用户。
more /usr/local/squid/var/logs/access.log | grep TCP_HIT
#该指令可以看到在squid运行过程中,有那些文件被squid缓存到cache目录中,并返回给访问用户。
more /usr/local/squid/var/logs/access.log | grep TCP_MISS
#该指令可以看到在squid运行过程中,有那些文件没有被squid缓存,而是从原始服务器获取并返回给访问用户。

 

 

3.Squid命中率分析

/usr/local/squid/bin/squidclient -p 80 mgr:info/usr/local/squid/bin/squidclient -p 80 mgr:5min

可以看到详细的性能情况,其中PORT是你的proxy的端口,5min可以是60min

取得squid运行状态信息:

squidclient -p 80 mgr:info

取得squid内存使用情况:

 squidclient -p 80 mgr:mem

取得squid已经缓存的列表:

squidclient -p 80 mgr:bjects. use it carefully,it may crash

取得squid的磁盘使用情况:

squidclient -p 80 mgr:diskd

强制更新某个url:

squidclient -p 80 -m PURGE http://www.xxx.com/xxx.php

更多的请查看:squidclient-h 或者 squidclient -p 80 mgr:

查命中率:

squidclient -h IP(具体侦听IP) -p 80(具体侦听端口) mgr:info

 

4.Squid缓存清理

1.定期清理swap.state内无效数据

/path/to/squid/sbin/squid -k rotate -f /path/to/squid/conf_file
vi /etc/crontab
0 0 * * * root /usr/local/sbin/squid -k rotate -f /usr/local/etc/squid/squid1.conf

当squid应用运行了一段时间之后,cache_dir对应的swap.state文件就会变得越来越大,里面的无效接口数据越来越多,这可能影响squid的响应时间,因此需要使用squid清理swap.state里面的无效数据,减少swap.state的大小。

 

2.清理指定缓存

①首先在squid的主配置文件中添加acl 列表,并允许受信任的主机有权限清除缓存。
#vi /etc/squid/squid.conf

    acl managercache src 192.168.1.145 127.0.0.1
    acl Purge method PURGE
    http_access allow managercache Purge
    http_access deny Purge

 

②使用squid自带命令squidclient

 如下清除squid中一条缓存,-h是受信任清理缓存的服务器ip,-p是指定的squid端口

# /usr/bin/squidclient -h 192.168.1.145 -p 80 -m PURGE http://www.linuxidc.com/404.html
或者
# /usr/bin/squidclient -p 80 -m PURGE http://www.linuxidc.com/404.html
获取所有缓存 *.jpg 的信息
# /usr/bin/squidclient -p 80 mgr:objects | grep jpg

取得squid运行状态信息
# /usr/bin/squidclient -p 80 mgr:info

取得squid内存使用情况
# /usr/bin/squidclient -p 80 mgr:mem

取得squid已经缓存的列表(小心使用此命令 可能导致崩溃):
# /usr/bin/squidclient -p 80 mgr:objects

取得squid的磁盘使用情况:
# /usr/bin/squidclient -p 80 mgr:diskd

强制更新某个url:
# /usr/bin/squidclient -p 80 -m PURGE http://www.yejr.com/static.php

 

③通过脚本删除
  比如编写删除squid缓存的脚本clear_squid_cache.sh,如下:

# vi clear_squid_cache.sh
    #!/bin/sh
    squidcache_path="/data1/squid/var/cache"
    squidclient_path="/usr/bin/squidclient"
    grep -a -r $1 $squidcache_path/* | strings | grep "http:" | awk -F\'http:\' \'{print "http:"$2;}\' > cache_list.txt
    for url in `cat cache_list.txt`; do
    $squidclient_path -m PURGE -p 80 $url
    done
# chmod 755 clear_squid_cache.sh #赋予脚本可执行权限

注意:脚本中的下面两个设置:
squidcache_path= 表示squid缓存目录的路径,这个在squid.conf配置文件中可以查到
squidclient_path= 表示squidclient程序所在的路径,默认为squid安装目录下的bin/squidclient
-p 是指定squid 监听的端口

用法:

清除所有Flash缓存(扩展名.swf):
# sh clear_squid_cache.sh swf

清除URL中包含sina.com.cn的所有缓存:
# sh clear_squid_cache.sh sina.com.cn

清除文件名为huanqiu.jpg的所有缓存:
# sh clear_squid_cache.sh huanqiu.jpg

如果对于频繁更新的gif或者什么,可以在crontab中添加对应的命令行
假设上述脚本在/root目录下。如下:
# crontab -e
0 * * * * /bin/bash /root/clear_squid_cache.sh gif &
这样就会每隔一个小时进行一次刷新操作了,很是方便

如果需要让图片更新人员自行刷新的话,就可以找相应的人员开发web页面,进行对脚本的调用就可以了

脚本效率:
经测试,此脚本清除26000个缓存文件用时2分钟左右,平均每秒可清除缓存文件177个。


④还有一种方法,直接删除squid的缓存目录

  这样就删除了squid的全部缓存了
  然后重新创建同名空目录做为缓存目录,接着squid -z重新初始化,最后重启squid即可!

  查看squid.conf配置文件,比如缓存目录是/data1/squid/var/cache(cache_dir后面设置的)

# rm -rf /data1/squid/var/cache
# squid -z
# /etc/init.d/squid restart

 

参考文档

https://blog.51cto.com/linux998/2074550

https://www.cnblogs.com/kevingrace/p/5991582.html

https://www.jb51.net/LINUXjishu/348932.html

 

以上是关于Linux服务器集群 - Squid缓存,代理服务的主要内容,如果未能解决你的问题,请参考以下文章

Linux下squid代理缓存服务环境部署

linux下清除Squid缓存的方法记录

Linux 之squid 服务应用

基于Squid和TinyProxy搭建代理集群

Linux代理服务器—squid正向代理实验

linux下配置squid(详细配置)