furongwei 2020-04-20
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(对象,缓存文件)
索引方式:
主要作用:
对用户的Web访问进行过滤控制
注意:Squid无健康检测,因此作为反向代理服务器时,后端服务器必须为高可用
官方网站: http://www.squid-cache.org
Squid代理服务器工作在TCP/IP模型的应用层(7层)
当我们客户机通过squid代理去访问web页面时,指定的代理服务器会先检查自己的缓存,
若是缓存中有我们客户机需要的页面,那么squid服务器将直接把缓存中的页面内容返回给客户机,
如果缓存中没有客户端请求的页面,那么squid代理服务器就会向internet发送访问请求,获得返回的web页面后,将网页的数据保存到缓存中并发送给客户机。
Squid工作逻辑结构图
具体流程:
①当代理服务器中有客户端需要的数据时:
a. 客户端向代理服务器发送数据请求;
b. 代理服务器检查自己的数据缓存;
c. 代理服务器在缓存中找到了用户想要的数据,取出数据;
d. 代理服务器将从缓存中取得的数据返回给客户端。
②当代理服务器中没有客户端需要的数据时:
1.客户端向代理服务器发送数据请求;
2.代理服务器检查自己的数据缓存;
3.代理服务器在缓存中没有找到用户想要的数据;
4.代理服务器向Internet 上的远端服务器发送数据请求;
5.远端服务器响应,返回相应的数据;
6.代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中
服务名:squid 主程序:/usr/sbin/squid 配置目录:/etc/squid 主配置文件:/etc/squid/squid.conf 默认监听端口号:TCP 3128 默认访问日志文件:/var/log/squid/access.log
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 #定义管理员邮箱 http_access deny all #访问控制
#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:0.10.10.12:3128/" #临时设置代理
#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 #重启网络
#yum -y install httpd#service httpd start
#echo "This is Apache WebServer" >> /var/www/html/index.html
#curl localhost
#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 #刷新系统配置
#yum -y install squid#service squid start
#vi /etc/squid/squid.conf
传统模式无需改动
#firewall-cmd --zone=public --add-port=3128/tcp --permanent #firewall-cmd --reload
#内网机访问公网机 #curl 20.20.20.13 This is Apache WebServer #公网机关闭apache #service httpd stop #内网机访问公网机 #curl 20.20.20.13 This is Apache WebServer
公网机关服后,内网机依然可以获取已缓存内容。
透明模式与传统模式大部分相同,仅需修改内网机和Squid服务机的配置。
#去除临时设置的环境变量中的代理配置,set命令可查看所有环境变量 #unset http_proxy
#vi /etc/squid/squid.conf http_port 10.10.10.12:3128 transparent visible_hostname www.gazeon.com #随便写,可有可无 #service squid restart #重启squid
#设置对内网卡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
#将网卡为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
#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
wget 20.20.20.13/1234.txt
#临时设置IP地址,两台均设置 #ifconfig eth0 10.10.10.1X/24#ip route add default via 10.10.10.13 #设定默认路由为squid服务器ip,相当于"GATEWAY=10.10.10.13"
#yum -y install httpd #service httpd start
#echo "This is Apache WebServer via IP 10.10.10.1X" >> /var/www/html/index.html
#临时设置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 #刷新系统配置
#firewall-cmd --zone=public --add-port=3128/tcp --permanent #firewall-cmd --reload
#yum -y install squid #service squid start
#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 #重新加载配置
#临时设置IP地址 #ip addr add 20.20.20.14/24 dev eth0
#curl 20.20.20.13
ACL(Access Control List,访问控制列表) ,根据源地址,目标URL,文件类型等定义列表 。
使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。
squid访问控制有两个要素:ACL元素和访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。
acl acl_element_name(列表名称) type_of_acl_element(类型) values_to_acl(内容,值)
注:
http_access allow或deny 列表名称
我们可以使用许多不同的访问条目。下面是我们常用的几个:
访问列表的规则由一些类似‘allow‘或‘deny’的关键字构成,用以允许或拒绝向特定或一组ACL元素提供服务。
如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。
一个访问条目中所有元素将用逻辑与运算连接
http_access Action 声明1 AND 声明2 AND 声明 OR.
http_access Action 声明3
多个http_accesss声明间用或运算连接,但每个访问条目的元素间用与运算连接。
这些规则按照他们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配就立即结束。
src:源地址(即客户机IP地址) dst:目标地址(即服务器IP地址) srcdomain:源名称(即客户机名称) dstdomain:目标名称(即服务器名称) time:一天中的时刻和一周内的一天 url_regex:URL规则表达式匹配 urlpath_regex:URL-path规则表达式匹配,略去协议和主机名 proxy_auth:通过外部程序进行用户验证 maxconn:单一IP的最大连接数
1.如果仅仅只有acl设定而没有http_access 设置默认拒绝
2.如果http_access deny all 未定义,并且自己定义了一个acl范围,默认使用最后一条规则的反向规则(即最后一条为deny,则http_access为allow,反之亦然)
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 #指定当缓冲出现问题时向缓冲管理者发送告警信息的地址信息。 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 #基本设置 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
#初始化在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缓存,而是从原始服务器获取并返回给访问用户。
/usr/local/squid/bin/squidclient -p 80 mgr:info/usr/local/squid/bin/squidclient -p 80 mgr:5min
可以看到详细的性能情况,其中PORT是你的proxy的端口,5min可以是60min
squidclient -p 80 mgr:info
squidclient -p 80 mgr:mem
squidclient -p 80 mgr:bjects. use it carefully,it may crash
squidclient -p 80 mgr:diskd
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
/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的大小。
#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中一条缓存,-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 -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