背景
oss文件设置了私有访问,但是想在公网暴露出去,通过nginx反向代理即可以实现不带参数直接访问
下载NJS模块
下载地址:
下载完毕后上传至服务器地址,解压(本文以njs-0.7.3为例)
tar -zxvf njs-0.7.3.tar.gz
编译安装Nginx
本文以宝塔为例,通过宝塔软件商店直接选择编译安装nginx
其中新模块配置:
--add-module='你的njs地址/nginx'
:::warning
⚠️ 注意
- njs模块不需要编译,仅解压即可
- 编译安装nginx时,需要勾选扩展模块!
:::
验证安装是否成功
在Nginx安装目录下输入nginx -V即可以看到扩展模块是否安装成功创建osssign.js文件
:::warning ⚠️注意:
47行r.uri.replace('files', 'upload')需要替换为你的oss真实路径,files为nginx访问路径,upload为你的bucket路径 ::: 上传至服务器 ```javascript / 创建待签名字符串 此方法为简化版,仅处理不带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};
<a name="DcORs"></a># Nginx配置修改```nginxhttp{# ...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;}}
:::success
访问 ip:port/file/你的文件名即可以访问私有oss文件,至此,大功告成!
:::
