2013-08-21 60 views
1

我有一個網站,文件共享是在Perl中,現在有文件index.dl用於下載請求。在Apache中它創建了一個非常高的負載,負載幾乎在100.我如何使用Apache上傳和Nginx的安全下載

現在我不能使用nginx代理。

我想設置apache來處理所有的上傳,而nginx來處理下載請求。

我檢查過有一個模塊「http-secure-link-module」,所以我也安裝了這個模塊。

現在我們的網站產生像

xyz.com/d/$hash/filename.xyz文件下載鏈接

現在這是生成的鏈接代碼

sub genDirectLink 
{ 
    my ($file,$mode,$mins,$fname)[email protected]_; 
    require HCE_MD5; 
    my $hce = HCE_MD5->new($c->{dl_key},"mysecret"); 
    my $usr_id = $ses->getUser ? $ses->getUserId : 0; 
    my $dx = sprintf("%d",($file->{file_real_id}||$file->{file_id})/$c->{files_per_folder}); 
    my $hash = &encode32($hce->hce_block_encrypt(pack("SLLSA12ASC4L", 
                 $file->{srv_id}, 
                 $file->{file_id}, 
                 $usr_id, 
                 $dx, 
                 $file->{file_real}, 
                 $mode||'f', 
                 $c->{down_speed}, 
                 split(/\./,$ses->getIP), 
                 time+60*$mins))); 
    #$file->{file_name}=~s/%/%25/g; 
    #$file->{srv_htdocs_url}=~s/\/files//; 
    my ($url) = $file->{srv_htdocs_url}=~/(http:\/\/.+?)\//i; 
    $fname||=$file->{file_name}; 
    return "$url:182/d/$hash/$fname"; 
} 

sub encode32 
{   
    $_=shift; 
    my($l,$e); 
    $_=unpack('B*',$_); 
    s/(.....)/000$1/g; 
    $l=length; 
    if($l & 7) 
    { 
     $e=substr($_,$l & ~7); 
     $_=substr($_,0,$l & ~7); 
     $_.="000$e" . '0' x (5-length $e); 
    } 
    $_=pack('B*', $_); 
    tr|\0-\37|A-Z2-7|; 
    lc($_); 
} 

和我有我的設置配置nginx的作爲

server { 
    listen 182; 
    server_name myhost.com www.myhost.com; 

    location/{ 
     root /home/user/domains/hostname.com/public_html/files; 
    } 

    location /d/ { 
     secure_link_secret mysecret; 

     if ($secure_link = "") { 
      return 403; 
     } 
     rewrite^/files/$secure_link; 
    } 

    location /files/ { 
     internal; 
    } 
} 

所以現在的問題是,當我試圖訪問任何鏈接時,它會給出404錯誤。 我如何獲得文件下載工作?

回答

0

這個指令secure_link_secret,已被棄用的nginx 0.8.50,請參閱:http://wiki.nginx.org/HttpSecureLinkModule

我做了使用正確的指令代碼:

server { 
    listen 182; 
    server_name example.com; 

    location/{ 
     root /home/fileshare/domains/fileshare4u.com/public_html/files; 
    } 

    location ~^/d/(?P<hash>[^\/]+)/(?P<url>.*)$ { 
     secure_link $hash,$arg_e; 
     secure_link_md5 KEY$url$arg_e; 

     if ($secure_link = "") { 
      return 403; 
     } 
    if ($secure_link = "0") { 
      return 403; 
    } 

    rewrite^/files/$url last; 
    } 

    location /files/ { 
     alias /tmp/; 
     internal; 
    } 
} 

Perl中的哈希生成:

use Digest::MD5 qw(md5 md5_hex md5_base64); 
# http://search.cpan.org/~kazuho/MIME-Base64-URLSafe-0.01/lib/MIME/Base64/URLSafe.pm 
use MIME::Base64::URLSafe; 
$uri = "sitemap_artistas_1.xml.gz"; # FILE NAME 
$key = "KEY"; # KEY 
$expire = time() + 30; # 30s 
$hash = urlsafe_b64encode(md5("$key$uri$expire")); 
$domain = "example.com"; 
$port = "182"; 
return "http://$domain:$port/d/$hash/$uri?e=$expire"; 
+0

嗨,我已經更新了配置,現在它給了403錯誤。我安裝了nginx 1.4。 – niraj