Squid Cache (简称SQUID),是一个流行的自由软件(GNU通用公共许可证)的代理服务器和WEB缓存服务器。SQUID有广泛用途,从作为网页服务器的前置CACHE服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网,域名系统或其他网络搜索,到通过过滤流量到内网安全,到局域网通过代理上网!
换而言之:缓存比起点源点更接近请求者的互联网内容。Squid支持缓存多种不同的网络对象,包括那些通过HTTP和FTP访问的人。缓存频繁要求网页、媒体文件和其它加速回答时间并减少带宽堵塞的内容
Squid特点
Squid是Linux下一个缓存Internet数据的代理服务器软件,其接收用户的下载申请,并自动处理所下载的数据。也就是说,当一个用户想要下载一个主页时,可以向Squid发出一个申请,要Squid代替其进行下载,然后Squid连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份。当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。目前,Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS协议,暂不能代理POP3、NNTP等协议。Squid可以工作在很多操作系统中,如AIX、Digital、Unix、FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等
换而言之:Squid主要设计用于Unix或者类Unix一类的操作系统
Squid官网
squid : Optimising Web Delivery
Squid的源意是:乌贼,所以squid的图标就是乌贼
Squid工作原理
Squid代理服务器工作在TCP/IP的应用层。
当代理服务器中有客户端需要的数据时:
a. 客户端向代理服务器发送数据请求;
b. 代理服务器检查自己的数据缓存;
c. 代理服务器在缓存中找到了用户想要的数据,取出数据;
d. 代理服务器将从缓存中取得的数据返回给客户端。
当代理服务器中没有客户端需要的数据时:
1. 客户端向代理服务器发送数据请求;
2. 代理服务器检查自己的数据缓存;
3. 代理服务器在缓存中没有找到用户想要的数据;
4. 代理服务器向Internet 上的远端服务器发送数据请求;
5. 远端服务器响应,返回相应的数据;
6. 代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。
按照代理类型的不同,可以将Squid 代理分为正向代理和反向代理,正向代理中,根据实现方式的不同,又可以分为普通代理和透明代理。
正向代理:代表内部PC向某服务器请求,然后将服务器的响应返回到内部发出请求的设备,这是一个完完全全的客户端代理,客户端需要设置代理(代理内部PC去上网)。
普通代理:需要客户机在浏览器中指定代理服务器的地址、端口;
透明代理:适用于企业的网关主机(共享接入Internet)中,客户机不需要指定代理服务器地址、端口等信息,代理服务器需要设置防火墙策略将客户机的Web访问数据转交给代理服务程序处理;客户端不用设置,不用任何操作,直接可以出去,客户端没有任何察觉!相对于客户端是透明的。透明代理的提供的功能和正向代理是一致的,但其依赖于默认路由和防火墙的重定向策略,因此更适用于局域网,而不适用于Internet中的客户机
反向代理:CDN(Content distribution network)内容分发网,向某网站发起请求,不是直接访问了网站,而是访问了这个网站的分发上,squid可以将网站原来的内容分发到squid服务器上,我们访问的时候,直接访问squid服务器得到响应!换而言之,就是代理web服务器响应请求!
是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
Squid缓存方式
每一台Squid 代理服务器上都有若干颗硬盘,每颗硬盘又分割成多个分区,每一个分区又可建立很多目录,目录下才放文件(Squid 把它叫object)。不需要太大的硬盘,足够大的内存!
Squid工作模式和端口
C/S模式 TCP 3128号端口
[root@taijitao63 ~]# cat /etc/services | grep squid
squid 3128/tcp ndl-aas # squid web proxy
[root@taijitao63 ~]# lsof -i :3128
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
squid 7235 squid 14u IPv6 24365 0t0 TCP *:squid (LISTEN)
服务的安装与启动
[root@taijitao63 ~]#wget http://www.squid-cache.org/Versions/v4/squid-4.16.tar.gz
[root@taijitao63 ~]# tar -zxvf squid-4.16.tar.gz
[root@taijitao63 ~]# cd squid-4.16
[root@taijitao63 squid-4.16]# ./configure --prefix=/usr/local/squid //安装目录
--sysconfdir=/etc/ //单独将配置文件修改到/etc目录下
--enable-arp-acl //可在ACL中设置通过MAC地址进行管理,防止IP欺骗
--enable-linux-netfilter //使用内核过滤
--enable-linux-tproxy //支持透明模式
--enable-async-io=100 //异步I/O,提升储存性能,值可修改
--enable-err-language="Simplify_Chinese" //错误信息的显示语言
--enable-underscore //允许URL中有下划线
--enable-poll //使用Poll()模式,提升性能
--enable-gnuregex //使用GNU正则表达式
[root@taijitao63 squid-4.16]# make all #耗时20min
[root@taijitao63 squid-4.16]# make install
[root@taijitao63 squid-4.16]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ //创建链接文件,优化路径
[root@taijitao63 squid-4.16]# find . -name *.service
./tools/systemd/squid.service
[root@taijitao63 squid-4.16]# cp ./tools/systemd/squid.service /usr/lib/systemd/system/
[root@taijitao63 squid-4.16]# systemctl daemon-reload
[root@taijitao63 squid-4.16]# systemctl list-unit-files |grep squid
squid.service disabled
[root@taijitao63 squid-4.16]# systemctl status squid
[root@taijitao63 squid-4.16]# systemctl enable squid
[root@taijitao63 squid-4.16]# systemctl start squid
[root@taijitao63 squid-4.16]# systemctl status squid
[root@taijitao63 squid-4.16]# useradd -M -s /sbin/nologin squid //创建程序用户、组
[root@taijitao63 squid-4.16]# chown -R squid:squid /usr/local/squid/var/
配置文件
/etc/squid.conf #核心配置文件
/etc/mime.conf #可以支持缓存的格式
[root@taijitao63 ~]# vim /etc/squid.conf
#定义格式:acl <自定义的 acl 名称> <要控制的 acl 类型> <设定的内容>
acl manager proto cache_object #定义Manager为管理功能,代表了经典的缓存对象(proto,原)
acl localhost src 127.0.0.1/32 ::1 #定义localhost表示 源地址为127.0.0.1的设备,表示从本机来的
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 #定义to_localhost 表示目的地址为……,到哪儿去的
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代理来封装某种请求的方法
http_access allow manager localhost #允许localhost和manager定义的acl访问
http_access deny manager #拒绝manager定义的acl访问
http_access deny !Safe_ports #拒绝非安全端口
http_access deny CONNECT !SSL_ports #拒绝非安全的ssl_ports端口
http_access allow localnet #放行定义的localnet
http_access allow localhost #放心localhost
http_access deny all #拒绝所有,由此可以看出,是从上往下匹配的
http_port 3128 #预设端口,可以改为加密端口 https_port 923的方式
hierarchy_stoplist cgi-bin ? #用来强制某些特定的对象不被缓存,主要是处于安全的目的。
#cache_dir ufs /var/spool/squid 100 16 256 #100M的缓存,16个一级目录,256个二级目录
coredump_dir /var/spool/squid #cache目录位置
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
cache_effective_user squid //用来设置初始化、运行时缓存的账号,否则启动不成功
cache_effective_group squid //默认为指定账号的基本组
access_log /var/log/squid/access.log squid #定义日志存放记录
配置正向代理
搭建sqid代理服务器,是内网主机192.168.2.2,能够通过squid服务器加速上网
实验环境
taijitao63 双网卡 eth0 192.168.1.63 eth1 192.168.2.1 vmnet3
taijitao64 eth0 192.168.2.2 vmnet3 网关 192.168.2.1
根据上图拓扑,配置网络环境
修改配置文件
[root@taijitao63 ~]# vim /etc/squid/squid.conf
16 acl localdomain src 192.168.1.0/24 #16行左右,添加此行
58 http_access allow localdomain #58行左右,添加此行
cache_effective_user squid //用来设置初始化、运行时缓存的账号,否则启动不成功
cache_effective_group squid //默认为指定账号的基本组
[root@taijitao63 ~]# systemctl restart squid //重启服务
[root@localhost ~]# squid -k parse //检查语法是否正确
[root@localhost ~]# squid -z //初始化缓存目录
[root@localhost ~]# netstat -anpt | grep squid //确认squid服务处于正常监听状态
tcp 0 0 :::3128 :::* LISTEN 40936/(squid-1)
客户端测试
[root@taijitao64 ~]# firefox &
Edit(编辑)→→Preferences(首选项)→→Advanced(高级)→→Network(网络)→→Setting(设置)→→Manual Proxy Configure(手动配置代理)→→OK(确定)
然后打开新浪首页测试
http://www.sina.com.cn
修改方式二
将我们下面两行添加的注释或删除
16 acl localdomain src 192.168.1.0/24 #16行左右,删除此行
58 http_access allow localdomain #58行左右,删除此行
然后将
61 http_access deny all
改为
61 http_access allow all
可以达到相同的效果
配置透明代理加速
客户端在浏览器中不指定代理服务器的IP地址和端口号,就可以直接访问公网上的服务器
其实,透明代理相当于Squid和iptables的结合,需要使用iptables通过nat的方式让内部上网,然后通过squid将我们访问的web缓存,下次访问速度就会明显加快,拓扑图遵循正向代理的拓扑配置,只是在配置上有所区别!
理解
透明代理加速,其实是客户端首先可直接上网,也就是通过iptables可以上网,然后使用squid进行加速,这样当我们首次访问较慢的时候,第二次就有较快的响应!
当使用NAT服务器连接Internet时,假设我们使用的Internet的协议为80,也就是www服务,那么通过iptables配置让这个工作由proxy来工作,这样达到代理服务器的功能,这样就是透明代理,在客户端并不需要配置任何相关选项就可以直接加速上网呢
一遍同时的说明:使用者通过NAT主机联网的出去时,只要让NAT服务器发现你是用www服务出去的,那么那就把你这个动作由proxy主机帮你搞定,如此一来,你在浏览器上的配置不需要,但是这个代理的动作是使用了iptables上网了,使用squid加速了!
修改配置文件
[root@taijitao63 ~]# vim /etc/squid/squid.conf
http_port 3128 transparent #在原先的基础上,加上透明这个单词transparent
[root@taijitao63 ~]# service squid restart
配置iptables
[root@taijitao63 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #地址转发开启
[root@taijitao63 ~]# sysctl -p
[root@taijitao63 ~]# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.1.63
//SNAT代理内部上网,将内部的地址全部转化为可以上网的地址 192.168.1.63
[root@taijitao63 ~]# iptables -t nat -A PREROUTING -s 192.168.2.0/24 -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
//端口转化,来自192.168.2.0,从eth1且端口为80的数据进行数据重定向到3128,代理服务器为你工作
客户端测试
Edit(编辑)→→Preferences(首选项)→→Advanced(高级)→→Network(网络)→→Setting(设置)NO Proxy(无代理)→→OK(确定)
使用curl获取网页,time跟踪时间
[root@taijitao64 ~]# time curl www.sina.com.cn
……
real 0m5.890s
user 0m0.008s
sys 0m0.036s
[root@taijitao64 ~]# time curl www.sina.com.cn
……
real 0m0.120s
user 0m0.000s
sys 0m0.011s
配置反向代理加速
通过配置反向代理,提高内部服务器的访问速度
反向代理:CDN=网宿,蓝汛等
反向代理的特点:内存够大,硬盘不需要太大,因为数据都是使用内存及时响应的
我们目前taijitao64上,也就是2.2的IP上有两个网站,我们希望通过配置Squid加速对这两个网站的访问,两个网站使用的端口分别为80,81,只加速动态页面或者视频文件,同时我们访问的IP是我们对外的ip63
修改配置文件
[root@taijitao63 ~]# vim /etc/squid/squid.conf
http_access allow all #修改此行,允许所有
http_port 3128 vhost #打开对虚拟主机的支持
cache_peer 192.168.2.2 parent 80 0 no-query originserver weight=1 name=a #no-query和originserver指明了服务器,不查询直接到源服务器
cache_peer 192.168.2.2 parent 81 0 no-query originserver weight=1 name=b #name对前面的定义做了一个别名
cache_peer_domain a www.servera.com #访问www.servera.com将直接按照上面的定义访问到2.2的80端口
cache_peer_domain b www.serverb.com
cache_peer_access a allow all #放行
cache_peer_access b allow all
[root@taijitao63 ~]# service squid restart
配置虚拟主机
[root@taijitao64 ~]# mkdir /var/www/html/bbs
[root@taijitao64 ~]# echo servera > /var/www/html/bbs/index.html
[root@taijitao64 ~]# echo serverb > /var/www/html/index.html
[root@taijitao64 ~]# vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 81 #这行添加
……
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /var/www/html/bbs #修改
ServerName www.servera.com #修改
……
</VirtualHost>
<VirtualHost *:81> #修改
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot /var/www/html #修改
ServerName www.serverb.com #修改
……
</VirtualHost>
[root@taijitao64 ~]# service httpd restart
配置测试
Hosts文件添加:
192.168.1.63 www.servera.com
192.168.1.63 www.serverb.com
我们vhost监控端口是3128,所以我们这里访问要跟上端口
这样我们的代理了我们的内部服务器对外提供服务,而却还隐藏了内部服务器
拓展:查看是否缓存命中
每个代理的方式,我们查询的可能给不相同
正向代理命中查询
火狐有丰富的插件,可以利用插件查看缓存是否命中,比如说firebug这个插件,安装好这个插件之后激活此插件
HIT表示命中,MISS表示没有命中,因为正向代理的时候,不能使用curl命令来获得标头,那么我们使用插件
透明代理命中查询
透明代理命中与否,可以使用命令查看
[root@taijitao64 ~]# curl -I www.sina.com.cn
HTTP/1.0 200 OK
Content-Type: text/html
Vary: Accept-Encoding
X-Powered-By: schi_v1.02
Server: nginx
Date: Sat, 24 Oct 2015 07:51:47 GMT
Last-Modified: Sat, 24 Oct 2015 07:48:38 GMT
Expires: Sat, 24 Oct 2015 07:52:47 GMT
Cache-Control: max-age=60
Content-Length: 512331
X-Cache: HIT from ctc.gz.1cf2.39.spool.sina.com.cn
Age: 27
X-Cache: HIT from taijitao63
X-Cache-Lookup: HIT from taijitao63:3128
Via: 1.0 taijitao63 (squid/3.1.10)
Connection: keep-alive
反向代理命中查询
IE11支持查询,可以按F12查询
拓展:几个常见选项
http_port 3128 #默认端口(修改即可)
cache_mem 64MB #缓存占内存大小,额外提供给squid使用的内存
maximum_object_size 4096KB #最大缓存块
reply_body_max_size 1024000 allow all #限定下载文件大小
access_log /var/log/squid/access.log #访问日志存放的文件
visible_hostname proxy.test.xom #可见的主机名
cache_mgr webmaster@test.com #定义管理员邮箱
http_access deny all #访问控制
maximum_object_size_in_memory 4096 KB //设置squid内存缓存最大文件,超过4M的文件不保存到内存
cache_dir ufs /var/spool/squid 100 16 256 //定义squid的cache存放路径 、cache目录容量(单位M)、一级缓存目录数量、二级缓存目录数量
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh //log文件日志格式
access_log /var/log/squid/access.log combined //log文件存放路径和日志格式
cache_log /var/log/squid/cache.log //设置缓存日志
logfile_rotate 60 //log轮循 60天
cache_swap_high 95 //cache目录使用量大于95%时,开始清理旧的cache
cache_swap_low 90 //cache目录清理到90%时停止。
acl localnet src 192.168.1.0/24 //定义本地网段
http_access allow localnet //允许本地网段使用
http_access deny all //拒绝所有
visible_hostname squid.david.dev //主机名
cache_mgr mchina_tang@qq.com //管理员邮箱