技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Apache --> 在 Cache 中的url_rewrite和storeurl_rewrite

在 Cache 中的url_rewrite和storeurl_rewrite

浏览:2342次  出处信息

我们之所以认为 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 是可以见到重写的过程的

建议继续学习:

  1. 使用Squid缓存视频    (阅读:9186)
  2. 系统架构的一些思考    (阅读:5626)
  3. [调优] Squid 不同版本的性能对比    (阅读:4224)
  4. [squid] 过期时间在 60 秒内 squid 不 Cache 的问题    (阅读:3987)
  5. Squid 限制用户并发连接数    (阅读:3961)
  6. [Squid] TCP_MEM_HIT 和 TCP_HIT 的性能到底相差多远    (阅读:3660)
  7. squid缓存失效之谜:一步步提高squid缓存命中率办法记录    (阅读:3529)
  8. 加速WEB访问:使用DNSmasq与squid代理并过滤广告    (阅读:3351)
  9. squid对源网站进行限速    (阅读:3158)
  10. Squid 透明代理优化    (阅读:2710)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1