目录
代理服务器是一个位于客户端和原始(资源)服务器之间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器,然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。
缓存代理对于web至关重要,尤其对于大型高负载web站点。缓存可作为性能优化的一个重要手段,可以极大减轻后端服务器的负载。通常对于静态资源,即较少经常更新的资源,如图片,css或js等进行缓存,从而在每次刷新浏览器的时候,不用重新请求,而是从缓存里面读取,这样就可以减轻服务器的压力。
代替客户机向网站请求数据,从而可以隐藏用户的真实IP地址。将获得的网页数据(静态 web元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速响应。
传统代理:适用于Internet,需明确指定服务器地址和端口;
透明代理:通过默认路由、防火墙策略将Web访问重定向给代理服务器处理;
反向代理:如果squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的web服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。
1.编译安装squid
需要准备squid-3.5.28.tar.gz源码包
- systemctl stop firewalld.service
- setenforce 0
-
- cd /opt/
- tar xf squid-3.5.28.tar.gz
- cd squid-3.5.28/
-
- ./configure --prefix=/usr/local/squid \
- --sysconfdir=/etc \
- --enable-arp-acl \
- --enable-linux-netfilter \
- --enable-linux-tproxy \
- --enable-async-io=100 \
- --enable-err-language="Simplify_Chinese" \
- --enable-underscore \
- --disable-poll \
- --enable-epoll \
- --enable-gnuregex
-
- make && make install
2. 优化目录
- #优化路径
- ln -s /usr/local/squid/sbin/* /usr/local/sbin/
-
- #建立squid用户
- useradd -M -s /sbin/nologin squid
-
- #此目录用于存放缓存文件
- chown -R squid:squid /usr/local/squid/var/
-
3.修改配置文件/etc/squid.conf
- vim /etc/squid.conf
- ......
-
- #放在 http_access deny all 之前,允许任意客户机使用代理服务,控制规则自上而下匹配
- http_access allow all
- http_access deny all
-
- http_port 3128 #用来指定代理服务监听的地址和端口(默认的端口号为 3128)
-
- cache_effective_user squid #添加,指定程序用户,用来设置初始化、运行时缓存的账号,否则启动不成功
- cache_effective_group squid #添加,指定账号基本组
-
- coredump_dir /usr/local/squid/var/cache/squid #指定缓存文件目录
-
4.开启squid服务
检查语法(全为processing则无误)
启动服务
第一次启动 Squid 服务时需要加上-z初始化缓存目录,之后再使用squid
squid -z #-z 选项用来初始化缓存目录
squid #启动 squid 服务squid -k kill #关闭 squid 服务
默认模式,直接启动就是传统模式,但需要客户端手动指定代理的地址和端口(3128)
实验准备
客户端:192.168.116.10
nginx服务器:192.168.116.20
squid 代理:192.168.116.50
修改配置文件
- vim /etc/squid.conf
- cache_mem 512 MB #指定缓存功能所使用的内存空间大小,便于保持访问较频繁的web对象,容量最好为4的倍数,单位为MB,建议设为物理内存的1/4
- reply_body_max_size 100 MB #对响应数据做限定,默认值为0,表示不进行限制
- maximum_object_size 100 MB #定义最大缓存对象,超过大小限制的文件将不被缓存,而是直接转发给用户
-
- #重启
- squid -k kill
- squid
防火墙放通端口
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
在客户端web浏览器中添加squid代理的ip和端口,访问测试
跟踪nginx访问日志(发现访问地址是squid代理的地址)
跟踪squid缓存日志(TCP_MEM_HIT代表命中缓存)
适用于搭建在内外网的网关服务器上,需要开启路由转发功能,防火墙将访问端口重定向到3128端口,还需要指定监听入站网卡的 ip:端口 transport。
实验准备
客户端:192.168.116.10
nginx服务器:12.0.0.20
squid 代理(也做网关)双网卡:内网192.168.116.50 外网12.0.0.50
squid做网关要开启ip转发功能
- vim /etc/sysctl.conf
- #添加
- net.ipv4.ip_forward=1
-
- #加载配置
- sysctl -p
修改squid防火墙策略(用于将web协议端口转发到squid服务端口3128)
- iptables -F
- iptables -t nat -F
-
- iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
- iptables -t nat -A PREROUTING -i ens33 -s 192.168.116.0/24 -p tcp --dport 80 -j REDIRECT --to 3128
- iptables -t nat -A PREROUTING -i ens33 -s 192.168.116.0/24 -p tcp --dport 443 -j REDIRECT --to 3128
修改配置文件添加内网客户端地址transparent,然后重启服务
跟踪nginx访问日志(发现访问地址是squid代理的地址)
跟踪squid缓存日志(TCP_MEM_HIT代表命中缓存)
(1)使用 acl 配置项或指定文件定义需要控制的条件;
(2)通过 http_access 配置项对已定义的列表做“允许”或“拒绝”访问的控制。
一个用户访问代理服务器时,Squid会顺序匹配Squid中定义的所有规则列表,一旦匹配成功,立即停止匹配;
所有规则都不匹配时,Squid会使用与最后一条相反的规则(deny all 或 allow all)
acl 列表名称 列表类型 列表内容 #在配置文件中指定
使用配置项
- vim /etc/squid.conf
- acl localhost src 192.168.110.10/24 #源地址为 192.168.80.10
- acl MYLAN src 192.168.116.0/24 192.168.1.0/24 #客户机网段
- acl destinationhost dst 192.168.80.13/32 #目标地址为 192.168.80.13
- acl MC20 maxconn 20 #最大并发连接 20
- acl PORT port 21 #目标端口 21
- acl DMBLOCK dstdomain .qq.com #目标域,匹配域内所有站点
- acl BURL url_regex -i ^rtsp:// ^emule:// #以 rtsp://、emule:// 开头的目标 URL地址,-i表示忽略大小写
- acl PURL urlpath_regex -i \.mp3$ \.mp4$ \.rmvb$ #以 .mp3、.mp4、.rmvb 结尾的目标 URL 路径
- acl WORKTIME time MTWHF 08:30-17:30 #时间为周一至周五 8:30~17:30,“MTWHF”为每个星期的英文首字母
-
- http_access deny MYLAN #对上面的acl列表允许(allow)或拒绝(deny)
-
- #重启服务
- squid -k kill
- squid
使用文件
- vim /etc/squid_acl_list
- 192.168.116.10
- 192.168.10.10
- 192.168.20.0/24
-
- vim /etc/squid.conf
反向代理作用,作为接受客户端请求的切点,能实现负载均衡;
如果 Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的WEB服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。
实验准备
外网客户端:12.0.0.10,网关设为12.0.0.50,解析192.168.116.50为域名www.abc.com
squid代理服务器:ens33:192.168.116.50;ens36:12.0.0.50 开启路由转发,防火墙做nat
内网web1服务器:192.168.116.20,网关192.168.116.50,安装nginx服务,准备测试页面
内网web1服务器:192.168.116.20,网关192.168.116.50,安装nginx服务,准备测试页面
修改squid配置
- vim /etc/squid.conf
- #添加
- http_port 192.168.116.50:80 accel vhost vport
- cache_peer 192.168.116.20 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
- cache_peer 192.168.116.30 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2
- cache_peer_domain web1 web2 www.abc.com
字段解释
http_port 192.168.116.50:80 accel vhost vport #squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,同时和web server的请求端口(vhost vport)绑定,这个时候请求到了squid,squid是不用转发请求的,而是直接要么从缓存中拿数据要么向绑定的端口直接请求数据。
accel :反向代理加速模式
vhost :支持域名或主机名来表示代理节点
vport :支持IP和端口来表示代理节点cache_peer 192.168.116.20 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1
parent :代表为父节点,上下关系,非平级关系
80 :代理内部web服务器的80端口
0 :没有使用icp(电信运营商),表示就一台squid服务器
no-query :不做查询操作,直接获取数据
originserver :指定是源服务器
round-robin :指定 squid 通过轮询方式将请求分发到其中一台父节点
max_conn :指定最大连接数
weight : 指定权重
name :设置别名cache_peer_domain web1 web2 www.kgc.com #表示客户端对www.abc.com的请求,squid代理会向192.168.80.11和192.168.80.12的80端口发出请求。
防火墙做nat转发
- #清空可能影响的规则
- iptables -F
- iptables -t nat -F
-
- #允许外网访问80端口
- iptables -t nat -A PREROUTING -i ens36 -s 12.0.0.0/12 -p tcp --dport 80 -j ACCEPT
使用客户端访问www.abc.com的测试页面
点击刷新可以发现是不同web节点提供的服务(说明实现了负载均衡的轮询策略)
跟踪squid日志也可以体现缓存和轮询