1、此文章主要介绍内容

本文主要介绍怎样利用Nginx lua 实现将阿里云OSS存储空间做到同本地磁盘一样使用。核心是利用Nginx lua 对OSS请求进行签名并利用内部跳转将全部訪问本地Nginx的请求加上OSS 签名转发给OSS,实现本地Nginx无缝衔接阿里云OSS,存储空间无限扩展,存储成本无限下降,数据安全%99.99…… 。

2、本篇文章使用到的一些工具技术及怎样学习和获取

1、lua

本文用到的都是一些主要的lua,基本上花半小时阅读下lua的语法就能够轻松理解本文内容

2、Nginx lua

主要是学习nginx lua 及环境部署,只是阅读本文还不须要亲自己主动手去学习及部署nginx lua 环境。读者能够从docker 官方镜像源pull openresty 镜像进行实验。本文已openresty/1.7.7.2 作为实验环境。

3、阿里云OSS

赶紧开通吧,用起来相当爽。一处存储全球无限制訪问
https://www.aliyun.com/act/aliyun/ossdoc.html

4、參考博客

建议阅读我的另外一篇博客。对深入理解OSS 及互联网上提供的HTTP服务有更深刻的理解
http://blog.csdn.net/sunrain_chy/article/details/50804410

3、利用Nginx lua 实现请求签名并转发至OSS

Lua 签名 code
注:此代码并不是出自作者之手
oss_auth.lua


-- has been sorted in alphabetical order
local signed_subresources = {'acl','append','bucketInfo','cname','commitTransition','comp','cors','delete','lifecycle','location','logging','mime','notification','objectInfo','objectMeta','partData','partInfo','partNumber','policy','position','referer','replication','replicationLocation','replicationProgress','requestPayment','response-cache-control','response-content-disposition','response-content-encoding','response-content-language','response-content-type','response-expires','restore','security-token','tagging','torrent','uploadId','uploads','versionId','versioning','versions','website'
}function string.startswith(s, start)return string.sub(s, 1, string.len(start)) == start
endlocal function get_canon_sub_resource()local args = ngx.req.get_uri_args()-- lower keyslocal keys = {}for k, v in pairs(args) dokeys[k:lower()] = vend-- make resource stringlocal s = ''local sep = '?'for i, k in ipairs(signed_subresources) dov = keys[k]if v then-- sub tablev = type(v) == 'table' and v[1] or vs = s .. string.format("%s%s=%s", sep, k, v)sep = '&'endendreturn s
endlocal function get_canon_resource()resource = ''object = ngx.unescape_uri(ngx.var.uri)sub = get_canon_sub_resource()   return string.format("/%s%s%s", ngx.var.oss_bucket, object, sub)
end   local function get_canon_headers()-- default: <lowerkey, value>local headers = ngx.req.get_headers()local keys = {}for k, v in pairs(headers) doif string.startswith(k, 'x-oss-') then-- client must assemble the same header keysif type(v) ~= 'string' then return nil endtable.insert(keys, k)endend-- sorted in alphabetical ordertable.sort(keys)for i, key in ipairs(keys) dokeys[i] = key .. ':' .. headers[key] .. '\n'endreturn table.concat(keys)
endlocal function calc_sign(key, method, md5, type_, date, oss_headers, resource)-- string_to_sign:-- method + '\n' + content_md5 + '\n' + content_type + '\n'-- + date + '\n' + canonicalized_oss_headers + canonicalized_resourcelocal sign_str = string.format('%s\n%s\n%s\n%s\n%s%s',method, md5, type_,date, oss_headers, resource)ngx.log(ngx.ERR, "SignStr:", sign_str, "\n")local sign_result = ngx.encode_base64(ngx.hmac_sha1(key, sign_str))return sign_result, sign_str
end   local function oss_auth()-- ngx.log(ngx.INFO, 'auth')--local method = ngx.var.request_methodlocal method = ngx.req.get_method()local content_md5 = ngx.var.http_content_md5 or ''local content_type = ngx.var.http_content_type or ''-- get datelocal date = ngx.var.http_x_oss_date or ngx.var.http_date or ''if date == '' thendate = ngx.http_time(ngx.time())-- ngx.log(ngx.INFO, 'Date:', date)ngx.req.set_header('Date', date)endlocal resource = get_canon_resource()local canon_headers = get_canon_headers()local sign_result, sign_str = calc_sign(ngx.var.oss_auth_key, method, content_md5,content_type, date, canon_headers, resource)-- ngx.log(ngx.INFO, 'sign string:', sign_str)-- ngx.log(ngx.INFO, 'sign string len:', string.len(sign_str))local auth = string.format("OSS %s:%s", ngx.var.oss_auth_id, sign_result)ngx.req.set_header('Authorization', auth)ngx.exec("@oss")
end   -- main
res = oss_auth()if res thenngx.exit(res)
end

nginx.conf

  server {listen 8000;proxy_http_version 1.1;proxy_buffering off;proxy_request_buffering off;location / {set $oss_bucket "your_oss_bucket";set $oss_auth_id "your_access_id";set $oss_auth_key "your_access_key";rewrite_by_lua_file "/path/oss_auth.lua";}# internal redirectlocation @oss {// endpoint eg: oss.aliyuncs.comproxy_pass http://your_oss_bucket.endpoint; }}

4、怎样使用上述代码

首先oss_auth.lua 无需做不论什么修改

nginx.conf 中须要将
your_oss_bucket 替换为阿里云OSS 的bucket名
your_access_id替换未AccessKeyId
your_access_key 替换为 AccessKeySecret

比如:

error_log  logs/error.log  debug;
events {worker_connections  1024;
}
http {include       mime.types;lua_package_path "/usr/servers/lualib/?.lua;";lua_package_cpath "/usr/servers/lualib/?.so;"; server {listen       80;location / {set $oss_bucket "bucket-example";set $oss_auth_id "za2127hbbsdhjal0ytocbzr";set $oss_auth_key "gMOG3o+HJdsgdHdpieCNMcsaH+Q=";rewrite_by_lua_file conf/lua/oss_auth.lua;}location @oss {proxy_pass http://bucket-example.oss-cn-qingdao.aliyuncs.com;}}
}

转载于:https://www.cnblogs.com/yangykaifa/p/7283085.html

Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)相关推荐

  1. 第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss

    文章目录 5.4 接口开发-根据id删除附件 5.4.1 接口文档 5.4.2 代码实现 5.4.3 接口测试 5.4.4 测试ALI和FAST_DFS以及MINIO上传和删除的接口 5.4.4.1 ...

  2. java oss 批量传输_阿里云OSS对象存储,服务端签名后直传阿里云OSS

    继续上一章文章,这次要操作的是,浏览器请求服务要到签名后直传给OSS对象存储. 1.写好服务端的方法,传给前台相应的密钥 @Resource OSSClient ossClient; @Value(& ...

  3. oss子账号_阿里云OSS子账号RAM权限设置方法

    怕oss管理人员误操作把oss里面的Bucket删除怎么办?创建阿里云子账号即可.这里说下阿里云OSS子账号RAM权限设置方法. 最新更新:阿里云RAM权限生成工具 首先进入阿里云后台设置子账号的页面 ...

  4. php 文件上传至OSS及删除远程阿里云OSS文件

    PHP demo 删除的时候记住不要带域名,也不要带'/'这个路径符号,如全路径是:'https://hxty.oss-cn-beijing.aliyuncs.com/data/pdf/contrac ...

  5. 阿里云 nginx php mysql_阿里云 Ubuntu + Nginx + PHP + MySQL

    最近在阿里云上配置服务器,踩了不少坑,记录一下,希望能帮助到有同样需求的朋友们. 整个配置过程基本上是按照下面这篇帖子进行的,写的非常清楚,按照步骤一步一步来就行了.Installing Nginx, ...

  6. Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)

    转载. 1.此文章主要介绍内容 本文主要介绍如何利用Nginx lua 实现将阿里云OSS存储空间做到同本地磁盘一样使用.核心是利用Nginx lua 对OSS请求进行签名并利用内部跳转将所有访问本地 ...

  7. 【24-业务开发-基础业务-品牌管理-图片管理-阿里云OSS服务开通和使用-阿里云OSS服务API使用-SpringCloudAlibaba OSS服务的使用】

    一.知识回顾 [0.三高商城系统的专题专栏都帮你整理好了,请点击这里!] [1-系统架构演进过程] [2-微服务系统架构需求] [3-高性能.高并发.高可用的三高商城系统项目介绍] [4-Linux云 ...

  8. 【云计算的1024种玩法】轻松将其他云的对象储存迁移至阿里云OSS

    前言 当使用了像 OSS.S3 这样的开放对象储存的 PaaS 产品后,一面上体验到了网站核心同附件库分离的安全性.高性能以及免维护的便利性,一面上却又怕在一个厂家的对象储存上扎根了就无法迁移,会被厂 ...

  9. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...

最新文章

  1. python零基础入门大数据_【资源分享】零基础入门大数据(数据分析)经验分享...
  2. Spring boot自动配置模式
  3. OpenFoam2.4.0 cannot find input file: `contrib/dist/mofed/debian/changelog解决方案
  4. Hive分析函数--row_number 的用法
  5. 在GridView的行绑定中应用Animation动画效果
  6. 如何构建NLP Pipeline,各模块代码实现细节全在这里!
  7. Linux链表list_head/hlist_head/hlist_nulls_head的并发性
  8. 猎隼涉密计算机安全,[原创]如何干掉《“猎隼”涉密计算机上网监察取证系统》...
  9. 手把手教你实现自己的预设滤镜
  10. Linux中 查看mysql配置文件位置
  11. 尚硅谷Vue2.0+Vue3.0全套教程视频笔记 + 代码 [P051-100]
  12. 计算机网课课堂评价语,网络授课如何“高效”评价学生作业(附实用评语)
  13. 男朋友智商测试大集结(一):Oracle数据库查询操作练习81题(附答案)
  14. 如何用计算机进行绘画,怎么用电脑画画-PS电脑手绘的5个基本步骤,轻松自学成PS手绘达人...
  15. C++ COM组件的编写
  16. Python爬取天猫店铺的企业名1:根据店铺名获得店铺链接
  17. android 识别中文字体,在 Android 上高效准确的进行 OCR 识别,白描帮你实现
  18. Linux电脑安全管家
  19. ICLOUD储存空间要升级吗_iPhone正确使用iCloud云空间,拒绝已满
  20. java jdk学习_Java学习第一步 -- JDK安装

热门文章

  1. java中单例的几种写法
  2. imoocLinux环境变量配置文件笔记
  3. 程序员选择字体的标准是
  4. .net快速入门方法,转csdn
  5. 2013.10u-boot移植之增加nand保存环境变量
  6. Docker 容器从入门到Devops实践
  7. MySQL(1)数据库介绍,配置MySQL的tab补全
  8. java mongodb 增删改查_java操作mongodb:基本的增删改查
  9. python心理学实验程序_psychopy coder模式编写心理试验程序 字符程序和记录反应时...
  10. Linux 高级存储管理