本文主要介绍内容

oss默认权限策略是private,当修改到public-read或更高权限时会提示存在安全风险。如果需要访问oss资源需要在地址上添加签名内容,不利于地址的存储和使用。本文会介绍如何利用nginx反向代理实现private权限下无参数访问oss资源。


运行环境说明

本文实现环境是:
Centos7 系统 + nginx: 1.14.1


前期准备工作

  • nginx安装njs模块(使用yum安装,也可源码编译安装)

yum install nginx-module-njs

  • 创建脚本文件

本文是将脚本放置与nginx/njs/目录下,文件名为oss-sign.js,你也可以放置到任何你喜欢的地方,只要以下提到的配置目录正确即可。

文件内容详见 代码文件

  • 修改nginx相关配置文件

修改nginx/nginx.conf文件,修改内容如下,非修改内容省略

#--start-- 引入njs模块
load_module modules/ngx_http_js_module.so;
#--end--http {#--start-- # 以上内容省略,这段代码需放置与include之前, http代码段之中# js_include指令后接脚本文件路径js_include njs/oss-sign.js;# 定义签名字符串和GMT时间字符串js_set $ossDate getGMTtime;js_set $ossAuth ossSign;#--end--include /etc/nginx/conf.d/*.conf;
}
  • 虚拟服务主机方式

conf.d/目录下创建oss.conf文件,内容如下

server {server_name  oss.xxxxx.com; # oss域名,替换成你自己的域名server_name_in_redirect off; # 多域名防干扰,详细说明可自行查阅location / {# 反向代理oss地址,需替换成你的oss内网或外网地址proxy_pass http://xxx.oss-cn-xxx-internal.aliyuncs.com;# 设置反向代理时请求header, 也是本方案核心内容# $ossDate, $ossAuth 变量名需和nginx.conf文件内变量名一致proxy_set_header Date $ossDate;proxy_set_header Authorization $ossAuth;}}
  • 其他方式

具体内容视情况而定,但主要是反向代理时添加的header字段,和上面类似

  • 重启nginx

service nginx restart

其他系统可视具体文档


结束

接下来就是见证奇迹的时刻!在浏览器里输入你的域名 + oss资源路径,然后按回车,如果不出意外,图片就能正常显示了。

脚本具体代码

oss-sign.js

/* 创建待签名字符串 此方法为简化版,仅处理不带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)return signature.update(canonicalString.toUTF8()).digest('base64')
}
/* 生成完整认证字符串 */
function authorization (accessKeyId, accessKeySecret, canonicalString) {return 'OSS ' + accessKeyId + ':' + computeSignature(accessKeySecret, canonicalString)
}
/* oss签名配置数据,换成你自己的PAM账号的AK和bucket */
var ossAccess = {accessKeyId: 'XXXXX',accessKeySecret: 'XXXX',bucket: 'XXX'
}
var GMTdate = ''
/* 返回oss header date字符串 */
function getGMTtime (r) {/* 函数运行在http环境,如果有多个server最好加上判断条件来避免不必要的消耗 */if (r.headersIn.host !== 'oss.xxxx.com') return ''/* nginx 环境下 toUTCString 函数和标准有差异, 此处做转换处理,后续njs版本升级后可能需要修改 */var dateWords = new Date().toUTCString().split(' ')dateWords[0] += ','dateWords[1] = [dateWords[2], dateWords[2] = dateWords[1]][0]GMTdate = dateWords.join(' ')return GMTdate
}
/* 返回oss header authorization字符串 */
function ossSign (r) {if (r.headersIn.host !== 'oss.xxxx.com') return ''var method = r.methodvar canonicalString = buildCanonicalString(method, '/' + ossAccess.bucket + r.uri, GMTdate)return authorization(ossAccess.accessKeyId, ossAccess.accessKeySecret, canonicalString)
}

OSS在private权限下的无参数访问(Nginx反向代理实现)相关推荐

  1. 配置nginx反向代理时,要注意的权限设置

    MYPM演示环境(www.mypm.cc/mypm)中当下载大的附件,或是页面中有大图片时,就会下载中断或是图版无法显示 也许你要说我用的nginx缺省的设置没碰到这问题,那是因为你的网站没大文件 查 ...

  2. nginx反向代理下thinkphp、php获取不到正确的外网ip

    nginx反向代理下thinkphp.php获取不到正确的外网ip 在记录用户发送短信需要获取用户ip时,tp一直获取的是内网ip:10.10.10.10 tp框架获取ip方法:get_client_ ...

  3. 利用nginx反向代理在内网服务器(无外网)下访问接口,视频,地图(一)

    最近在项目中遇到一个需求,需要把项目部署在客户内网服务器上(无外网),内网服务器(无外网)需要访问公网IP,由于我们的项目包括外接谷歌地图接口,视频直播接口:项目经理就把这个任务分配给我,让做ngni ...

  4. Linux下DNS轮询与Squid反向代理结合

    一.安装反向代理服务器 1.下载反向代理服务器软件采用squid,下载地址: http://www.squid-cache.org/Versions/v2/2.2/squid-2.2.STABLE5- ...

  5. 介绍下Nginx 反向代理与负载均衡

    Nginx的代理功能与负载均衡功能是最常被用到的,这篇就开门见山,先描述一些关于代理功能的配置,再说明负载均衡详细. Nginx 代理服务的配置说明 1.设置 404 页面导向地址 error_pag ...

  6. Linux和windows下minio+springboot实现文件服务器上传下载和nginx反向代理

    1 minio服务器的安装 在下载minio.exe文件: windows安装minio服务器:MinIO | Code and downloads to create high performanc ...

  7. nginx反向代理cas-server之2:生成证书,centOS下使用openssl生成CA证书(根证书、server证书、client证书)...

    前些天搭好了cas系统,这几天一致再搞nginx和cas的反向代理,一直不成功,但是走http还是测试通过的,最终确定是ssl认证证书这一块的问题,原本我在cas服务端里的tomcat已经配置了证书, ...

  8. Linux 下 nginx反向代理与负载均衡

    前面几篇记录下nginx的基本运功,代理服务器的访问,这里来试验下nginx的反向代理. 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给 ...

  9. Nginx——反向代理 负载均衡(无理论,案例实操)

    1.开篇 有关Nginx的下载安装.相关理论内容,这里就不再多说了,详情可以参考我的这几篇文章: https://szh-forever-young.blog.csdn.net/article/det ...

最新文章

  1. python项目实例初学者-python 初学者必备14张思维导图
  2. oracle用户权限的基本查询
  3. Visual Studio 字体抗锯齿插件 Text Sharp
  4. boost::functional模块功能性的测试程序
  5. 这谁写的技术文档?我想锤死他...
  6. K8s上的Go服务怎么扩容、发版更新、回滚、平滑重启?教你用Deployment全搞定!
  7. layer.alert自定义关闭回调事件
  8. 李彦宏 AI 布局又下一城,成立生命科学公司“百图生科”
  9. NetBeans 时事通讯(刊号 # 51 - Apr 07, 2009)
  10. maven下载安装及配置
  11. 燕麦粉行业调研报告 - 市场现状分析与发展前景预测
  12. HZNU Training 2 for Zhejiang Provincial Collegiate Programming Contest 2019
  13. GCC NOT FOUNT
  14. Typora+github代替云笔记(git上传文件至github)
  15. 数据中心机房精密空调制冷量的估算
  16. openssh升级流程
  17. 老烟民突然戒烟,会对身体有危害?正确戒烟这样做
  18. 波卡链Substrate (7)Grandpa协议二“投票”
  19. 微信小程序 实现倒三角位置指示
  20. hadoop学习笔记(八):Java HDFS API

热门文章

  1. Linux下ftp+ssl实现ftps
  2. Linux下samba服务器的搭建和配置
  3. centos 7.1 yum
  4. symbol(s) not found for architexture i386 报错
  5. 初探 开源视频会议 openmeeting
  6. Appium自动化测试-配置待测Android应用
  7. irobot擦地机器人故障_自己动手修复 iRobot braava380t 电机故障
  8. php进销存 手机版_酒水批发用传统本地化部署进销存与云进销存手机版的区别!...
  9. python数据分析神器_牛逼啊!一个随时随地写Python代码的神器
  10. Xamarin Android项目真机测试闪退