Squid代理服务器应用

421 阅读6分钟

  • 正向代理:代替客户端向服务端发送请求。
  • 反向代理:代理服务端,将请求转发给多个服务端。

缓存的类型

  • web缓存:加速网站页面的访问,提高响应效率,降低服务端的负载压力(代表:Nginx、Squid、varnish、CDN)
  • 数据库缓存:缓存一些频繁被请求的高热数据的,提高响应效率,降低关系型数据库的负载压力(Redis、 Memcache)

Squid代理服务器介绍

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

Web代理的工作机制

缓存网页对象,减少重复请求

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

image.png

代理服务器的概念

代理服务器是一个位于客户端和原始(资源)服务器之间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标原始服务器,然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。

缓存代理对于Web至关重要,尤其对于大型高负载Web站点。缓存可作为性能优化的一个重要手段,可以极大减轻后端服务器的负载。通常对于静态资源,即较少经常更新的资源,如图片,css或js等进行缓存,从而在每次刷新浏览器的时候,不用重新请求,而是从缓存里面读取,这样就可以减轻服务器的压力。

代理服务器的作用

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

最基本的作用:提高web访问速度,隐藏客户机的真实IP地址。

代理的基本类型

  • 传统代理: 适用于lnternet,需明确指定服务端
    • 直接启动就是传统模式,需要客户端做代理服务器的设置
  • 透明代理: 客户机不需指定代理服务器的地址和端口,而是通过默认路由、防火墙策略将Web访问重定向给代理服务器处理
    • 适用于网关服务器的使用场景,squid服务器开启IP路由转发,配置iptables重定向到3128端口的规则,修改squid配置文件监听入站网卡地址添加transparent选项
  • 反向代理:  如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的 WEB 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。

使用代理的好处

  • 提高Web访问速度
  • 隐藏客户机的真实IP地址

Squid 服务的安装和运行

  • Squid代理服务器:192.168.44.20/24
  • web服务器:192.168.44.30/24
  • 客户机:192.168.44.40/24

操作过程

  1. 编译安装 Squid

    • 确认所需依赖包已经安装 image.png

    • 解压squid包 image.png

    • 配置模块 image.png

    • 进行编译安装 image.png

    • 优化路径,创建程序用户,设置var目录的权限 image.png

  2. 修改 Squid 的配置文件 image.png image.png

  3. Squid 的运行控制

    • 检查配置文件语法是否正确 image.png

    • 启动 Squid,第一次启动 Squid 服务时,会自动初始化缓存目录 image.png

    • 停止squid服务的方法squid -k kill,然后rm删掉进程文件即可 image.png

  4. 创建 Squid 服务脚本(将Squid加入系统服务管理) image.png image.png image.png

    • 试用服务脚本 image.png
#!/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

构建传统代理服务器(正向代理)

  1. 代理服务器,编辑配置文件 /etc/squid.conf image.png image.png

  2. 修改防火墙规则 image.png

  3. 准备web服务器

    • 安装apache image.png image.png
  4. 客户机的代理配置

    • 在使用代理前,先访问一次web服务器。 image.png

    • 之后配置代理:打开菜单 ——> 首选项 ——> 高级 ——> 网络 ——> 连接(设置) image.png image.png

  5. 查看http和squid访问日志的新增记录 image.png image.png image.png

构建透明代理服务器(代理服务器做网关服务器)

  • Squid服务器:双网卡,内网ens33:192.168.44.20 外网ens36:12.0.0.1
  • Web 服务器:12.0.0.12
  • 客户机:192.168.44.40 image.png

操作过程

  1. 修改squid服务器网卡配置,以及web服务器网卡配置,客户机的网卡配置(注意网关配置) image.png image.png image.png

  2. 客户机浏览器连接设置为不代理 image.png

  3. squid代理服务器配置

    • 开启ip转发功能 image.png

    • 修改防火墙规则 image.png

    • 修改配置文件squid.conf image.png image.png

  4. 客户机进行访问 image.png

  5. 查看web服务器的http的配置文件和squid服务器squid日志文件 image.png image.png image.png

ACL访问控制

在配置文件 squid.conf 中,ACL 访问控制通过以下两个步骤来实现:

  1. 使用 acl 配置项定义需要控制的条件
  2. 通过 http_access 配置项对已定义的列表做“允许”或“拒绝”访问的控制

ACL规则优先级

  • 一个用户访问代理服务器时,Squid会顺序匹配Squid中定义的所有规则列表,一旦匹配成功,立即停止匹配
  • 所有规则都不匹配时,Squid会使用与最后一条相反的规则

ACL配置

定义访问控制列表
格式:acl 列表名称 列表类型 列表内容 …

vim /etc/squid.conf
......
acl localhost src 192.168.44.10/32 					#源地址为 192.168.44.10
acl MYLAN src 192.168.44.0/24 192.168.1.0/24		#客户机网段
acl destinationhost dst 192.168.44.13/32			#目标地址为 192.168.44.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(或allow) destinationhost				#注意,如果是拒绝列表,需要放在http_access allow all前面


##启动对象列表管理
#如果需要管理的地址很多,可以将多个地址先写在一个文件里

#启动对象列表管理  
mkdir /etc/squid  vim /etc/squid/dest.list    
#写一个地址管理列表  
192.168.44.50  
192.168.1.0/24

#编辑配置文件  
vim /etc/squid.conf          
......  
acl destinationhost dst "/etc/squid/dest.list"  
#调用指定文件中的列表内容  
......  
  

操作过程

  1. 修改配置文件 image.png

  2. 重启服务后,再用客户机访问,客户机无法访问到 image.png

  3. 修改客户机IP地址,再访问又能访问到 image.png image.png

  4. 设置多个地址,重启服务后,客户机192.168.44.41也被拒绝 image.png image.png

  5. 如果需要管理的地址很多,可以将多个地址先写在一个文件里 image.png image.png image.png

Squid 反向代理

概述

如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的 Web 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。

静态内容/可缓存内容,如果已写入缓存,由缓存服务器提供。动态内容,由代理服务器转发给web服务器进行请求。

image.png

工作机制

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

image.png

构建 Squid 反向代理服务器

  • squid服务器:192.168.44.20/24
  • web1服务器:192.168.44.30/24
  • web2服务器:192.168.44.40/24
  • 客户机:192.168.44.50/24

操作过程

squid服务器配置
  1. squid服务器编译安装squid,方法同上 image.png

  2. 修改 Squid 的配置文件 image.png

  3. 启动squid image.png

  4. 继续修改Squid 的配置文件,配置反向代理 image.png

http_port 80 accel vhost vport #squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,同时和web server的请求端口(vhost vport)绑定,这个时候请求到了squid,squid是不用转发请求的,而是直接要么从缓存中拿数据要么向绑定的端口直接请求数据。
accel :反向代理加速模式
vhost :支持域名或主机名来表示代理节点
vport :支持IP和端口来表示代理节点

parent :代表为父节点,上下关系,非平级关系
80 :代理内部web服务器的80端口
0 :没有使用icp(电信运营商),表示就一台squid服务器
no-query :不做查询操作,直接获取数据
originserver :指定是源服务器
round-robin :指定 squid 通过轮询方式将请求分发到其中一台父节点
max_conn :指定最大连接数
weight : 指定权重
name :设置别名
  1. 清空之前透明模式配置的 iptables 规则 image.png

  2. 重新启动squid或重载squid配置 image.png image.png

两台web服务器配置
  1. 两台web服务器yum安装httpd,并启动服务
  2. 为两台web服务器各编写一个页面 image.png image.png
客户端进行请求访问
  1. 使用主机名访问,在hosts文件中添加配置 image.png

  2. 浏览器不开启代理访问 image.png image.png

  3. squid服务器查看访问日志中的缓存命中情况tailf /usr/local/squid/var/logs/access.log image.png

补充

squid服务器的缓存日志含义

  • MISS:未命中缓存
  • HIT:命中缓存
  • EXPIRED:缓存过期
  • STALE:命中了陈旧缓存
  • REVALIDDATED:Nginx验证陈旧缓存依然有效
  • UPDATING:内容陈旧,但正在更新
  • BYPASS:X响应从原始服务器获取

Squid、Varinsh和Nginx区别

Squid、Varinsh和Nginx都是代理服务器。

什么是代理服务器:

代理服务器能代替用户去访问公网,并且能把访问到的数据缓存到服务器本地,等用户下次再访问相同的资源的时候,代理服务器直接从本地回应给用户。当本地没有的时候,我代替你去访问公网,我接收你的请求,我先在我自己的本地缓存找,如果我本地缓存有,我直接从我本地的缓存里回复你;如果我在我本地没有找到你要访问的缓存的数据,那么代理服务器就会代替你去访问公网。

Squid、Varinsh和Nginx的区别

  1. Nginx本来是反向代理web服务器,用了插件可以做做这个副业但是本身不支持特性挺多,只能缓存静态文件
  2. 从这些功能上。varnish和squid是专业的cache服务,而nginx这些是第三方模块完成;
  3. varnish本身的技术上优势要高于squid,它采用了可视化页面缓存技术;在内存的利用上,Varnish比Squid具有优势,性能要比Squid高。还有强大的通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存它是内存缓存,速度一流,但是内存缓存也限制了其容量,缓存页面和图片一般是挺好的;
  4. squid的优势在于完整的庞大的cache技术资料,和很多的应用生产环境;

工作中选择:要做cache服务的话,我们肯定是要选择专业的cache服务,优先选择squid或者varnish。

Nginx缓存配置

http {
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
	
#####################################################
●path:强制参数,指定缓存文件的存放路径。
●levels:定义了缓存目录的层级。每层可以用1(最多16中选择,0-f)或2(最多256种选择,00-ff)表示,中间用 : 分隔。
proxy_cache_path /data/nginx/cache;  代表所有缓存只有一个目录,比如/data/nginx/cache/d7b6e5978e3f042f52e875005925e51b
proxy_cache_path /data/nginx/cache levels=1:2;  代表缓存是二层目录(有16*256=4096个目录),比如/data/nginx/cache/b/51/d7b6e5978e3f042f52e875005925e51b
●keys_zone:强制参数,定义共享内存区的名称和大小,该共享内存用于保存缓存项目的元数据(所有活动的key和缓存数据相关的信息),这样nginx可以快速判断一个request是否命中或者未命中缓存,1m可以存储8000个key,10m可以存储80000个key。
●inactive:删除指定时间内未被访问的缓存文件,默认10分钟。
●max_size:设置了缓存存储的上限,如果不指定,最大会用掉所有磁盘空间。
●use_temp_path:直接把临时文件放在缓存目录中。
#####################################################
    
    upstream cache_server{
        server 192.168.80.20:80;
        server 192.168.80.30:80;
    }
    
    server {
        listen 80;
        server_name www.kgc.com;
        location / {
            proxy_cache my_cache;               #指定用于页面缓存的共享内存,zone名称由proxy_cache_path指令定义
            proxy_cache_valid 200 5m;           #为不同的响应状态码设置不同的缓存时间,此为缓存状态码为200的请求,缓存时长为5分钟
            proxy_cache_key $request_uri;       #指定缓存文件的key为请求的URI
            add_header Nginx-Cache-Status $upstream_cache_status      #把缓存状态设置为头部信息,响应给客户端
            proxy_pass http://cache_server;     #设置代理转发的后端服务器的协议和地址
        }
    }
}



#对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来看看如何配置不缓存的内容。
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
  listen 80;
  server_name cache.lion.club;
  #URI 中后缀为 .txt 或 .text 的设置变量值为 "no cache"
  if ($request_uri ~ \.(txt|text)$) {
   set $cache_name "no cache"
  }
  
  location / {
    proxy_no_cache $cache_name;      #判断该变量是否有值,如果有值则不进行缓存,如果没有值则进行缓存
    proxy_cache my_cache;            #设置缓存内存
    proxy_cache_valid 200 5m;        #缓存状态为200的请求,缓存时长为5分钟
    proxy_cache_key $request_uri;    #缓存文件的key为请求的URI
    add_header Nginx-Cache-Status $upstream_cache_status    #把缓存状态设置为头部信息,响应给客户端
    proxy_pass http://cache_server;  #代理转发
  }
}