背景

oss文件设置了私有访问,但是想在公网暴露出去,通过nginx反向代理即可以实现不带参数直接访问

下载NJS模块

下载地址:
下载完毕后上传至服务器地址,解压(本文以njs-0.7.3为例)

  1. tar -zxvf njs-0.7.3.tar.gz

编译安装Nginx

本文以宝塔为例,通过宝塔软件商店直接选择编译安装nginx
image.png
其中新模块配置:

  1. --add-module='你的njs地址/nginx'

image.png :::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};

  1. <a name="DcORs"></a>
  2. # Nginx配置修改
  3. ```nginx
  4. http{
  5. # ...
  6. js_import /data/osssign.js;
  7. # 定义签名字符串和GMT时间字符串
  8. js_set $ossDate osssign.getGMTtime;
  9. js_set $ossAuth osssign.ossSign;
  10. #...
  11. location /files/ {
  12. proxy_pass https://'你的region'/'你的bucket'/;
  13. # 设置反向代理时请求header, 也是本方案核心内容
  14. proxy_set_header Date $ossDate;
  15. proxy_set_header Authorization $ossAuth;
  16. proxy_pass_header Date;
  17. proxy_pass_header Authorization;
  18. proxy_pass_request_headers on;
  19. }
  20. }

:::success 访问 ip:port/file/你的文件名即可以访问私有oss文件,至此,大功告成! :::