Squid 代理服务器

一、squid简介
squid是一种用来缓存Internet数据的web缓存代理软件。Squid代理服务器工作在TCP/IP应用层。squid 一般仅缓存静态页面,比如HTML网页、图片、歌曲等,默认不护岸村CGI脚本程序或者PHP\JSP等。squid可以根据HTTP头部信息决定如何缓存数据,即缓存周期。
squid代理的作用:通过缓存的方式为用户提供Web访问加速;对用户的Web访问进行过滤控制;
1.1 正向代理:
1.1.1 标准的代理缓冲服务器
一个标准的代理缓冲服务被用于缓存静态的网页到本地网络上的一台主机上(即代理服务器)。要想实现这种方式,必须在每一个内部主机的浏览器上明确指名代理服务器的IP地址和端口号。

1.1.2 透明代理缓冲服务器
透明代理缓冲服务器和标准代理服务器的功能完全相同。代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。对于linux操作系统来说,透明代理使用Iptables或者Ipchains实现。透明代理对于ISP(Internet服务器提供商)特别有用。

1.2 反向代理
反向代理缓冲器
可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。反向代理结合智能DNS即可实现基本的CDN(内容分发网络)框架,通过DNS视图功能,可以为来自不同地区的DNS请求解析不同的结果返回给客户端。

1.3 正向代理与反向代理的区别
正向代理对于客户端而言,是个代理人,而反向代理服务对客户端而言就是访问的服务器本身。
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。
反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。

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

1.4.1 ACL元素类型:
src:源地址(即客户机IP地址)
dst:目标地址(即服务器IP地址)
srcdomain:源名称(即客户机名称)
dstdomain:目标名称(即服务器名称)
time:一天中的时刻和一周内的一天
url_regex:URL规则表达式匹配
urlpath_regex:URL-path规则表达式匹配,略去协议和主机名
proxy_auth:通过外部程序进行用户验证
maxconn:单一IP的最大连接数
ACL声明的格式 :acl acl_element_name type_of_acl_element values_to_acl
注意:
任何两个ACL元素不能用相同的acl_element_name;
每个ACL由列表值组成;
并不是所有ACL元素都能使用访问列表中的全部类型;
不同的ACL元素写在不同行中,squid将把他们组合在一个列表中。

1.4.2 访问列表
常用的几个:http_access:允许HTTP访问
no_cache:定义对缓存请求的响应。
访问列表的规则由一些类似’allow’或‘deny’的关键字构成,用以允许或拒绝向特定或一组ACL元素提供服务。


1.5 配置文件分析
1.5.1 主配置文件/etc/squid/squid.conf
http_port 3128 #squid监听端口,默认为3128,低于1024端口是,需要root启动squid,ISP一般使用8080;vhost实现反向代理功能;
cache_mem 64MB #缓存占内存大小
maximum_object_size 4096KB #最大缓存块
reply_body_max_size 1024000 allow all #限定下载文件大小
access_log /var/log/squid/access.log #访问日志存放的地方
visible_hostname proxy.test.xom #设置主机名,默认squid将自动检测系统主机名
cache_dir ufs /var/spool/squid 100 16 256 #100代表存储容量,16和256代表子目录格式,用于分类分层管理缓存数据
#ufs:缓存数据的存储格式
#/var/spool/squid 缓存目录
#100:缓存目录占磁盘空间大小(M)
#16:缓存空间一级子目录个数
#256:缓存空间二级子目录个数
cache_mgr [email protected] #定义管理员邮箱
http_access deny all #访问控制
cache_peer #squid 支持在一组代理之间进行缓存请求转发
cache_peer hostname type http-port icp-port [option] #用来设置可以连接的其他代理服务器

详细的配置看http://www.squid-cache.org/Versions/v3/3.5/cfgman/ 官方文档或者https://www.cnblogs.com/bluestorm/p/9032086.html。


1.6 squid常用命令:
1、squid -z 初始化在squid.conf里配置的cache目录
如果有错误提示,请检查cache目录的权限,可以更改目录权限chown -R squid:squid /cache目录。
2、squid -k parse 对squid.conf排错,即验证squid.conf的语法和配置
如果在squid.conf中有语法或配置错误,这里会返回提示,若无返回,尝试启动squid。
3、 squid -N -d1 前台启动squid,并输出启动过程
如果有ready to server reques相关信息,说明squid启动成功,然后ctrl+c ,停止squid,并以后台运行的方式启动它。
4、squid -s 启动squid在后台运行。
可以使用ps -ax | grep squid 来查看squid进程是否存在;
squid -k debug 修复
5、 squid -k shutdown 停止squid
6、 squid -k reconfigure -f /XXX/squid.conf 重新引导修改过的squid.conf
当squid进行配置更改后,可以使用该命令进行squid配置重载;
7、 把squid添加到系统启动项:
vim /etc/rc.local
/usr/local/squid/sbin/squid -s
8、 chown -R squid.squid /cache目录 修改cache缓存目录的权限
cache缓存目录根据自己的配置更改,squid用户和组是squid,squid
9、 chown -R squid.squid 定义的日志文件所在目录 修改squid日志目录的权限
修改该权限意为让squid有权限在该目录里进行写操作;
10、查看你的日志文档
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缓存,而是从原始服务器获取并返回给访问用户。


1.7 Squid命中率分析
更多的请查看:squidclient-h 或者 squidclient -p 80 mgr
squidclient -h IP(具体侦听IP) -p 80(具体侦听端口) mgr:info
squidclient -p 80 mgr:info
squidclient -p 80 mgr:5min

参考文档:https://www.cnblogs.com/bluestorm/p/9032086.html

1.8 Cache_peer的理解
cache_peer邻居分为parent(父邻居),sibling(子邻居).parent和sibling的区别在于父邻居能为子cache转发丢失的Cache,而子邻居不可能.
cache_peer通过cache_peer_access和cache_peer_domain来控制邻居的访问.二者的区别在于前者一般需要先定义一个ACL而后者都直接匹配相应的域名就可以了.
cache_peer通过never_direct,always_direct,hierarchy_stoplist等限制对邻居的访问.


二、部署squid 代理服务器
服务名:squid
主程序:/usr/sbin/squid
配置目录:/etc/squid
主配置文件:/etc/squid/squid.conf
监听tcp端口号:3128
默认访问日志文件:/var/log/squid/access.log

2.1 案例拓扑
squid 服务器:eth0 172.25.25.254
eth1 192.168.4.254
web1.example.com eth0 192.168.4.11
web2.example.com eth0 192.168.4.12
client.example.com eth0 172.25.0.11

2.1 squid服务器的设置:
acl localnet src 172.25.0.0/16
acl localnet src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
http_access allow manager localhost //仅允许本机主机进行缓存管理
http_access deny manager //拒绝其他主机的所有缓存管理
http_access allow all //允许所有
visible_hostname squid.example.com //设置主机名
cache_men 2048MB //内存缓存总容量
maximum_object_size_in_memory 4096 KB //内存可以缓存的单个文件最大容量
maximum_object_size 4098 KB //磁盘可以缓存的单个文件最大容量
http_port 80 accel vhost //代理服务器监听端口,accel设置squid为加速模式,vhost实现反向代理
http_port 3128 //同时监听3128端口,方便使用squidclient工具对缓存进行管理
cache_log /var/log/squid/cache.log
cache_peer 192.168.4.11 parent 80 0 no-query originserver round-robin name=server1
// 配置后台源服务器,originserver 模拟本机服务器为源服务器;80为HTTP端口。设置ICP端口为0 (源服务器不支持ICP查询),no-query 表示禁止使用ICP对源服务器进行查询;round-robin 可以让代理轮询多台源服务器;name用来设置源服务器的唯一名称,代理转发数据至相同主机的不同端口非常有用。
cache_peer 192.168.4.12 parent 80 0 no-query originserver round-robin name=server2
#hierarchy_stoplist cgi-bin ? // 禁止缓存CGI脚本

]# squid -k parse //检测配置文件是否有问题
]# squid -k reconfigure -f /etc/squid/squid.conf //修改过配置文件重新检测配置文件
]# squid -N -d1 //前台启动一下,检测是否有问题
]# systemctl restart squid
]# systemctl enable squid
]# netstat -antulp | grep squid
]# ps -aux | grep squid


客户端测试
#curl http://172.25.0.254
#ping 172.25.0.254

你可能感兴趣的:(服务器)