前言
安裝nginx
#下載nginx 到 /software
tar xzvf nginx.tar.gz
#進入nginx 目錄
./configure
.make & make install
安裝nginx secure_link
./configure --with-http_secure_link_module \ --prefix=/usr/local/nginx --with-http_stub_status_module
#先安裝secure link 其實這個組件nginx本身就有,只不過是默認不安裝罷了
安裝其他nginx組件
#這裏我們隨意選擇一個組件
#選擇nginx-rtmp-module
#這裏看下nginx-rtmp-module官方提供的安裝方法
./configure --add-module=/path/to/nginx-rtmp-module
make
make install
#首先如果按照這種方式安裝後,你會發現nginx只有rtmp這個組件而剛剛安裝的secure_link被覆蓋了
#我們選擇一種非覆蓋的安裝方式
/usr/local/nginx/sbin/nginx -V
#查看nginx信息中注意 configure arguments:--with-http_secure_link_module --prefix=/usr/local/nginx/ --with-http_stub_status_module
#複製這條 --with-http_secure_link_module --prefix=/usr/local/nginx/ --with-http_stub_status_module
#下載nginx-rtmp-module到 /software
#進入/software/nginx目錄
./configure --with-http_secure_link_module --prefix=/usr/local/nginx/ --with-http_stub_status_module --add-module=/software/nginxrtmp/nginx-rtmp-module-master
#注意--add開始就是nginx-rtmp-module組件的安裝命令了
#--add-module=這裏是nginx-rtmp-module的文件目錄,下載組件後tar xzvf解壓後得到的目錄
make
#這裏make後就不要make install了 否則就又把 secure_link等已安裝的老組件覆蓋了
#繼續看下面
#因爲後面我們要覆蓋sbin/nginx文件,所以我們先把他備份出來
service nginx stop
#這裏我吧nginx做成服務了,如果你沒有做成服務 那麼用 sbin/nginx -s stop命令來停止nginx
cp /usr/local/nginx/sbin/nginx /usr/loca/nginx/sbin/nginx.back
#然後我們把make好的/software/nginx目錄下的文件拿出來覆蓋 sbin/nginx
pwd
#/software/nginx/nginx-1.12.0
cp ./objs/nginx /usr/local/nginx/sbin/nginx
service nginx start
#大功告成 ,再次執行 nginx -V
======================================================================
nginx version: nginx/1.12.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --with-http_secure_link_module --prefix=/usr/local/nginx/ --with-http_stub_status_module --add-module=/software/nginxrtmp/nginx-rtmp-module-master
Secoure_link在nginx中的設置
location / {
root /resource/video;
secure_link $arg_st,$arg_e;
#這裏配置了2個參數一個是st,一個是e
secure_link_md5 abc$uri$arg_e;
#st的哈希格式爲 secret+url+e,e爲時間戳單位s,url爲請求地址
#這裏我們的st是我們按照secure_link_md5的方式計算的哈希,secure_link會比對它計算的哈希值是否與我們的st參數一致
if ($secure_link = "") {
#資源不存在或哈希比對失敗
return 402;
}
if ($secure_link = "0") {
#時間戳過期
return 404;
}
if ($request_filename ~* ^.*?\.(mp4)$){
#直接下載防止打開文件 格式: (mp4|txt|jpg)
add_header Content-Disposition 'attachment;';
}
}
#設置402,404的跳轉
#在http節點
error_page 400 = 404.html; #跳轉400頁面
error_page 404 = http://www.baidu.com;#跳轉404頁面
好了到這裏我們看看訪問url的格式是什麼地址中st是根據時間戳以及文件名計算出來的,那麼我們用java做一個類來提供對它的計算
JAVA計算防盜鏈地址
/**
* 防盜鏈資源下載地址
*
* @author Allen 2017年6月5日
*
*/
public class SourceDownloadPath {
static Logger logger = Logger.getLogger(SourceDownloadPath.class);
/** class Constant **/
final static String HTTP = "http://";
final static String ST = "?st=";
final static String E = "&e=";
final static String F = "/";
final static String WARN = "path參數最好帶上 \"/\" ,例: \"/abc.mp4\" ";
public static String execute(String path) {
if (path.indexOf(F) == -1) {
path = StringUtils.append(F,path);
logger.warn(WARN);
}
String time = String.valueOf(System.currentTimeMillis() / 1000 + Long.valueOf(Conf.VIDEO_DOWNLOAD_INVALID));
// +n代表n秒後地址失效
String md5 = Base64
.encodeBase64URLSafeString(DigestUtils.md5(StringUtils.append(Conf.VIDEO_DOWNLOAD_SECRET, path, time)));
return StringUtils.append(HTTP, Conf.SERVER_IP, path, ST, md5, E, time);
}
public static void main(String[] args) {
System.out.println(execute("abc.mp4"));
}
}
#執行結果
[WARN ] 2017-06-07 16:12:14(0)
--> [main] com.api.util.SourceDownloadPath.execute(SourceDownloadPath.java:27): path參數最好帶上 "/" ,例: "/abc.mp4"
http://127.0.0.1/abc.mp4?st=s-UPx9up2DH_MpVse4vT-w&e=1496823314
public class StringUtils {
public static String append(String... params) {
return Arrays.asList(params).stream().collect(Collectors.joining());
}
}