初学Squid的朋友可能会发现Squid并非万能的,有很多网站其无法逆向代理。例如逆向代理另一个经过Squid缓存的网站,或是一个绑定了主机头的虚拟主机。
例子:在Squid中将123.jstzsb.cn这个二级域名指定给
www.123.com这个网站(假设该网站经过了Squid缓存)
通常的配置
cache_peer
www.123.com parent 80 0 no-query originserver no-digest name=cache1
cache_peer_domain cache1 123.jstzsb.cn
这样配置用浏览器访问123.jstzsb.cn就会提示无法连接上级缓存服务器
这是为什么呢?让我们看一下
www.123.com的Squid配置
cache_peer 192.168.1.1 parent 80 0 no-query originserver no-digest name=cache1
cache_peer_domain cache1
www.123.com 问题出来了123.com的主机配置规则仅接受主机头为
www.123.com的连接请求
我们假设123.jstzsb.cn的主机为Squid_A,
www.123.com的主机为Squid_B,请看访问流程:
浏览器提交123.jstzsb.cn的请求->Squid_A接受到请求- >Squid_A对比规则成功开始将该请求提交给
www.123.com->Squid_B接受到来自Squid_A的一个请求其主机头为 123.jstzsb.cn->Squid_B对比发现无法匹配其cache_peer_domain中的规则->Squid_B放弃响应
难道就没有办法在Squid_A请求时将主机头信息替换成
www.123.com吗?答案是有。
只需在Squid_A上的cache_peer
www.123.com 80 0 no-query originserver no-digest name=cache1的最后加上forceddomain=www.123.com即可,这样Squid_B接受到的主机头信息就匹配其 cache_peer_domain中的规则了,逆向代理也自然能成功了。
forceddomain参数顾名思义是域名强制转换,这就能为我们做很多事,例如一个网站有很多域名。例如:
www.abc.com/www.abc.cn/www.abc.org 同时指向一个主机,如果不使用forceddomain参数Squid缓存里往往要缓存三个不同域名而内容相同的信息,这不仅降低了Squid的性能也影响其命中率。只要在配置parent的主机时添加forceddomain=www.abc.com参数,就能将所有其他域名的请求统一转为访问
www.abc.com forceddomain英文注释:
use 'forceddomain=name' to forcibly set the Host header
of requests forwarded to this peer. Useful in accelerator
setups where the server (peer) expects a certain domain
name and using redirectors to feed this domain name
is not feasible.