美文网首页
Nginx反向代理OSS实现private权限访问

Nginx反向代理OSS实现private权限访问

作者: 不二不二熊 | 来源:发表于2022-06-16 10:48 被阅读0次

    背景

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

    下载NJS模块

    下载地址:

    https://github.com/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文件,至此,大功告成!

    相关文章

      网友评论

          本文标题:Nginx反向代理OSS实现private权限访问

          本文链接:https://www.haomeiwen.com/subject/qltqvrtx.html