第一部分 代理服务概述
一、什么是代理
代理服务器(Proxy Server)位于客户端与真实服务器之间,代替客户端向服务器发起请求,或代替服务器接收客户端的请求。由于所有流量都经过代理,代理天然具备缓存、过滤、审计、地址转换的能力。
二、正向代理与反向代理的区别
| 对比项 | 正向代理 | 反向代理 |
|---|---|---|
| 代理对象 | 代理客户端 | 代理服务器 |
| 部署位置 | 靠近客户端(内网出口) | 靠近服务器(网站最前端) |
| 客户端是否知情 | 客户端需显式配置代理(透明代理除外) | 客户端完全不知情,以为直接访问的就是网站 |
| 服务器是否知情 | 服务器只看到代理的 IP,不知道真实客户端 | 服务器(后端 web)知道请求来自代理 |
| 典型作用 | 内网上网、访问控制、上网行为管理、共享带宽与缓存 | 静态页面缓存加速、负载均衡、隐藏后端架构、CDN 节点 |
| 类比 | 有缓存的 SNAT(源地址转换) | 有缓存的 DNAT(目的地址转换) |
Squid 的两种角色正好对应这两类代理:
- 代理上网(正向代理、透明代理):简单看作有缓存的 SNAT。
- 网站静态页面缓存加速(反向代理):简单看作有缓存的 DNAT。
三、透明代理
透明代理属于正向代理的一种特殊实现:
- 客户端不需要在浏览器或系统中配置任何代理参数;
- 由网关(通常就是 Squid 所在的 Linux 路由器)用
iptables把出站的 80 端口流量强制重定向(REDIRECT / DNAT)到 Squid 的监听端口; - 客户端"感觉不到"代理存在,因此称为透明(transparent / intercept)。
透明代理常用于企业内网强制上网审计与缓存,避免逐台客户端配置代理的麻烦。
四、代理的作用
- 缓存加速:把命中率高的静态资源(图片、CSS、JS、静态 HTML)缓存到代理本地磁盘或内存,下次请求直接由代理返回,节省带宽、降低后端压力、缩短响应时间。
- 访问控制:通过 ACL 按源 IP、时间段、目标域名、URL 关键字、请求方法等维度允许或拒绝访问,实现上网行为管理。
- 隐藏客户端 / 隐藏服务端:正向代理隐藏真实客户端 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为外网客户端(用宿主机模拟,需改变宿主机配置)。
工作流程:
- client 发起请求(假设为一张图片)。
- squid 接收请求,在缓存中查找 client 请求是否存在。
- 如果 cache hit,直接返回结果给 client。
- 如果 cache miss,把请求转给后台 web。
- web 把结果返回给 squid,再返回给 client。
- 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 准备过程
- 主机名绑定:
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
- IP 静态。
- 关闭防火墙、selinux。
- 时间同步。
- 使用系统默认的 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 |
查看运行状态、请求数、命中率、内存与磁盘缓存使用情况 |
四、排错口诀
- 改完配置先
squid -k parse再 reload——语法错就重启会导致服务直接起不来,先校验再squid -k reconfigure。 - 拒绝访问先看 acl 顺序与末尾的 deny all——
http_access自上而下、第一条命中即生效,deny要写在对应allow之前;没被任何 allow 放行的请求都会撞上隐含的deny all。 - 不命中先看响应头与
refresh_pattern——X-Cache: MISS时依次检查源站的Cache-Control、URL 是否带参数或 Cookie、maximum_object_size是否过小、refresh_pattern有没有覆盖该资源类型。 - 服务起不来先看
visible_hostname与缓存目录权限——主机名无法解析、cache_dir未squid -z初始化或属主不是squid,都是最常见的启动失败原因。 - 代理链不通先在父代理上放行子代理 IP——父子代理场景中子代理报 403,几乎都是父代理没有为子代理的 IP 写
http_access allow。 - 一切现象最终回到日志——
/var/log/squid/access.log看结果码(TCP_DENIED/TCP_MISS/TCP_HIT),cache.log看启动与运行错误。
此处评论已关闭