在 Cache 中的url_rewrite和storeurl_rewrite
我们之所以认为 Squid 功能强大,除了本身的功能强大外,还有一些可以扩展的地方,比如 url_rewrite, storeurl_rewrite 和 external_acl_type 这几个,相当爽,很方便扩展。以前我也用这个帮朋友做过几个小功能。下面分享一下我以前有关这些的资料。
我们使用 url_rewrite ,一定要深入的了解 url_rewrite 工作在什么地方,在 Squid 中,这种东西又叫重定向器,他可以引用 squid 的外部程序,它重写来自客户请求的URI 。一定记的,是来源用户的 URL. 这时,客户其实在浏览器上的 url 是不会变化的。只是在回到源网站时,会对客户提交过来的 url 根据一些条件。来做改变。
在 storeurl_rewrite 中,和 url_rewrite 刚好相反。他是重写的来自源网站的 url ,是文件回源网站后取了文件,给取得的 url 修改成什么样子来存储。
以上的这些扩展,都工作在 Squid 内部的 ACL 之后,然后在回源网站之前, ACL 检查到要进行 redirect 的部分的内容后送给这个程序,在进行相应动作。
另外,在使用 url_rewrite 我们还可以修改响应,比如在输出 url 之前,给出 301,201 的响应时,浏览器就会得到跳转到新网站。比如 print 301:$url.
这个可以应用的地方非常多,比如来源网站和存的网站不一样,比如防盗链,比如图象网站中的 img1,img2,之类不同的域名合并成同一个域名,都是很容易实现的。
参考资料,可以看看 Squid中文权威指南 第11章 重定向器。
下面一个小例子,我做随机回源,应用的场景是。当我有一个网站,我有一些文件,是存在不同的 ip 上,没有一个地址可以取全。所以当一个请的请求过来时,我需要查询,这个 url 是存在那个 IP 上的。这时就能用到。
比如我有一个文件 php-oa.dat ,内容如下
http://1.1.1.1/example.iso http://1.1.1.2/example2.iso http://1.1.1.3/example3.iso
我用来实现这个功能的 Squid 配置如下
acl phpoa_domain dstdomain www.php-oa.com url_rewrite_program /usr/local/squid/bin/redirect.pl url_rewrite_children 5 url_rewrite_host_header on redirector_bypass off # 如果这个子扩展处理不过来,是否直接透传 url_rewrite_access allow phpoa_domain
这是配置调用的脚本
#!/usr/bin/perl use strict; use Digest::MD5; $|=1; my %url_to_ip; my $md5 = Digest::MD5->new(); open my $file, "<php-oa.dat" or die "不能打开文件\n"; while(<$file>){ chomp; # 存成 md5 文件内容会更加小,对长 url 会非常有用。 if ( $_ =~ /^http:\/\/([^ ]+)\/([^ ]+)/ ){ my $url_md5 = $md5->add($2)->hexdigest; $url_to_ip{$url_md5} = $1; } } close $file; while(<>){ chomp; my ($url, $remote_host, $ident, $method, $urlgroup) = split; if ( $url =~ /^http:\/\/www.php-oa.com\/([^ ]+)/ ){ my $url_md5 = $md5->add($1)->hexdigest; #使用 hash 来查询,性能会更加高 print 'http://' . $url_to_ip{$url_md5}. '/' . $1 . "\n"; } else { print "$url\n"; } }
注意,在这个地方, Squid 和这个定向器通信,是使用的管道,对定向器通信来讲,就是一个进和一个出的关系。Squid 每次提交给 redirect_proram的流格式为 URL IP/FQDN IDENT METHOD 中。当我们进行 Rewrite 处理时,也就是对这四个字段进行处理。
好了,上面处理完了,能正确的回源了。但是存出来,不能用有 ip 的 url 来存文件的路径吧,因为 url 是 squid 中的关系 key 来查找文件的。所以还得转换 ip 到域名,在转回来。下面我们这时就用到了 storeurl_rewrite 。
在 Squid 中配置如下,来调用 storeurl_rewrite.
acl phpoa_ip url_regex ^http://[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/.* storeurl_rewrite_program /usr/local/squid/bin/storeurl_phpoa.pl storeurl_rewrite_children 30 storeurl_rewrite_concurrency 5 storeurl_access allow phpoa_ip
转换回来的程序
#!/usr/bin/perl use strict; $|=1; while (<>){ if(/http:\/\/[^\/]+\/(\S.*)/){ my $path = $1; print "0 http://www.php-oa.com/$path\n"; } else { print $_;} }
我上面的方便,都是参考用的例子,上在这个例子中,其实有个重大的 Squid 本身的 BUG 会影响他。需要多注意。现在我们使用了这些功能,我们怎么知道配置启动的子进程是不是合适。这个就要用到 squidclient ,这个可以很方便的查询到每个子进程被查到,我们要尽力保证前面的子进程处理完所有的请求,如果处理不完,就会堆到后面来。当我们发现大量的响应堆到后面的子进程时,就得考虑增加子进程了。
squidclient -p 80 mgr:url_rewrite
squidclient -p 80 mgr:storeurl_rewrite
会输出象下面这种来
# FD PID # Requests Flags Time Offset Request
1 10 35200 46 AB 0.902 0 http://…
2 11 35201 29 AB 0.401 0 http://…
3 12 35202 25 AB 1.009 1 cache_o…
4 14 35203 25 AB 0.555 0 http://…
5 15 35204 21 AB 0.222 0 http://…
使用 Squid 的 debug 的功能配置 debug_options 33,3 是可以见到重写的过程的
建议继续学习:
- 使用Squid缓存视频 (阅读:9186)
- 系统架构的一些思考 (阅读:5626)
- [调优] Squid 不同版本的性能对比 (阅读:4224)
- [squid] 过期时间在 60 秒内 squid 不 Cache 的问题 (阅读:3987)
- Squid 限制用户并发连接数 (阅读:3961)
- [Squid] TCP_MEM_HIT 和 TCP_HIT 的性能到底相差多远 (阅读:3660)
- squid缓存失效之谜:一步步提高squid缓存命中率办法记录 (阅读:3529)
- 加速WEB访问:使用DNSmasq与squid代理并过滤广告 (阅读:3351)
- squid对源网站进行限速 (阅读:3158)
- Squid 透明代理优化 (阅读:2710)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:扶凯 来源: 扶凯
- 标签: Squid storeurl_rewrite url_rewrite
- 发布时间:2011-02-09 00:18:45
- [41] 界面设计速成
- [35] Oracle MTS模式下 进程地址与会话信
- [33] 如何拿下简短的域名
- [32] IOS安全–浅谈关于IOS加固的几种方法
- [32] 程序员技术练级攻略
- [32] 视觉调整-设计师 vs. 逻辑
- [31] 图书馆的世界纪录
- [30] 【社会化设计】自我(self)部分――欢迎区
- [30] android 开发入门
- [27] 读书笔记-壹百度:百度十年千倍的29条法则