一、关于缓存代理

1、代理的工作机制
作为应用层的代理服务软件,Squid主要提供缓存加速和应用层过滤控制的功能。当客户机通过代理来请求Web页面时,指定的代理服务器会先检查自己的缓存,如果缓存中已经有客户机需要访问的页面,则直接将缓存中的页面内容反馈给客户机;如果缓存中没有客户机需要访问的页面,则由代理服务器向Internet发送访问请求,当获得返回的Web页面以后,将网页数据保存到缓存中并发送给客户机。
HTTP代理的缓存加速对象主要是文字、图像等静态Web元素。使用缓存机制后,当客户机在不同的时候访问同一Web元素,或者不同的客户机访问相同的Web元素时,可以直接从代理服务器的缓存中获得结果。这样就大大减少了向Internet重复提交Web请求的过程,提高了客户机的Web访问响应速度。
由于客户机的Web访问请求实际上是由代理服务器来代替完成的,从而可以隐藏用户的真实IP地址,起到一定的保护作用。另一方面,代理服务器担任着类似“经纪人”的角色,所以有机会针对要访问的目标、客户机的地址、访问的时间端进行过滤控制。
Squid缓存代理服务器
2、代理的基本类型
根据实现的方式不同,代理服务可分为传统代理和透明代理两个常见的代理服务。
1)传统代理
也就是普通的代理服务,首先必须在客户机的浏览器、QQ聊天工具、下载软件等程序中手动设置代理服务器的地址和端口,然后才能使用代理服务来访问网络。对于网页浏览器,访问网站时的域名解析请求也会发送给指定的代理服务器。
2)透明代理
提供与传统代理相同的功能和服务,其区别在于客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向,实际上仍然交给代理服务器来处理。重定向的过程对客户机来说时是“透明”的,用户甚至并不知道自己在使用代理服务,所以称为“透明代理”。使用透明代理时,网页浏览器访问网站时的域名解析请求将优先发给DNS服务器。
在实际应用中,传统代理多见于Internet环境,如为QQ程序使用代理可以隐藏本机真实IP地址,为下载工具使用多个代理可以规避服务器的并发连接限制。而透明带多见于局域网环境,如在Linux网关中启用透明代理后,局域网主机无需进行额外的设置就可以享受更好的上网速度。

二、搭建Squid传统代理服务器

Squid缓存代理服务器
1、安装Squid

tar xf squid-3.5.27.tar.gz
yum install gcc gcc-c++ make perl-devel -y  //安装环境
cd squid-3.5.27/        //进入源码包进行配置
./configure \
--prefix=/usr/local/squid \ #单独将配置文件修改到其他目录
--sysconfdir=/etc \     #单独将配置文件修改到其他目录
--enable-arp-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正则表达式
make && make install        //编译并安装
ln -s /usr/local/squid/sbin/* /usr/local/sbin       //对命令做本地软链接
useradd -M -s /sbin/nologin squid       //为程序创建用户
chown -R squid:squid /usr/local/squid/var/      //更改目录属主和属组

2、更改配置文件(配置传统代理)
vi /etc/squid.conf
http_access allow all
http_port 3128 //在下面新增
visible_hostname 192.168.80.181
cache_mem 64 MB
cache_swap_low 80
cache_swap_high 97
cache_dir ufs /usr/local/squid/var/cache/squid 512 16 256 //配置硬盘缓存,打开#.缓存目录512M,其中一级目录16个,二级256个
cache_effective_user squid
cache_effective_group squid
Squid缓存代理服务器

squid -k parse //检查配置文件
squid -k rec //重新加载配置文件
squid -zX //初始化缓存目录

3、制作启动脚本
vi /etc/init.d/squid
#!/bin/bash
#chkconfig: 35 90 25
#config: /etc/squid.conf
#pidfile: /usr/local/squid/var/run/squid.pid
#Description: Squid - Internet Object Cache

PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
start)
netstat -utpln | grep squid &>/dev/null
if [ $? -eq 0 ]
then
echo "Squid is running"
else
$CMD
fi
;;
stop)
$CMD -k kill &>/dev/null
rm -rf $PID &>/dev/null
;;
status)
[ -f $PID ] &>/dev/null
if [ $? -eq 0 ]
then
netstat -utpln | grep squid
else
echo "Squid is not running"
fi
;;
restart)
$0 stop &>/dev/null
echo "正在关闭Squid..."
$0 start &>/dev/null
echo "正在启动Squid..."
;;
reload)
$CMD -k reconfigure
;;
check)
$CMD -k parse
;;
*)
echo "用法:{start | stop | restart | reload | check | status}"
esac

chmod +x /etc/init.d/squid  //添加服务执行权限
chkconfig --add squid   //添加到系统配置中
chkconfig squid on      //在系统配置中开启
service squid start     //开启服务
netstat -anpt | grep 3128   //查看监听端口

Squid缓存代理服务器

yum install httpd -y  //在另外一台服务器上安装apache
systemctl start httpd   //启动服务

4、配置代理端口并访问验证
Windows使用代理服务器
浏览器—工具—Internet选项—连接—局域网(LAN)设置
Squid缓存代理服务器
Linux使用代理服务器
vi /etc/profile
末行添加
export HTTP_PROXY=http://192.168.80.100:3128 //使用HTTP协议指定代理
export HTTPS_PROXY=https://192.168.80.100:3128 //使用HTTPS协议指定代理
export FTP_PROXY=http://192.168.80.100:3128 //使用FTP协议指定代理
export NO_PROXY=192.168.1.,192.168.2. //不使用代理的两个局域网段
source /etc/profile //刷新环境
验证代理服务器
使用windows浏览器访问网页192.168.80.110
Squid缓存代理服务器
cat /usr/local/squid/var/logs/access.log //在squid服务器跟踪访问日志文件
Squid缓存代理服务器
结论:通过访问日志可以发现客户机192.168.80.10访问web服务器192.168.80.110的记录,说明squi的代理服务器发挥了作用。
cat /etc/httpd/logs/access_log //在web服务器查看访问日志的新增记录
Squid缓存代理服务器
结论:通过访问日志可以发现来自代理服务器192.168.80.100的访问记录,说明当客户机使用代理以后,web服务器并不知道客户机的真实IP地址,因为实际上由代理服务器在代替客户机访问。
当客户机再次访问同一web页面时,Squid访问日志中会增加新的记录,但web访问日志中的记录不会有变化(除非页面变更或强制刷新)。说明重复访问同一静态页面时,实际上页面是由代理服务器通过缓存提供的。

三、搭建Squid透明代理服务器

Squid缓存代理服务器
1、系统环境
内网卡ens33:192.168.80.100
外网卡ens37:192.168.90.100
Web服务器:192.168.80.110
客户端:192.168.90.11
echo 1 > /proc/sys/net/ipv4/ip_forward //开启Squid服务器的路由转发功能
2、更改配置文件(透明代理)
vi /etc/squid.conf //配置服务器并关闭客户端指定代理设置
Squid缓存代理服务器
service squid restart //重启服务
3、这只iptables的重定向策略

iptables -F //清空iptables策略兵器新建策略
iptables -t nat -I PREROUTING -i ens33 -s 192.168.80.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
iptables -t nat -I PREROUTING -i ens33 -s 192.168.80.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
iptables -I INPUT -p tcp --dport 3218 -j ACCEPT
service iptables save

4、ACL访问控制
1)禁止某IP地址主机上网
acl nolink src 192.168.90.9
http_access deny nolink
2)禁止某网段在某时间段上网
acl nolink src 192.168.1.0/24
acl nowang time MTWHF 9:00-11:30
http_access deny nolink nowang
3)禁止所有人访问某网站(精确匹配)
acl nourl dstdomain -i www.qq.com
http_access deny nourl
4)禁止所有人访问某些网站(含有关键字的都会过虑)
acl nourl url_regex -i taobao.com
http_access deny nourl
5)禁止下载某类型的文件
acl nof urlpath_regex -i .avi$ .mkv$
http_access deny nof
6)禁止访问某类型的网站
acl nop url_regex -i ^emule:// ^thunder
http_access deny nop
5、测试透明代理
内网web服务器指定内网网关
vi /etc/sysconfig/network-scripts/ifcfg-ens33
Squid缓存代理服务器
外网web浏览器指定外网网关
Squid缓存代理服务器
打开win7浏览器模拟外网客户端
访问192.168.80.110 //直接访问内网主机
Squid缓存代理服务器

四、搭建Squid反向代理服务器

Squid缓存代理服务器
1、系统环境
增加一台web服务器对应的IP地址为:192.168.80.120
2、修改配置文件(反向代理)
vi /etc/squid.conf
http_port 192.168.80.100:80 accel vhost vport
cache_peer 192.168.80.110 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
cache_peer 192.168.80.120 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2
cache_peer_domain web1 web2 www.yun.com
Squid缓存代理服务器

service squid stop  //服务重启
service squid start

3、Web访问代理服务器
Squid缓存代理服务器

五、Squid日志分析(sarg工具)

1、安装sarg工具

yum install httpd gd gd-devel pcre-devel -y     //squid服务器安装apache和对应的库文件
tar xf sarg-2.3.11.tar.gz       //解压源码包
cd sarg-2.3.11/
./configure \       //安装前的配置
--prefix=/usr/local/sarg \
--sysconfdir=/etc/sarg \
--enable-extraprotection
make && make install    //编译安装

2、相关配置
vi /etc/sarg/sarg.conf //修改日志分析配置文件
7 access_log /usr/local/squid/var/logs/access.log //squid的访问日志位置
25 title "Squid User Access Reports" //网页标题
120 output_dir /var/www/html/squid-reports //分析报告的存放位置
178 user_ip no //不使用IP代替用户ID
184 topuser_sort_field BYTES reverse //升序排列
190 user_sort_field BYTES reverse
206 exclude_hosts /usr/local/sarg/noreport //设置不生成报告的主机
257 overwrite_report no
289 mail_utility mailx //指定发邮件命令
434 charset UTF-8
518 weekdays 0-6 //指定top排序星期周期
523 hours 7-12,14,16,18-20 //指定top排序时间周期
633 www_document_root /var/www/html //网页根目录
Squid缓存代理服务器

touch /usr/local/sarg/noreport //建立不生成报告的主机列表文件
ln -s /usr/local/sarg/bin/sarg /usr/local/bin/
sarg        //启动,执行该命令只记录一次

Squid缓存代理服务器

crontab -e  //做计划任务分时段记录
*/10 * * * * /usr/local/bin/sarg 

3、验证访问
http://192.168.80.100:81/squid-reports/
Squid缓存代理服务器
注意:由于上诉squid做代理80端口被占用,因此将squid服务器httpd对应的端口改为81

六、Varnish与Nginx缓存服务器

1、高性能缓存服务器Varnish
Varnish是一款高性能的、开源的方向代理服务器和缓存器。挪威最大的在线报纸Verdens Gang使用了3台Varnish代替了原来的12台Squid,性能更好!
Varnish与Squid的对比如下:
(1)优点
Varnish具有更好的稳定性、更快的访问速度、更多的并发连接支持数,可以通过管理端口来管理缓存。
(2)缺点
1)在高并发状态下,Varnish消耗更多的CPU、I/O和内存资源。
2)Varnish进程一旦挂起、崩溃或者重启,缓存的数据会从内存中释放,此时所有的请求都会转发到后端服务器,给后端服务器造成很大压力。
2、轻量级缓存服务器Nginx
Nginx支持类似Squid的缓存功能,把URL以及相关信息当成key,用MD5编码Hash后把数据文件保存在硬盘上。
Nginx只能为只当的URL或者状态码设置过期时间,并不支持类似Squid的purge命令来手动清除指定的缓存页面。可以通过第三方的ngx_cache_purge来清除指定的URL缓存。
Nginx的缓存加速功能是由proxy_cache和fastcgi_cache两个功能模块完成的。
Nginx缓存加速的特点如下:
1)缓存功能十分稳点,运行速度不逊于Squid。
2)对多核CPU的利用率比其他的开源软件要好。
3)支持高并发请求数,能同时承受更多的访问请求。