背景
oss文件设置了私有访问,但是想在公网暴露出去,通过nginx反向代理即可以实现不带参数直接访问
下载NJS模块
下载地址:
下载完毕后上传至服务器地址,解压(本文以njs-0.7.3为例)
tar -zxvf njs-0.7.3.tar.gz</pre>
编译安装Nginx
本文以宝塔为例,通过宝塔软件商店直接选择编译安装nginx
[图片上传失败...(image-8dce2d-1655347557262)]
其中新模块配置:
--add-module='你的njs地址/nginx'
image.png
⚠️ 注意
- njs模块不需要编译,仅解压即可
- 编译安装nginx时,需要勾选扩展模块!
验证安装是否成功
在Nginx安装目录下输入nginx -V
即可以看到扩展模块是否安装成功
创建osssign.js文件
⚠️注意:
47行 r.uri.replace('files', 'upload')
需要替换为你的oss真实路径,files为nginx访问路径,upload为你的bucket路径
上传至服务器
创建待签名字符串
此方法为简化版,仅处理不带url参数的oss资源地址,其他情况可结合oss文档 + ali-oss sdk 文件内signUtil模块内的buildCanonicalString方法做修改
*/
function buildCanonicalString (method, resourcePath, date) {
var signContent = [method.toUpperCase(), '' , '', date, resourcePath]
return signContent.join('\n')
}
/* 计算签名字符串 */
function computeSignature (accessKeySecret, canonicalString) {
var signature = require('crypto').createHmac('sha1', accessKeySecret.toUTF8())
return signature.update(canonicalString.toUTF8()).digest('base64')
}
/* 生成完整认证字符串 */
function authorization (accessKeyId, accessKeySecret, canonicalString) {
return 'OSS ' + accessKeyId.toUTF8() + ':' + computeSignature(accessKeySecret, canonicalString)
}
/* oss签名配置数据,换成你自己的PAM账号的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) {
/* 函数运行在http环境,如果有多个server最好加上判断条件来避免不必要的消耗 */
/* nginx 环境下 toUTCString 函数和标准有差异, 此处做转换处理,后续njs版本升级后可能需要修改 */
var currentDate = new Date();
var currentDateUTCStr = currentDate.toUTCString();
var dateStrs = currentDateUTCStr.split(' ');
/* 这里需要改动一下处理方式 */
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时间字符串
js_set $ossDate osssign.getGMTtime;
js_set $ossAuth osssign.ossSign;
#...
location /files/ {
proxy_pass https://'你的region'/'你的bucket'/;
# 设置反向代理时请求header, 也是本方案核心内容
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文件,至此,大功告成!
网友评论