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

背景

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

下载NJS模块

下载地址:

https://github.com/nginx/njs

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

tar -zxvf njs-0.7.3.tar.gz

编译安装Nginx

本文以宝塔为例,通过宝塔软件商店直接选择编译安装nginx

其中新模块配置:

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

⚠️ 注意

  • njs模块不需要编译,仅解压即可
  • 编译安装nginx时,需要勾选扩展模块!

验证安装是否成功

在Nginx安装目录下输入nginx -V即可以看到扩展模块是否安装成功

创建osssign.js文件

⚠️注意:

45行 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权限访问)