背景
oss文件設(shè)置了私有訪問,但是想在公網(wǎng)暴露出去定罢,通過nginx反向代理即可以實(shí)現(xiàn)不帶參數(shù)直接訪問
下載NJS模塊
下載地址:
下載完畢后上傳至服務(wù)器地址枕扫,解壓(本文以njs-0.7.3為例)
tar -zxvf njs-0.7.3.tar.gz
編譯安裝Nginx
本文以寶塔為例者疤,通過寶塔軟件商店直接選擇編譯安裝nginx
其中新模塊配置:
--add-module='你的njs地址/nginx'
?? 注意
- njs模塊不需要編譯史煎,僅解壓即可
- 編譯安裝nginx時(shí)阐枣,需要勾選擴(kuò)展模塊!
驗(yàn)證安裝是否成功
在Nginx安裝目錄下輸入nginx -V
即可以看到擴(kuò)展模塊是否安裝成功
創(chuàng)建osssign.js文件
??注意:
45行 r.uri.replace('files', 'upload')
需要替換為你的oss真實(shí)路徑稚机,files為nginx訪問路徑幕帆,upload為你的bucket路徑
上傳至服務(wù)器
創(chuàng)建待簽名字符串
此方法為簡化版,僅處理不帶url參數(shù)的oss資源地址赖条,其他情況可結(jié)合oss文檔 + ali-oss sdk 文件內(nèi)signUtil模塊內(nèi)的buildCanonicalString方法做修改
*/
function buildCanonicalString (method, resourcePath, date) {
var signContent = [method.toUpperCase(), '' , '', date, resourcePath]
return signContent.join('\n')
}
/* 計(jì)算簽名字符串 */
function computeSignature (accessKeySecret, canonicalString) {
var signature = require('crypto').createHmac('sha1', accessKeySecret.toUTF8())
return signature.update(canonicalString.toUTF8()).digest('base64')
}
/* 生成完整認(rèn)證字符串 */
function authorization (accessKeyId, accessKeySecret, canonicalString) {
return 'OSS ' + accessKeyId.toUTF8() + ':' + computeSignature(accessKeySecret, canonicalString)
}
/* oss簽名配置數(shù)據(jù)失乾,換成你自己的PAM賬號(hào)的AK和bucket */
var ossAccess = {
/* 示例:https://oss-cn-beijing.aliyuncs.com */
region: 'xxxxx',
accessKeyId: 'xxxxxx',
accessKeySecret: 'xxxxxx',
bucket: 'xxxx'
}
var GMTdate = '';
/* 返回oss header date字符串 */
function getGMTtime (r) {
/* 函數(shù)運(yùn)行在http環(huán)境,如果有多個(gè)server最好加上判斷條件來避免不必要的消耗 */
/* nginx 環(huán)境下 toUTCString 函數(shù)和標(biāo)準(zhǔn)有差異纬乍, 此處做轉(zhuǎn)換處理碱茁,后續(xù)njs版本升級(jí)后可能需要修改 */
var currentDate = new Date();
var currentDateUTCStr = currentDate.toUTCString();
var dateStrs = currentDateUTCStr.split(' ');
/* 這里需要改動(dòng)一下處理方式 */
var result = dateStrs[0] + ' ' + dateStrs[1] + ' ' + dateStrs[2] + ' ' + dateStrs[3] + ' ' + dateStrs[4] + ' GMT';
GMTdate = result;
return result;
}
/* 返回oss header authorization字符串 */
function ossSign (r) {
var method = r.method
//替換你的文件路徑
var uri = r.uri.replace('files', 'upload')
var canonicalString = buildCanonicalString(method, '/' + ossAccess.bucket + uri, getGMTtime())
return authorization(ossAccess.accessKeyId, ossAccess.accessKeySecret, canonicalString)
}
export default {getGMTtime, ossSign};
Nginx配置修改
http{
# ...
js_import /data/osssign.js;
# 定義簽名字符串和GMT時(shí)間字符串
js_set $ossDate osssign.getGMTtime;
js_set $ossAuth osssign.ossSign;
#...
location /files/ {
proxy_pass https://'你的region'/'你的bucket'/;
# 設(shè)置反向代理時(shí)請(qǐng)求header, 也是本方案核心內(nèi)容
proxy_set_header Date $ossDate;
proxy_set_header Authorization $ossAuth;
proxy_pass_header Date;
proxy_pass_header Authorization;
proxy_pass_request_headers on;
}
}
訪問 ip:port/file/你的文件名
即可以訪問私有oss文件,至此仿贬,大功告成纽竣!