下載服務器時常被人盜鏈,時間久了導致服務器大量資源浪費,由于服務器使用nginx做為web服務器。nginx的防盜鏈方法有很多,可以使用現成的防盜鏈模塊nginx-accesskey-2.0.3,編譯ningx時添加此模塊即可。
由于服務其他業務需要,所以nginx編譯了lua模塊,所以就想通過lua來實現下載服務器的防盜鏈功能(通過lua的Nginx模塊lua_nginx_module、這里不再詳細介紹配置過程),這樣就可以免去了accesskey模塊。原理就是生成經過處理過的下載鏈接,然后下載服務器在處理這個下載鏈接,成功則下載,失敗則阻止。下面就是詳細的配置實例:
一、在下載頁面生成鏈接的nginx配置
download.vevb.com的配置:
server { listen 80; server_name download.vevb.com; index index.htm index.html; root /data/www/download; ssi on; location / { set_by_lua $downkey ' return ngx.md5("encryption" .. ngx.var.remote_addr .. "suffix") '; } }
注意:要開啟ssi才能在html頁面中獲取nginx自定義變量downkey,這樣才能生成經過處理的url,其中字符串encryption和suffix為自定義的,可隨便改其他字符,目的是為了生成別人不容易猜解的串。
測試index.html代碼:
二、下載服務器nginx配置:
server { listen 80; server_name down.vevb.com; index index.htm index.html; root /data/www/down; limit_conn one 1; set $limit_rate 1000k; location / { set_by_lua $foo ' if string.sub(ngx.var.uri, 2, 33) == ngx.md5("encryption" .. ngx.var.remote_addr .. "suffix") then return 1 else return 0 end '; if ($foo = 1) { rewrite "^/([0-9a-z]{32})(.*?)$" $2 break; } if ($foo = 0) { rewrite ^/ http://download.vevb.com/404.htm redirect; } } }
這樣把鏈接復制給另外一臺機器后,就會打開提示錯誤頁面。