第一部分 代理服务概述

一、什么是代理

代理服务器(Proxy Server)位于客户端与真实服务器之间,代替客户端向服务器发起请求,或代替服务器接收客户端的请求。由于所有流量都经过代理,代理天然具备缓存、过滤、审计、地址转换的能力。

二、正向代理与反向代理的区别

对比项 正向代理 反向代理
代理对象 代理客户端 代理服务器
部署位置 靠近客户端(内网出口) 靠近服务器(网站最前端)
客户端是否知情 客户端需显式配置代理(透明代理除外) 客户端完全不知情,以为直接访问的就是网站
服务器是否知情 服务器只看到代理的 IP,不知道真实客户端 服务器(后端 web)知道请求来自代理
典型作用 内网上网、访问控制、上网行为管理、共享带宽与缓存 静态页面缓存加速、负载均衡、隐藏后端架构、CDN 节点
类比 有缓存的 SNAT(源地址转换) 有缓存的 DNAT(目的地址转换)

Squid 的两种角色正好对应这两类代理:

  1. 代理上网(正向代理、透明代理):简单看作有缓存的 SNAT。
  2. 网站静态页面缓存加速(反向代理):简单看作有缓存的 DNAT。

三、透明代理

透明代理属于正向代理的一种特殊实现:

  • 客户端不需要在浏览器或系统中配置任何代理参数;
  • 由网关(通常就是 Squid 所在的 Linux 路由器)用 iptables 把出站的 80 端口流量强制重定向(REDIRECT / DNAT)到 Squid 的监听端口;
  • 客户端"感觉不到"代理存在,因此称为透明(transparent / intercept)。

透明代理常用于企业内网强制上网审计与缓存,避免逐台客户端配置代理的麻烦。

四、代理的作用

  1. 缓存加速:把命中率高的静态资源(图片、CSS、JS、静态 HTML)缓存到代理本地磁盘或内存,下次请求直接由代理返回,节省带宽、降低后端压力、缩短响应时间。
  2. 访问控制:通过 ACL 按源 IP、时间段、目标域名、URL 关键字、请求方法等维度允许或拒绝访问,实现上网行为管理。
  3. 隐藏客户端 / 隐藏服务端:正向代理隐藏真实客户端 IP;反向代理隐藏后端服务器的真实 IP 与架构,同时可作为统一入口做负载均衡。

五、反向代理在网站架构中的位置

典型网站架构(反向代理位于最前端):

client
  |
因特网
  |
1 个或多个反向代理(较近地理位置增强响应时间、静态缓存加速、网站数据切分)  CDN
  |
前端 web
  |
中间件
  |
数据库
  |
存储

业务类比:

client                 国外客户
  |                       |
反向代理                 海外仓储
  |                       |
web                    国内公司

六、同类软件

常见的代理 / 缓存加速软件还有 varnish、ATS(Apache Traffic Server)、nginx(proxy_cache) 等。可从缓存介质(内存 / 磁盘)、配置复杂度、正反向代理支持、并发性能等角度对比选型。


第二部分 Squid 代理缓存

一、反向代理原理流程

实验拓扑:

client 192.168.2.190          client
  |
eth0 192.168.2.151
squid 服务器                  secretary
eth1 192.168.224.10
  |
内网 web 服务器 VM1            BOSS
eth0 192.168.224.11

说明:192.168.224.10 为 squid 的内网 IP;192.168.2.151 为 squid 的外网 IP(squid 在最前端);192.168.2.190 为外网客户端(用宿主机模拟,需改变宿主机配置)。

工作流程:

  1. client 发起请求(假设为一张图片)。
  2. squid 接收请求,在缓存中查找 client 请求是否存在。
  3. 如果 cache hit,直接返回结果给 client。
  4. 如果 cache miss,把请求转给后台 web。
  5. web 把结果返回给 squid,再返回给 client。
  6. squid 会把这个图片缓存起来(符合条件才能缓存),以备下次客户端访问直接 cache hit。

二、安装 Squid

# yum install squid -y

启动前需要安装 openssl,否则无法启动 squid:

# yum install openssl -y

相关路径:

路径 说明
/etc/squid/squid.conf 主配置文件
/var/spool/squid 默认磁盘缓存目录
/var/log/squid/access.log 访问日志
/var/log/squid/cache.log 运行 / 错误日志

三、/etc/squid/squid.conf 配置详解

3.1 监听端口 http_port

# 正向代理(普通代理)默认监听 3128
http_port 3128

# 透明代理(拦截模式)
http_port 3128 transparent

# 反向代理加速模式
http_port 80 accel vhost vport

参数含义:

  • accel:反向代理加速模式;
  • vhost:支持域名或主机名来表示代理节点;
  • vport:支持 IP 和端口来表示代理节点;
  • transparent:透明代理模式,配合 iptables 重定向使用(新版本中亦写作 intercept)。

3.2 磁盘缓存 cache_dir

cache_dir ufs /var/spool/squid 256 16 256

字段依次为:

字段 说明
ufs 缓存存储类型(Squid 传统的 UFS 格式)
/var/spool/squid 缓存目录路径
256 缓存空间大小,单位 MB
16 一级子目录个数
256 每个一级目录下的二级子目录个数

3.3 内存缓存 cache_mem

cache_mem 128 MB

指定 Squid 用于存放"正在传输的对象、热门对象、负缓存对象"的内存大小,一般设置为物理内存的 1/3 左右,不要超过可用内存。

3.4 访问控制 acl 与 http_access

Squid 的访问控制分两步:先用 acl 定义一个匹配条件,再用 http_access 对该条件放行或拒绝。

acl <名称> <类型> <值...>
http_access allow|deny <名称>

最简单的"全部允许":

http_access allow all        # ACL 直接允许所有(这一句前面的内容全删除)

规则自上而下匹配,一旦命中即生效,后面的规则不再判断,因此限制类规则必须写在 http_access allow all 之前。默认配置末尾还有一条隐含的 http_access deny all。

常用 acl 类型:

类型 含义
src 源 IP / 网段
dst 目标 IP / 网段
dstdomain 目标域名
srcdomain 源域名
url_regex 匹配完整 URL 的正则
urlpath_regex 匹配 URL 路径部分的正则
time 时间段(星期缩写 + 时间范围)
port 目标端口
method 请求方法(GET、POST、CONNECT 等)
maxconn 单 IP 最大并发连接数

3.5 主机名 visible_hostname

visible_hostname squid.example.com

Squid 启动时若无法自动解析本机主机名会报错退出,因此建议显式指定 visible_hostname;该名字也会出现在错误页面中。

3.6 缓存刷新策略 refresh_pattern

refresh_pattern 决定"缓存对象在没有明确过期时间的情况下,多久算新鲜",即缓存有效期策略。

refresh_pattern [-i] <正则> <min> <percent> <max> [options]
字段 说明
-i 忽略大小写
<正则> 匹配 URL 的正则表达式
min 最小新鲜时间(分钟),无过期时间的对象在此时间内一定视为新鲜
percent 以"对象存在时间(Last-Modified 到现在)"的百分比作为新鲜期
max 最大新鲜时间(分钟),超过即视为过期需回源验证

默认配置示例:

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

针对静态资源做长时间缓存的示例:

refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$  1440  90%  10080
refresh_pattern -i \.(css|js)$                1440  90%  10080
refresh_pattern -i \.(html|htm)$              60    50%  1440

常用 options:override-expire(忽略源站 Expires)、override-lastmod、ignore-reload、reload-into-ims 等。

四、初始化缓存目录与启动服务

配置改完后先做语法检查,再初始化缓存目录(cache_dir 指定的多级目录结构由 -z 生成),最后启动服务:

# squid -k parse                 # 检查配置文件语法
# squid -z                       # 初始化缓存目录(首次或更改 cache_dir 后执行)
# systemctl restart squid        # 启动 / 重启服务
# systemctl enable squid         # 设置开机自启
# squid -k reconfigure           # 不中断服务重新加载配置

提示:squid -z 需要 /var/spool/squid 属主为 squid 用户,若手动创建目录记得 chown -R squid:squid /var/spool/squid。

五、普通代理实验(正向代理)

5.1 服务端配置

# vim /etc/squid/squid.conf
http_port 3128
cache_mem 128 MB
cache_dir ufs /var/spool/squid 256 16 256
visible_hostname squid.example.com

acl localnet src 192.168.224.0/24
http_access allow localnet
http_access allow all
# squid -k parse
# squid -z
# systemctl restart squid

5.2 客户端配置代理

浏览器方式:在浏览器"网络设置 / 代理设置"中选择"手动配置代理",HTTP 代理填 Squid 服务器 IP(如 192.168.224.10),端口填 3128,并勾选"同时用于 HTTPS"。

命令行 curl 方式:

# curl -x 192.168.224.10:3128 http://www.example.com
# curl --proxy http://192.168.224.10:3128 -I http://www.example.com

环境变量方式(对 curl/wget/yum 等生效):

# export http_proxy=http://192.168.224.10:3128
# export https_proxy=http://192.168.224.10:3128
# wget http://www.example.com

yum 通过代理(写入 /etc/yum.conf):

proxy=http://192.168.224.10:3128

5.3 验证

在 Squid 上实时观察日志,确认客户端请求确实经过代理:

# tail -f /var/log/squid/access.log

六、透明代理实验(结合 iptables 重定向)

透明代理要求 Squid 服务器同时是内网客户端的网关。

6.1 开启内核转发

# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p

6.2 Squid 配置为 transparent 模式

http_port 3128 transparent
cache_mem 128 MB
cache_dir ufs /var/spool/squid 256 16 256
visible_hostname squid.example.com

acl localnet src 192.168.224.0/24
http_access allow localnet
# squid -k parse
# systemctl restart squid

6.3 iptables 重定向规则

把内网客户端发往外网 80 端口的流量重定向到 Squid 的 3128 端口,其余流量正常做 SNAT 上网:

# iptables -t nat -A PREROUTING -i eth1 -s 192.168.224.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128
# iptables -t nat -A POSTROUTING -s 192.168.224.0/24 -o eth0 -j MASQUERADE
# service iptables save

说明:eth1 为内网网卡,eth0 为外网网卡。HTTPS(443)流量无法被这种明文代理透明拦截解密,通常直接放行走 SNAT。

6.4 客户端验证

客户端网关指向 Squid 内网 IP 192.168.224.10,浏览器不做任何代理配置,直接访问外网页面,随后在 Squid 上查看日志确认已被拦截缓存:

# tail -f /var/log/squid/access.log

七、反向代理加速实战(单台 squid + 单台 web)

7.1 配置内网 web 服务器

在内网 web 服务器上安装 httpd 并做一个主页用于测试:

# yum install httpd* -y
# echo "内网web" > /var/www/html/index.html
# systemctl restart httpd

7.2 安装并配置 squid

在 squid 服务器上安装:

# yum install squid -y

使用一个新的配置文件;如果是在透明代理基础上再做反向代理,先注释掉前面所有配置。

# vim /etc/squid/squid.conf
http_access allow all        # ACL 直接允许所有(这一句前面的内容全删除)

http_port 80 accel vhost vport
# accel     反向代理加速模式
# vhost     支持域名或主机名来表示代理节点
# vport     支持 IP 和端口来表示代理节点

cache_peer 192.168.224.11 parent 80 0 no-query originserver name=web
# 192.168.224.11  内网 web 服务器的 IP
# parent          上下关系,非平级关系
# 80              代理内部 web 服务器的 80 端口
# 0               没有使用 icp,表示就一台 squid 服务器
# no-query        不去查询邻居,与上面的 0 结合使用
# originserver    表示源实际服务器
# name=web        定义一个名字,让后面的参数引用

cache_peer_domain web server.example.com
# 对 server.example.com 的请求会给 web 这台服务器(192.168.224.11)
# 如果有多台 web,可多台 web 绑定同一个域名,还可以实现 RR 轮询调度

cache_peer_domain web 192.168.2.151
# 光写上面一条,客户端只能通过 server.example.com 访问
# 再加上这条,客户端就可以使用 192.168.2.151 来访问

cache_dir ufs /var/spool/squid 256 16 256

启动前需要安装 openssl,否则无法启动 squid:

# yum install openssl -y
# systemctl restart squid

7.3 测试

在宿主机访问 http://192.168.2.151,网页内容显示"内网Web"。

客户端的 DNS 解析 server.example.com 应该得到 192.168.2.151 的结果。不做 DNS 的话,直接在 /etc/hosts 里写:

192.168.2.151  server.example.com

使用 curl -I 查看是否命中缓存:

curl -I http://server.example.com

八、问题一:squid 如何代理多个 web

client
  |
squid
  |
web1  web2  web3  web4

配置示例:

http_port 80 accel vhost vport

cache_peer 192.168.224.11 parent 80 0 no-query originserver round-robin name=web1
cache_peer 192.168.224.12 parent 80 0 no-query originserver round-robin name=web2
cache_peer 192.168.224.13 parent 80 0 no-query originserver round-robin name=web3
cache_peer 192.168.224.101 parent 80 0 no-query originserver round-robin name=web4

cache_peer_domain web1 web2 www.aaa.com
cache_peer_domain web3 web4 www.bbb.com

round-robin 使同一域名下的多个 peer 实现 RR 轮询调度,从而兼具负载均衡效果。

九、问题二:配置 squid 集群(sibling 协作)

拓扑:

192.168.2.190
client

www.abc.com
通过 DNS 技术(DNS 轮询或智能 DNS);通过负载均衡软件(nginx、haproxy、lvs)

192.168.2.151              10.0.8.101
squid1                     squid2
192.168.224.10             192.168.224.13

web1                       web2
192.168.224.11             192.168.224.12

注意:要重置虚拟机。

9.1 准备过程

  1. 主机名绑定:
192.168.224.10   server.example.com   squid1
192.168.224.13   client3.example.com  squid2
192.168.224.11   client1.example.com  web1
192.168.224.12   client2.example.com  web2
  1. IP 静态。
  2. 关闭防火墙、selinux。
  3. 时间同步。
  4. 使用系统默认的 yum 源。

9.2 第一步:两个 web 上安装 httpd

注意:所有机器时间一定要同步,特别是 web1 和 web2。如果 web1 和 web2 时间隔得太久,可能造成客户端访问时不先访问缓存而是访问后台 web,也就是缓存失效。

# yum install http* -y
# systemctl restart httpd

# echo web1 > /var/www/html/index.html    # 在 web1 上做
# echo web2 > /var/www/html/index.html    # 在 web2 上做(两个主页不同,方便区分)

9.3 第二步:安装并配置 squid1

# yum install squid -y
# vim /etc/squid/squid.conf
http_access allow all
cache_dir ufs /var/spool/squid 256 16 256
http_port 80 accel vhost vport

icp_port 3130
icp_access allow all
cache_peer 192.168.224.13 sibling 80 3130
cache_peer 192.168.224.11 parent 80 0 no-query originserver round-robin name=web1
cache_peer 192.168.224.12 parent 80 0 no-query originserver round-robin name=web2
cache_peer_domain web1 web2 www.abc.com

icp_port 3130 开启 ICP(Internet Cache Protocol)端口;sibling 表示平级邻居关系,本机 cache miss 时会先向 sibling 查询是否有该对象,有则从邻居取,避免都回源。

启动前需安装 openssl:

# yum install openssl -y
# systemctl restart squid

9.4 第三步:安装并配置 squid2

把 squid1 的配置文件拷过来,只需要修改一个地方(sibling 的 IP,换成对方的 IP):

# yum install squid -y
# vim /etc/squid/squid.conf
cache_peer 192.168.224.10 sibling 80 3130

然后启动服务:

# yum install openssl -y
# systemctl restart squid

9.5 第四步:在客户端测试

在宿主机上访问 http://192.168.2.151 和 http://10.0.8.101。

编辑 /etc/hosts 绑定 IP 地址与域名来模拟 DNS(注意不能实现 DNS 轮询,所以手动绑定其中指定解析为 squid1 或 squid2):

192.168.2.151   www.abc.com
10.0.8.101      www.abc.com

十、ACL 访问控制实例

以下规则均写在 http_access allow all 之前,改完后执行 squid -k reconfigure 生效。

10.1 按 IP 禁止 / 允许

# 禁止单个 IP 上网
acl badip src 192.168.224.100
http_access deny badip

# 禁止一个网段,只放行部分主机
acl office src 192.168.224.0/24
acl vip src 192.168.224.10 192.168.224.11
http_access allow vip
http_access deny office

也可以把 IP 列表写入文件后引用:

# echo -e "192.168.224.100\n192.168.224.101" > /etc/squid/badip.list
acl badip src "/etc/squid/badip.list"
http_access deny badip

10.2 按时间禁止

time 类型的星期缩写:S(周日) M(周一) T(周二) W(周三) H(周四) F(周五) A(周六)。

# 工作时间(周一至周五 8:30-18:00)禁止上网
acl worktime time MTWHF 08:30-18:00
http_access deny worktime

# 只允许工作日白天上网,其他时间禁止
acl worktime time MTWHF 09:00-17:30
http_access allow worktime
http_access deny all

结合 IP 与时间(限定研发网段午休时间可上网):

acl dev src 192.168.224.0/24
acl lunch time MTWHF 12:00-13:30
http_access allow dev lunch          # 同一行多个 acl 为"与"关系
http_access deny dev

10.3 按域名禁止

# 禁止访问指定域名(.前缀表示包含所有子域名)
acl baddomain dstdomain .qq.com .weibo.com
http_access deny baddomain

# 只允许访问白名单域名
acl gooddomain dstdomain .example.com .redhat.com
http_access allow gooddomain
http_access deny all

域名列表同样可放入文件:

acl baddomain dstdomain "/etc/squid/baddomain.list"
http_access deny baddomain

10.4 按 URL 关键字 / 文件类型禁止

# URL 中包含关键字即禁止(-i 忽略大小写)
acl badurl url_regex -i sex game gamble
http_access deny badurl

# 禁止下载指定后缀的文件
acl badfile urlpath_regex -i \.(exe|rar|zip|mp4|avi|torrent)$
http_access deny badfile

10.5 其他常用控制

# 禁止 POST 方法(只允许浏览不允许提交)
acl uploadmethod method POST
http_access deny uploadmethod

# 限制单个客户端并发连接数
acl maxconn5 maxconn 5
http_access deny maxconn5

# 只允许代理安全端口
acl Safe_ports port 80 21 443 70 210 1025-65535
http_access deny !Safe_ports

十一、日志分析

11.1 access.log 字段

# tail -f /var/log/squid/access.log

一条典型记录:

1590000000.123    215 192.168.224.100 TCP_MISS/200 4325 GET http://www.example.com/index.html - FIRSTUP_PARENT/192.168.224.11 text/html

字段依次为:

序号 字段 说明
1 1590000000.123 请求完成的时间戳(UNIX 时间,毫秒精度)
2 215 请求处理耗时(毫秒)
3 192.168.224.100 客户端 IP
4 TCP_MISS/200 缓存结果码 / HTTP 状态码
5 4325 返回给客户端的字节数
6 GET 请求方法
7 http://... 请求的 URL
8 - 用户身份(未启用认证时为 -)
9 FIRSTUP_PARENT/192.168.224.11 数据来源(层次结构 / 对端服务器)
10 text/html 内容类型

把时间戳转换为可读时间:

# date -d @1590000000

11.2 常见缓存结果码含义

结果码 含义
TCP_HIT 命中缓存,对象是新鲜的,直接由 Squid 磁盘/内存返回
TCP_MEM_HIT 命中内存缓存,未读磁盘,速度最快
TCP_MISS 未命中,Squid 回源取数据后返回
TCP_REFRESH_HIT 缓存已过期,回源验证后源站返回 304,仍使用本地缓存
TCP_REFRESH_MISS 缓存已过期,回源验证后源站返回了新内容
TCP_IMS_HIT 客户端带 If-Modified-Since,本地缓存新鲜,直接返回
TCP_NEGATIVE_HIT 命中负缓存(缓存的错误响应,如 404)
TCP_DENIED 请求被 ACL 拒绝
TCP_CLIENT_REFRESH_MISS 客户端强制刷新(no-cache),强制回源
NONE 无缓存动作(如错误、CONNECT 隧道)

11.3 命中率统计与验证

用 curl -I 观察 X-Cache 响应头是否为 HIT:

# curl -I http://server.example.com

统计命中与未命中的次数:

# awk '{print $4}' /var/log/squid/access.log | sort | uniq -c | sort -rn
# grep -c TCP_HIT /var/log/squid/access.log
# grep -c TCP_MISS /var/log/squid/access.log

统计访问量最高的客户端与 URL:

# awk '{print $3}' /var/log/squid/access.log | sort | uniq -c | sort -rn | head
# awk '{print $7}' /var/log/squid/access.log | sort | uniq -c | sort -rn | head

查看运行状态与缓存统计:

# squidclient -h 127.0.0.1 -p 3128 mgr:info
# tail -f /var/log/squid/cache.log       # 启动失败、回源异常等错误看这里

十二、排错

现象 排查思路
squid 启动失败 先 squid -k parse 查语法;看 /var/log/squid/cache.log;确认已安装 openssl;确认 visible_hostname 已配置或主机名可解析
提示 cache 目录错误 执行 squid -z 初始化;chown -R squid:squid /var/spool/squid
端口 80 被占用 反向代理占用 80,需先停掉本机 httpd/nginx:netstat -tnlp | grep :80
客户端访问 403 / TCP_DENIED ACL 顺序问题,限制规则要写在 http_access allow all 之前;确认源网段被放行
客户端无法连通代理端口 关闭 / 放行防火墙与 selinux:systemctl stop firewalld、setenforce 0;iptables -I INPUT -p tcp --dport 3128 -j ACCEPT
反向代理访问到的是 squid 默认错误页 检查 cache_peer 的后端 IP 与端口是否可达;检查 cache_peer_domain 中的域名是否与客户端访问的域名一致;/etc/hosts 或 DNS 是否解析到 squid
一直是 TCP_MISS,从不命中 检查后端 web 的时间是否与其他机器同步(时间偏差会导致缓存失效);检查响应头是否带 Cache-Control: no-cache、Pragma: no-cache;动态页面(带 ? 或 /cgi-bin/)默认不缓存;必要时用 refresh_pattern ... override-expire ignore-reload 调整
集群 sibling 不生效 确认双方都配置了 icp_port 3130、icp_access allow all,且 UDP 3130 端口互通
透明代理不生效 确认 http_port 带 transparent;确认客户端网关指向 squid;确认已开启 net.ipv4.ip_forward;检查 iptables -t nat -L -n 中的 REDIRECT 规则

十三、扩展项目

模拟 CDN:使用 squid + dns-view(智能 DNS 分区解析)实现,让不同地域的用户就近访问对应的 squid 缓存节点。

北京

成都    武汉    上海

广州
(网站源在深圳)

课后题目:上网查询并比较 squid、varnish、ats、nginx 等软件。


原有课后题目

动手练习

本章小结

一、代理类型对照表

类型 数据流向 客户端是否需要配置 典型用途
正向代理 客户端 → 代理 → 互联网服务器 需要,浏览器/程序里手工填代理地址与端口,或用 PAC 内网统一出网、上网行为管理与审计、访问控制与认证、节省带宽
反向代理 客户端 → 代理 → 内部源站 不需要,客户端以为代理就是网站本身 网站静态缓存加速、隐藏与保护源站、七层负载均衡、CDN 边缘节点
透明代理 客户端 → 网关(NAT 劫持) → 代理 → 互联网 不需要,由网关 iptables 强制重定向流量 网关型上网代理,避免逐台配置客户端;本质是"带缓存的 SNAT"

一句话记忆:正向代理代理客户端、反向代理代理服务器、透明代理是客户端无感的正向代理。

二、Squid 常用配置项速查表

配置项 用途
http_port 指定 Squid 监听端口;加 accel 为反向代理加速模式,加 intercept 为透明拦截模式
cache_dir 定义磁盘缓存目录、存储类型、容量上限及一级/二级子目录数量
cache_mem 指定用于存放热点对象的内存缓存大小
maximum_object_size 允许被缓存的单个对象最大体积,超过则不缓存
acl 定义访问控制列表元素(源 IP、域名、端口、时间、并发数等),供后续规则引用
http_access 基于 acl 允许或拒绝请求,自上而下匹配,末尾隐含 deny all
cache_peer 定义上级/同级缓存伙伴(parent/sibling),反向代理中用来指向后端源站
visible_hostname 设置对外显示的主机名,未设置时 Squid 可能因无法解析主机名而启动失败
access_log 指定访问日志路径与格式,是统计命中率与排错的主要依据
refresh_pattern 用正则匹配 URL,设定对象的最小/最大缓存时长与新鲜度百分比,直接决定命中率

三、Squid 常用命令速查表

命令 用途
squid -z 初始化(创建)cache_dir 中的缓存散列目录结构,首次配置或新增缓存目录后执行
squid -k parse 检查 squid.conf 语法,改完配置务必先跑一遍
squid -k reconfigure 不中断服务地重新加载配置
squid -k rotate 轮转日志文件,便于按周期归档与统计
squidclient mgr:info 查看运行状态、请求数、命中率、内存与磁盘缓存使用情况

四、排错口诀

  1. 改完配置先 squid -k parse 再 reload——语法错就重启会导致服务直接起不来,先校验再 squid -k reconfigure。
  2. 拒绝访问先看 acl 顺序与末尾的 deny all——http_access 自上而下、第一条命中即生效,deny 要写在对应 allow 之前;没被任何 allow 放行的请求都会撞上隐含的 deny all。
  3. 不命中先看响应头与 refresh_pattern——X-Cache: MISS 时依次检查源站的 Cache-Control、URL 是否带参数或 Cookie、maximum_object_size 是否过小、refresh_pattern 有没有覆盖该资源类型。
  4. 服务起不来先看 visible_hostname 与缓存目录权限——主机名无法解析、cache_dir 未 squid -z 初始化或属主不是 squid,都是最常见的启动失败原因。
  5. 代理链不通先在父代理上放行子代理 IP——父子代理场景中子代理报 403,几乎都是父代理没有为子代理的 IP 写 http_access allow。
  6. 一切现象最终回到日志——/var/log/squid/access.log 看结果码(TCP_DENIED/TCP_MISS/TCP_HIT),cache.log 看启动与运行错误。
最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏