2013-08-21 3 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