大点干!早点散----------深入剖析缓存加速--squid传统代理和透明代理
文章目录
- 一、squid的概念
- 二、工作流程
- 三、squid基本类型
- 1、正向代理
- (1)标准的代理缓冲服务器
- (2)透明代理缓冲服务器
- 2、反向代理
- (1)反向代理缓冲器
- 3、正向代理与反向代理的区别
- (1)概念
- (2)用途
- (3) 安全性
- 1、正向代理
- 四、实验配置
- 1、标准的代理缓冲服务器配置
- (1)实验环境
- (2)在squid服务器上部署squid服务
- (3)修改squid配置文件,优化启动项
- (4)添加服务到service管理
- (5)配置传统代理服务
- (6)在web服务器上安装http服务
- (7)在client客户端测试web网页
- (8)设置squid代理
- (9)验证
- 2、透明代理缓冲服务器配置
- (1)实验环境
- (2)实验拓扑图如下
- (3)网卡配置
- (4)squid服务器配置
- (5)再次使用client客户端访问web端
- 1、标准的代理缓冲服务器配置
一、squid的概念
squid是一种用来缓存Internet数据的软件。接受来自人们需要下载的目标(object)的请求并适当的处理这些请求。也就是说,如果一个人想下载一web界面,他请求squid为他取得这个页面。squid随之连接到远程服务器并向这个页面发出请求。然后,squid显式地聚集数据到客户端机器,而且同时复制一份。当下一次有人需要同一页面时, squid可以简单的从磁盘中读到它,那样数据会立即传输到客户机上。
squid代理的作用 通过缓存的方式为用户提供Web访问加速 对用户的Web访问进行过滤控制
二、工作流程
当代理服务器中有客户端需要的数据时:
a. 客户端向代理服务器发送数据请求;
b. 代理服务器检查自己的数据缓存;
c. 代理服务器在缓存中找到了用户想要的数据,取出数据;
d. 代理服务器将从缓存中取得的数据返回给客户端。
当代理服务器中没有客户端需要的数据时:
客户端向代理服务器发送数据请求;
代理服务器检查自己的数据缓存;
代理服务器在缓存中没有找到用户想要的数据;
代理服务器向Internet 上的远端服务器发送数据请求;
远端服务器响应,返回相应的数据;
代理服务器取得远端服务器的数据,返回给客户端,并保留一份到自己的数据缓存中。
三、squid基本类型
1、正向代理
(1)标准的代理缓冲服务器
一个标准的代理缓冲服务被用于缓存静态的网页到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指名代理服务器的IP地址和端口号。客户端上网时,每次都把请求发送给代理服务器处理,代理服务器根据请求确定是否连接到远程web服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发送给客户端浏览器。
(2)透明代理缓冲服务器
透明代理缓冲服务器和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP(80端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web服务器发出请求,其余操作和标准的代理服务器完全相同。对于linux操作系统来说,透明代理使用Iptables或者Ipchains实现。因此不需要对浏览器作任何设置,所以,透明代理对于ISP(Internet服务器提供商)特别有用。
2、反向代理
(1)反向代理缓冲器
反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB服务器的负载。反向代理服务器承担了对原始WEB服务器的静态页面的请求,防止原始服务器过载。它位于WEB服务器和Internet之间,处理所有对WEB服务器的请求,组织了WEB服务器和Internet的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB服务器发出请求,取回数据,本地缓存后再发给用户。这种方式通过降低了WEB服务器的请求数从而降低了WEB服务器的负载。
3、正向代理与反向代理的区别
(1)概念
正向代理:对于原始服务器而言,就是客户端的代言人 反向代理:对于客户端而言,就像是原始服务器 正向代理:
通俗的来讲
比如X花店代A,B,C,D,E五位男生向Candy女生送匿名的生日鲜花,这里的X花店就是5位顾客的代理,花店代理的是客户,隐藏的是客户。这就是我们常说的代理。
正向代理 隐藏了真实的请求客户端。服务端不知道真实的客户端是谁,客户端请求的服务都被代理服务器代替来请求
反向代理:
拨打10086客服电话,接线员可能有很多个,调度器会智能的分配一个接线员与你通话。这里的调度器就是一个代理,只不过他代理的是接线员,客户端不能确定真正与自己通话的人,隐藏与保护的是目标对象。
反向代理隐藏了真实的服务端,当我们请求 ww.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,ww.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。
(2)用途
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。 反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。
(3) 安全性
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。 反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
四、实验配置
1、标准的代理缓冲服务器配置
(1)实验环境
VMware软件 一台centos7虚拟机作为squid服务器,IP地址为:192.168.110.133 一台centos7虚拟机作为web服务器,IP地址为:192.168.110.132 一台win10虚拟机作为client测试机,IP地址为:192.168.110.20
(2)在squid服务器上部署squid服务
[root@squid company]# tar zxvf squid-3.4.6.tar.gz -C /opt
[root@squid company]# cd /opt/squid-3.4.6/
[root@squid squid-3.4.6]# yum install gcc gcc-c++ -y
[root@squid squid-3.4.6]# ./configure
--prefix=/usr/local/squid '//安装路径'
--sysconfdir=/etc '//配置文件目录'
--enable-arp-acl '//支持acl访问控制列表'
--enable-linux-netfilter '//支持网络筛选'
--enable-linux-tproxy '//支持透明'
--enable-async-io=100 '//io优化'
--enable-err-language="Simplify_Chinese" '//报错显示简体中文'
--enable-underscore '支持下划线'
--enable-poll '//关闭默认使用poll模式,开启epoll模式提提升性能'
--enable-gnuregex '//支持正则表达'
[root@squid squid-3.4.6]# make && make install '//编译安装'
[root@squid squid-3.4.6]# ln -s /usr/local/squid/sbin/* /usr/local/sbin/ '//创建命令软连接,方便系统识别'
[root@squid squid-3.4.6]# useradd -M -s /sbin/nologin squid '//创建系统用户'
[root@squid squid-3.4.6]# chown -R squid.squid /usr/local/squid/var/ '//设置目录的属主和属组'
(3)修改squid配置文件,优化启动项
[root@squid squid-3.4.6]# vim /etc/squid.conf
http_access allow all '//56行添加此项,表示允许所有IP访问'
#http_access deny all '//注释掉原有的'
# Squid normally listens to port 3128
http_port 3128
cache_effective_user squid '//添加指定用户squid'
cache_effective_group squid '//添加指定组 squid'
[root@squid squid-3.4.6]# squid -k parse '//检查语法,没问题可Ctrl + C组合键取消'
[root@squid squid-3.4.6]# squid -z '//初始化缓存目录'
[root@squid squid-3.4.6]# squid '//启动服务'
[root@squid squid-3.4.6]# netstat -ntap |grep 3128 '//检测是否启动成功'
(4)添加服务到service管理
[root@squid squid-3.4.6]# cd /etc/init.d/
[root@squid init.d]# vim squid '//创建service启动squid脚本'
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid" '//PID文件进程号'
CONF="/etc/squid.conf" '//主配置文件'
CMD="/usr/local/squid/sbin/squid" '//启动命令'
case "$1" in
start)
netstat -ntap | grep squid &> /dev/null
if [ $? -eq 0 ]
then
echo "squid is running"
else
echo "正在启动 squid...."
$CMD
fi
;;
stop)
$CMD -k kill &> /dev/null '//关闭squid'
rm -rf $PID &> /dev/null '//删除PID文件'
;;
status)
[ -f $PID ] &> /dev/null
if [ $? -eq 0 ]
then
netstat -ntap | 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 "用法:$0{start|stop|reload|status|check|restart}"
;;
esac
[root@squid init.d]# chmod +x squid '//增加权限'
[root@squid init.d]# chkconfig --add squid '//添加到service'
[root@squid init.d]# chkconfig --level 35 squid on '//设置35级别开机自启动'
(5)配置传统代理服务
[root@squid init.d]# vim /etc/squid.conf
http_port 3128
cache_effective_user squid
cache_effective_group squid
cache_mem 64 MB '//自定义缓存空间大小,容量最好为4的倍数'
reply_body_max_size 10 MB '//允许下载最大文件大小,以字节为单位,默认设置0表示不进行限制'
maximum_object_size 4096 KB '//允许保存到缓存空间的最大对象的大小,以KB为单位,超过限制不会缓存,直接转到web端'
[root@squid init.d]# iptables -F '//清空防火墙表内容'
[root@squid init.d]# iptables -L '//查看防火墙表内容'
[root@squid init.d]# setenforce 0 '//关闭防火墙增强型功能'
[root@squid init.d]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT '//新增规则,允许3128端口'
[root@squid init.d]# service squid reload '//重载服务'
(6)在web服务器上安装http服务
[root@web ~]# yum install httpd -y '//安装httpd服务'
[root@web ~]# systemctl stop firewalld.service '//关闭防火墙'
[root@web ~]# setenforce 0
[root@web ~]# systemctl start httpd.service '//开启httpd服务'
(7)在client客户端测试web网页
[root@web ~]# cat /var/log/httpd/access_log '//通过查看访问日志,发现来访者的IP地址为client客户端的IP地址192.168.110.20'
(8)设置squid代理
在win10上开启squid代理并设置端口
(9)验证
再次访问apache
此时查看日志文件 发现访问的ip地址变成squid服务器的ip地址
2、透明代理缓冲服务器配置
(1)实验环境
结合上个实验 VMware软件 一台centos7虚拟机作为squid服务器,IP地址为:192.168.110.133 双网卡 192.168.100.1 一台centos7虚拟机作为web服务器,IP地址为:192.168.110.132 一台win10虚拟机作为client测试机,IP地址为:192.168.100.20
(2)实验拓扑图如下
(3)网卡配置
[root@squid init.d]# cd /etc/sysconfig/network-scripts/
[root@squid network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
...省略内容
BOOTPROTO=static '//dhcp改为static'
...省略内容
NAME=ens36 '//改为36'
'//删除原本ens33的UUID'
DEVICE=ens36'//改为36'
ONBOOT=yes
IPADDR=192.168.100.1 '//添加IP地址'
NETMASK=255.255.255.0 '//添加子网掩码'
[root@squid network-scripts]# systemctl restart network '//重启网卡服务'
[root@squid network-scripts]# ifconfig '//查看网卡是否修改成功'
(4)squid服务器配置
[root@squid network-scripts]# vim /etc/sysctl.conf '//开启路由转发功能'
net.ipv4.ip_forward=1 '//末行添加,注意#号'
[root@squid network-scripts]# sysctl -p '//加载sysctl.conf'
net.ipv4.ip_forward = 1
'//接下来设置squid的透明代理'
[root@squid network-scripts]# vim /etc/squid.conf
http_port 192.168.100.1:3128 transparent '//仅修改此行,开启透明代理即可'
cache_effective_user squid
cache_effective_group squid
'//防火墙规则设置'
[root@squid network-scripts]# iptables -F '//情况表内容'
[root@squid network-scripts]# iptables -t nat -F '//情况nat表内容'
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.100.0/24 -p tcp --dport 80 -j REDIRECT --to 3128 '//定义规则入口ens36网卡,http协议80端口重定向到3128端口'
[root@squid network-scripts]# iptables -t nat -I PREROUTING -i ens36 -s 192.168.100.0/24 -p tcp --dport 443 -j REDIRECT --to 3128 '//定义规则入口ens36网卡,https协议443端口重定向到3128端口'
[root@squid network-scripts]# iptables -I INPUT -p tcp --dport 3128 -j ACCEPT '//新增规则,允许3128端口'
(5)再次使用client客户端访问web端
[root@web ~]# cat /var/log/httpd/access_log
- Visual Round Trip Analyzer
- ASP.NET可以在Windows Server 2008 R2 Server Core上运行
- SOA十大设计原则
- 中国人民大学文继荣:大数据的经验主义解释
- 检查Python对象
- 分布式监控系统Zabbix-3.0.3-完整安装记录(6)-微信报警部署
- Android 命名规范 (提高代码可以读性)
- Msdn 杂志 asp.net ajax 文章汇集
- 分布式监控系统Zabbix-3.0.3-完整安装记录-新报微信报警(企业微信)
- 测试网站页面网速的一个简单Python脚本
- 框架页面尽可以这么用(后置代码中控制框架)
- 微信小程序「学科排名」发布了
- Nginx 负载均衡的Cache缓存批量清理的操作记录
- DotNet软件开发框架
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python3 logging日志封装实例
- 解决Python中报错TypeError: must be str, not bytes问题
- H5 notification浏览器桌面通知
- Android线程池控制并发数多线程下载
- Android progressbar实现带底部指示器和文字的进度条
- js 调用栈机制与ES6尾调用优化介绍
- Android Fragment实现列表和内容联动
- 前端中等算法-无重复字符的最长子串
- Android自定义动态壁纸开发(时钟)
- 手摸手教你写个ESLint 插件以及了解ESLint的运行原理
- 填满Github的绿色格子用我做的VSCode插件-Auto Commit
- Android多国语言转换Excel及Excel转换为string详解
- python上传时包含boundary时的解决方法
- 4行Python代码生成图像验证码(2种)
- Python 输出详细的异常信息(traceback)方式