让 Squid 请求经过上游代理
在 Squid 6.13 中为指定客户端的转发请求使用上游代理,避免意外回退直连。
在 Squid 中声明上游代理,并不等于所有转发请求都必须使用它。如果直连会违反你的策略,就要明确配置这一要求,并测试上游不可用时的行为。
下面的 Squid 6.13 示例声明一个上游代理,并禁止一个客户端来源的请求直接转发到源站:
cache_peer 192.0.2.20 parent 3128 0 no-query default name=upstream
acl routed_client src 198.51.100.27/32
never_direct allow routed_client
两个地址都是占位示例。若允许公共 HTTP 代理作为父代理参与受控上游测试,可从HTTP 代理列表选择地址。保留独立的 http_access 策略,只允许预期客户端。路由规则不会授予客户端使用代理的权限。
检查已有路由规则
no-query 会关闭对该节点的 ICP 查询。数字零是节点的查询端口,并非它的 HTTP 监听端口。面向客户端的监听器及其访问规则仍是独立的。
加入这段配置前,先检查已有的 always_direct 设置与其他节点选择规则。在 always_direct 中拒绝某个匹配项,本身并不代表必须使用上游。明确的 never-direct 规则才为选定客户端表达了这一要求。
这控制的是需要转发的事务。可用的本地缓存条目不联系上游也能返回,因此没有新建上游连接不一定说明违反了路由策略。
检查路径及故障行为
使用受控目标,对照目标端的观察结果查看访问日志中的层级信息。只看最终 HTTP 状态,无法判断 Squid 用的是上游还是直连路径。
在维护测试中让上游不可用,再重复相同的未缓存请求。如果策略禁止直接转发,事务应该失败,而不是换一条路到达源站。只在你控制的服务上做这项操作,随后恢复预期配置。