有个给某大客户(游戏下载类)的特殊需求设计,因为文件大小差距很大——估计是大版本和补丁的区别——又走的是同一个域名,而squid在响应比较大的文件时,尤其是初次下载
注意: 最后是修改了nginx的src完成的功能。 其实可以使用http_perl_module完成的。而且还可以扩展302跳转的功能,把独立域名改成直接通过remote_addr定向到最近IP上。 以下内容仅限测试与学习使用。
首先,在nginx.conf中配置:
复制代码代码示例:
http {
perl_modules perl; perl_require SizeDiff.pm; server { listen 80; server_name dl.gamedomain.com; location / { perl SizeDiff::handler; } } }
然后,在perl/SizeDiff.pm文件中,如下:
复制代码代码示例:
package SizeDiff;
use Nginx::Simple; sub main { my $self = shift; my $webroot = '/www/dl.gamedomain.com/' return HTTP_NOT_ALLOWED unless $self->uri =~ m!^(/.+/)[^/]+$!; my $file = $webroot . $1 . $self->filename; my @filestat = stat($file) or return HTTP_NOT_FOUND; my $filesize = $filestat[7]; if ( $filesize < 8 * 1024 * 1024 ) { return OK; } else { $self->location('http://bigfile.cdndomain.com'.$self->uri); } }; 1
基本就是这样子,之前还考虑过如果不是push方式,可以在perl里考虑使用LWP获取header,不过仔细想想:
另一个可改进之处,就是self->location前面,可以结合Net::IP::Match::Regexp模块或者自己完成的类似功能,来针对self->remote_addr选择最近的服务器组IP,最后返回 闲来神笔,仅作参考,呵呵。 (责任编辑:IT) |