Squid代理服务器应用

一、Squid代理服务器

1.1 什么是Squid

Squid是一个高性能的代理缓存服务器,Squid支持FTP、gopher、HTTPS和HTTP协议。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。

Squid主要提供缓存加速、应用层过滤控制的功能。

1.2 Squid代理的工作机制

  1. 代替客户机向网站发送请求数据,从而可以隐藏真正用户的IP。
  2. 将获得的网页数据(静态Web元素)保存到缓存中并发送给客户机,以便下次请求相同的数据时快速响应。
    在这里插入图片描述

1.3 代理服务器的概念及作用

  1. 概念

    • 代理服务器是一个位于客户端和原始(资源)服务器之间的服务器,为了从原始服务器获得内容,客户端向代理服务器发送一个请求并指定目标原始服务器,然后代理服务器向原始服务器转发请求并将获得的内容返回给客户端。
    • 缓存代理对于Web至关重要,尤其是对于大型的高负载的Web站点。缓存可作为性能优化的一个重要的手段,可以极大地减轻后端服务器的负载。通常对于静态资源,即较少经常更新的资源(图片、css、js等)进行缓存,从而在每次刷新浏览器的时候,不需要重新请求,而是直接从缓存读取,这样就可以减轻服务器的压力。
  2. 作用

    • 资源获取:代替客户端实现从原始服务器的资源获取;
    • 加速访问:代理服务器可能离原始服务器更近,从而起到一定的加速作用;
    • 缓存作用:代理服务器保存从原始服务器所获取的资源,从而实现客户端快速的获取;
    • 隐藏真实地址:代理服务器代替客户端去获取原始服务器资源,从而隐藏客户端真实信息。

1.4 Squid代理的类型

  1. 传统代理:适用于Internet正向代理,需要在客户机指定代理服务器的地址和端口
  2. 透明代理:客户机不需要指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理
  3. 反向代理:如果Squid反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的Web服务器请求资源,然后将请求的应答返回给客户端,同时也将该资源缓存在本地,为下一个请求者直接提供资源使用

1.5 其他的代理、缓存服务器软件

除了squid之外,代理软件还有nginx、Varnish也能充当代理服务器。

  1. nginx:nginx的四层/七层代理,可以实现反向代理Web集群,但是nginx只能缓存静态文件,在业务中,nginx只做反向代理+动静分离,而不会选择它去做缓存服务器,因为太单一(只能缓存静态文件),而且nginx是依赖第三方模块来完成缓存业务的,并不是专业的缓存服务。
  2. Varnish:它是一款高性能的、开源的反向代理服务器和缓存服务器,它和squid相比具有更好的稳定性、更快的访问速度、更多的并发连接数,可以通过端口来管理缓存,这是squid做不到的。但是,在高并发情况下,Varnish会消耗更多的CPU、I/O和内存资源;而且当Varnish进程一旦挂起、崩溃或者重启,缓存的数据会从内存中释放,此时所有的请求都会转发到Web服务器上,给后端服务器造成很大的压力,而且它只支持反向代理。

如果因为工作的需要,我们优选选择squid或者Varnish,然后根据具体的业务进行评估,筛选出合适的软件来构建代理和缓存服务器。

二、Squid安装

首先上传squid安装包至opt目录
yum install -y gcc gcc-c++ make
cd /opt
tar zxvf 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
-----------------------------------------------------
./configure --prefix=/usr/local/squid \				#指定安装目录路径
--sysconfdir=/etc \									#指定配置文件路径
--enable-arp-acl \									#MAC地址管控,防止客户端使用IP欺骗
--enable-linux-netfilter \							#使用内核过滤
--enable-linux-tproxy \								#支持透明模式
--enable-async-io=100 \								#异步IO,提升存储性能
--enable-err-language="Simplify_Chinese" \			#错误信息的显示语言
--enable-underscore \								#允许URL中有下划线
--disable-poll \									#关闭默认使用 poll 模式
--enable-epoll \									#开启epoll模式提升性能
--enable-gnuregex									#使用GNU正则表达式
----------------------------------------------------
make -j2 && make install   #编译安装
ln -s /usr/local/squid/sbin/* /usr/local/sbin/   #做一个软连接,将/usr/local/squid/sbin目录下的所有文件链接到/usr/local/sbin目录,方便管理。
useradd -M -s /sbin/nologin squid   #创建squid用户
chown -R squid:squid /usr/local/squid/var/   #将/usr/local/squid/var目录的属主和属组设置为squid
vim /etc/squid.conf   #编辑squid配置文件
http_access allow all   #在第56行插入该配置,或者只要确保该配置参数在 http_access deny all之前就行,该配置是允许任意客户机使用代理服务,控制规则自上而下匹配。
http_port 3128   #在上一条配置下方插入该参数,用来指定代理服务监听的地址和端口(默认的端口号为 3128)
cache_effective_user squid   #在第61行添加该参数,用于指定程序用户,用来设置初始化、运行时缓存的账号,否则启动不成功
cache_effective_group squid	   #接着添加该参数,用于指定账号基本组
coredump_dir /usr/local/squid/var/cache/squid		#指定缓存文件目录
:wq保存退出
squid -k parse   #检查配置文件语法是否正确
squid -z   #-z 选项用来初始化缓存目录
squid   #启动 squid 服务
netstat -anpt | grep "squid"   #查看服务端口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

------------------创建squid服务的脚本---------------------
vim /etc/init.d/squid
#!/bin/bash
#chkconfig: 2345 90 25
PID="/usr/local/squid/var/run/squid.pid"
CONF="/etc/squid.conf"
CMD="/usr/local/squid/sbin/squid"
case "$1" in
   start)
     netstat -natp | grep squid &> /dev/null
     if [ $? -eq 0 ]
     then
       echo "squid is running"
     else
       echo "正在启动 squid..."
       $CMD
     fi
   ;;
   stop)
     $CMD -k kill &> /dev/null
     rm -rf $PID &> /dev/null
   ;;
   status)
     [ -f $PID ] &> /dev/null
        if [ $? -eq 0 ]
          then
            netstat -natp | 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|status|reload|check|restart}"
   ;;
esac
:wq保存退出
chmod +x /etc/init.d/squid   #赋予脚本可执行权限
chkconfig --add squid   #将脚本文件加入chkconfig管理命令中
chkconfig --level 35 squid on   #设置第3、5级别启动
然后我们就可以使用service或者systemctl命令来管理squid服务了
service squid start     #开启服务
service squid stop      #停止服务
service squid restart   #重启服务
service squid check     #检查服务的配置文件是否正确
service squid status    #查看服务状态

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1 搭建传统代理服务器

在这里插入图片描述
准备工作:
一台客户机:windows或者linux系统都可以,IP地址:192.168.41.100
一台squid代理服务器:linux Centos7系统,IP地址:192.168.41.46
一台Web服务器:linux Centos7系统,IP地址:192.168.41.45

----------------Web服务器------------------
yum install -y httpd   
echo "this is test web" > /var/www/html/index.html
systemctl start httpd
搭建Web服务器之前已经做过太多次了,就不截图了
PC浏览器访问测试

在这里插入图片描述

---------------squid代理服务器------------------
vim /etc/squid.conf
#在第63行插入以下参数
cache_mem 64 MB				#指定缓存功能所使用的内存空间大小,便于保持访问较频繁的WEB对象,容量最好为4的倍数,单位为MB,建议设为物理内存的1/4
reply_body_max_size 10 MB			#允许用户下载的最大文件大小,以字节为单位,当下载超过指定大小的Web对象时,浏览器的报错页面中会出现“请求或访问太大”的提示默认设置0表示不进行限制
maximum_object_size 4096 KB			#允许保存到缓存空间的最大对象大小,以KB为单位,超过大小限制的文件将不被缓存,而是直接转发给用户
:wq保存退出
service squid check   #检查文件语法
service squid restart   #重启squid服务
iptables -F   #清空防火墙规则
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT   #添加防火墙规则,允许tcp协议的3128端口的流量通过
iptables -nL   #查看防火墙规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

---------------客户端操作---------------------
这里使用Win7操作系统
IE浏览器:
打开浏览器,工具-->Internet选项-->连接-->局域网设置-->开启代理服务器(地址:Squid服务器IP地址,端口:3128)
chrome浏览器:打开浏览器,点击右上角logo旁边的自定义及控制,选择设置,点击高级,选择打开您计算机的代理设置,点击局域网设置,勾选代理服务器配置,然后进行配置,ip为代理服务器地址,端口3128

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

------------------------测试--------------------------
1.追踪代理服务器的日志信息
tail -f /usr/local/squid/var/logs/access.log
2.追踪Web服务器的日志信息
tail -f /etc/httpd/logs/access_log
3.win7浏览器访问网页,第一次访问代理服务器是没有缓存命中信息的,清空浏览器缓存再次访问,查看代理服务器日志,查找TCP_MEM_HIT/200字段,如果有,说明缓存命中;没有的话建议多试几次

-------------------日志文件部分参数解读---------------
MISS:未命中缓存
HIT:命中缓存
EXPIRED:缓存过期
STALE:命中了陈旧缓存
REVALIDDATED:nginx验证陈旧缓存依然有效
UPDATING:内容陈旧,但正在更新
BYPASS:X响应从原始服务器获取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第一次访问和第二次、第三次访问,会明显地感觉到访问速度的不同,因为第一次是经过代理服务器访问web服务器,能明显感觉到停滞了1秒,而第二次访问开始,就是一瞬间,页面就加载出来了,因为通过第一次的访问,代理服务器已经将这条访问信息记录到了本地的缓存中,第二次及之后的访问都是直接从缓存中获取数据,而不再经过代理服务器去访问web服务器。

2.2 搭建透明代理服务器

准备工作:
一台客户机:windows或者linux系统都可以,IP地址:192.168.41.100
一台squid代理服务器:linux Centos7系统,IP地址:ens33:192.168.41.46,ens36:12.0.0.254(双网卡)
一台Web服务器:linux Centos7系统,IP地址:12.0.0.2
在这里插入图片描述

---------------squid代理服务器-----------------
vim /etc.squid.conf
http_port 192.168.41.46:3128 transparent   #将原先的http_port 3128 修改为这条参数,该参数的含义是提供内网服务的IP地址和支持透明代理选项transparent
service squid restart 
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf   #开启路由转发功能,因为此时的代理服务器也用作网关,需要转发数据信息
sysctl -p
iptables -F
iptables -t nat -F
iptables -t nat -A PREROUTING -i ens33 -s 192.168.41.0/24 -p tcp --dport 80 -j REDIRECT --to 3128	#用于转发http协议
iptables -t nat -A PREROUTING -i ens33 -s 192.168.41.0/24 -p tcp --dport 443 -j REDIRECT --to 3128	#用于转发https协议
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
iptables -nL   #查看防火墙规则
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens36
vim ifcfg-ens36
IPADDR改为12.0.0.254,DNS和GATEWAY注释掉,DIVICE和NAME改为ens36,删掉UUID参数
vim ifcfg-ens33
将DNS和GATEWAY注释掉
systemctl restart network
ifconfig

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

---------------web服务器-------------------
vim /etc/sysconfig/network-scripts/ifcfg-ens33 
将IPADDR改为12.0.0.12,GATEWAY改为12.0.0.254,将DNS注释
systemctl restart network
ifconfig
ping 192.168.41.46   #ping代理服务器的内网卡测试
ping 12.0.0.254   #ping外网卡测试
systemctl restart httpd
netstat -natp | grep 80

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

------------------客户端--------------------------
将客户端网关设置为192.168.41.46(代理服务器地址)
win+R,输入cmd,分别ping192.168.41.46和12.0.0.254测试网络连通性

在这里插入图片描述
在这里插入图片描述

--------------------测试-----------------------
客户端使用浏览器访问12.0.0.12,第一次访问完毕后,清空浏览器缓存,多次访问
追踪代理服务器日志信息:
tail -f /usr/local/squid/var/logs/access.log
追踪web服务器日志信息:
tail -f /etc/httpd/logs/access_log

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3 Squid中ACL的使用

  1. 在配置文件 squid.conf 中,ACL 访问控制通过以下两个步骤来实现:
    (1)使用 acl 配置项定义需要控制的条件;
    (2)通过 http_access 配置项对已定义的列表做“允许”或“拒绝”访问的控制。
  2. 定义访问控制列表
    格式:acl 自定义列表名称 列表类型 列表内容 …
-----------------ACL访问控制--------------------
访问控制的案例(在squid.conf中设置):
acl localhost src XXX.XXX.XXX.XXX/32 				#源地址为XXX.XXX.XXX.XXX
acl MYLAN src 192.168.41.0/24 192.168.51.0/24		#客户机网段
acl destinationhost dst XXX.XXX.XXX.XXX/32			#目标地址为XXX.XXX.XXX.XXX
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 MTWTF 08:30-17:30					#时间为周一至周五 8:30~17:30,“MTWTF”为每个星期的英文首字母

对象列表管理:
mkdir /squid_deny   #创建一个目录,我将它命名为squid_deny,意思就是squid服务拒绝通过,方便理解、查看
vim /squid_deny/dest.list   #编辑拒绝的目的地址的文件
192.168.41.45   #拒接目标地址192.168.41.45,将web服务器拒绝,即不能访问Web服务器了

vim /etc/squid.conf
acl desthost dst "/squid_deny/dest.list"   #在squid.conf中写入acl规则,直接调用dest.list文件中的内容
http_access deny desthost   #调用acl规则,desthost是自定义的列表名称,注意,如果是deny,需要放在http_access allow all前面
service squid restart
浏览器访问测试
再编辑squid.conf文件,将acl配置注释或者删除
service squid restart
此时,浏览器可以恢复访问

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.4 Squid日志分析工具Sarg

首先将sarg安装包上传至opt目录
yum install -y pcre-devel gd gd-devel   #安装依赖
cd /opt
tar zxvf sarg-2.3.7.tar.gz
cd sarg-2.3.7/
./configure \
--prefix=/usr/local/sarg \
--sysconfdir=/etc/sarg \
--enable-extraprotection
-------------------------------------------
./configure --prefix=/usr/local/sarg \
--sysconfdir=/etc/sarg \							#配置文件目录,默认是/usr/local/etc
--enable-extraprotection							#额外安全防护
--------------------------------------------
make -j 2 && make install
vim /etc/sarg/sarg.conf   #编辑sarg.conf文件,该文件全部被注释了
access_log /usr/local/squid/var/logs/access.log   #第7行取消注释,作用是指定访问日志文件
title "Squid User Access Reports"   #25行取消注释,作用是显示网页标题
output_dir /var/www/html/sarg   #120行取消注释,并修改,作用是报告输出目录
user_ip no   #178行取消注释,作用是使用用户名显示
topuser_sort_field connect reverse   #184行取消注释,并修改,作用是在top排序中,指定连接次数采用降序排列,升序是normal
user_sort_field connect reverse   #190行取消注释,并修改,作用是对于用户访问记录,连接次数按降序排序
exclude_hosts /usr/local/sarg/noreport   #206行取消注释,并修改,作用是指定不计入排序的站点列表的文件
overwrite_report no	  #257行取消注释,作用是同名同日期的日志是否覆盖,no为不覆盖
mail_utility mailq.postfix   #289行取消注释,并修改,作用是发送邮件报告命令
charset UTF-8   #434行取消注释,并修改,作用是指定字符集UTF-8
weekdays 0-6   #518行取消注释,作用是top排行的星期周期
hours 0-23   #525行取消注释,并修改,作用是top排行的时间周期
www_document_root /var/www/html   #633行取消注释,作用是指定网页根目录
:wq保存退出   #因为文件跨度较大,就不截图了,就是将上述的参数前的#号删除,部分参数进行修改即可

touch /usr/local/sarg/noreport   #添加不计入站点文件,添加的域名将不被显示在排序中
ln -s /usr/local/sarg/bin/sarg /usr/local/bin/   #链接优化,方便管理
sarg --help   #查看帮助信息
sarg   #运行sarg
yum install -y httpd   #因为我们访问的是网页服务,需要依赖Web服务器,所以需要安装httpd
systemctl start httpd   #运行httpd
sarg   #运行sarg

在这里插入图片描述
在这里插入图片描述

------------------------测试----------------------
客户端浏览器输入192.168.41.46/squid进行访问

在这里插入图片描述
在这里插入图片描述

2.5 Squid反向代理

工作机制:

  1. 缓存网页对象,减少重复请求
  2. 将互联网请求轮训或按权重分配到内网Web服务器
  3. 代理用户请求,避免用户直接访问Web服务器,提高安全

squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,同时和web server的请求端口(vhost vport)绑定,这个时候请求到了squid,squid是不用转发请求的,而是直接要么从缓存中拿数据要么向绑定的端口直接请求数据。
在这里插入图片描述
准备工作:
一台客户机:windows或者linux系统都可以,IP地址:192.168.41.100
一台squid代理服务器:linux Centos7系统,IP地址:ens33:192.168.41.46
两台Web服务器:linux Centos7系统,IP地址:1292.168.41.44和192.168.41.45

--------------------squid代理服务器-------------------
vim /etc/squid.conf
http_port 192.168.41.46:80 accel vhost vport
#squid作为了web集群的反向代理,客户端直接访问squid服务器即可。
#accel :反向代理加速模式
#vhost :支持域名或主机名来表示代理节点
#vport :支持IP和端口来表示代理节点
cache_peer 192.168.41.44 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=test1
cache_peer 192.168.41.45 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=test2
cache_peer_domain test1 test2 www.hang.com

#parent :代表为父节点,上下关系,非平级关系
#80 :代理内部web服务器的80端口
#0 :没有使用icp(电信运营商),表示就一台squid服务器
#no-query :不做查询操作,直接获取数据
#originserver :指定是源服务器
#round-robin :指定 squid 通过轮询方式将请求分发到其中一台父节点
#max_conn :指定最大连接数
#weight : 指定权重
#name :设置别名
iptables -F
iptables -t nat -F
#因为squid做反向代理,所以防火墙不需要任何的规则来拦截请求的流量
netstat -natp | grep :80   
#防止httpd或nginx服务使用的80端口和squid反向代理配置的监听端口冲突
service squid restart   #重启squid服务
netstat -natp | grep squid   #查看squid服务监听端口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

---------------------web服务器(两台一样操作)-------------------
yum install -y httpd
echo "this is test1 web from server 44" > /var/www/html/index.html   #44编写index.html文件
echo "this is test2 web from server 45" > /var/www/html/index.html   #45编写index.html文件
systemctl start httpd

在这里插入图片描述
在这里插入图片描述

-----------------客户机设置----------------
配置hosts文件,添加域名和IP的映射关系
1)点击计算机
2)打开C:\Windows\System32\drivers\etc
3)使用记事本打开hosts文件
4)在最后一行插入192.168.41.46   www.hang.com
***插入时最好按照上面的格式进行插入***
5)ctrl+s保存即可
6)如果没有权限,右击hosts文件
7)选择属性,选择安全,点击编辑
8)组或用户名栏中找到自己的用户组,一般是在最后一个
9)将Users的权限栏中的所有权限都勾选为允许
10)点击应用,再点击确定,再点击确定,就OK了,这样我们就能修改hosts文件了

在这里插入图片描述
在这里插入图片描述

-----------------测试---------------------
1.客户端浏览器访问 www.hang.com
2.监控squid服务器的日志信息
tail -f /usr/local/squid/var/logs/access.log

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

  1. squid的三种代理模式:正向、反向、透明
  2. squid、varnish、nginx三种软件的区别以及各自的优缺点:
    • nginx:轻量、快捷,但是只能缓存静态文件,依赖第三方模块;
    • varnish:高稳定性、快访问速度、更多的并发连接支持、可通过端口来管理缓存;但是会消耗更多的系统资源,服务down后会释放内存中的数据,从而给后端服务器很大的压力;只能做反向代理
    • squid:正向、反向、透明代理都能实现;高并发下消耗相对较低;缓存数据支持持久化;但是故障概率相对较高,因为要经常重启;访问速度相对较慢(varnish从内存读取缓存数据,squid从硬盘读取缓存数据)
  3. 实验要细心,配置文件错一点都通过不了文件的语法检查
  4. 防火墙和selinux要记得关
  5. 牢记缓存服务器的工作原理:缓存服务器有,就直接从缓存服务器拿,而不需要再去访问Web服务器;没有再去找Web服务器,得到数据后,缓存服务器会将该数据存到本地,只要不宕机,以后的每次访问,都会直接从缓存服务器读取,降低了web服务器的压力
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一念去殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值