Ceph RGW配置Nginx代理出现S3Error: 403 (Forbidden)
因为 RGW 的默认 web server 用的是 civetweb,又因为 civetweb 的日志比较简单,没法统计用户通过 S3 读写数据的详细的性能数据,所以就考虑在 RGW 前通过 Nginx 来做本地代理,然后解析 Nginx 的日志,来获取请求状态,数据量和请求的返回时间等信息。
然而一段猛操作之后,发现用户原来通过 s3cmd 2.0.1 能够请求成功的请求全都变成403了,因此本地安装 s3cmd 来测试一下发下还真是 S3Error: 403 (Forbidden)
,给 s3cmd 加个 debug 选项 -d
,错误如下图。
这里需要补充一点知识,就是 s3cmd 目前支持两种认真的方式一种是 v2,一种是 v4,而 s3cmd 2.x 版本默认用的是 v4,而 1.x 版本默认用的是 v2,这两种认证方式是有区别的,简单来说就是 v4 除了像 v2,那样需要S3桶的 accesskey
和 secretkey
,还需要如 date
等信息来签名,然后放到 http request 的 Header 上,而 s3cmd 2.x 版本支持通过在 .s3cfg
配置文件,增加选项 signature_v2 = True
来修改认证方式,所以说,如果想快速解决这个403的问题,让用户加上这个选项就可以了。
签名方式的差别,具体可以参考 AWS 的技术文档 Create a string to sign for Signature Version 4。
但是为了不影响用户原来的使用体验,不能说平台方加上了 Nginx 代理之后就让用户各种修改,所以通过查阅相关文档,发现 Nginx 在做代理的时候会将原来请求的 Header 做 buffer 缓存,导致 RGW 接受到的请求的 Header,并不是原来 s3cmd 客户端发过来的那样,具体差别可以参考下面 Reference 的资料。所以这个处理起来也比较简单,只需要给 Nginx 配置文件加上一些特殊的选项就可以了。
proxy_buffering off;
proxy_request_buffering off;
Nginx 代理加上这两个选项之后,S3Error: 403 (Forbidden)
的问题就解决了。
Reference
- https://github.com/minio/minio/issues/4120
- https://github.com/minio/minio/issues/5571
- https://serverfault.com/questions/732839/cant-connect-to-s3-with-nginx
- https://www.finbourne.com/blog/authenticating-s3-proxy
- https://www.finbourne.com/blog/authenticating-s3-proxy
- https://github.com/s3tools/s3cmd/issues/487
- http://sealblog.com/2018/03/02/rgw-auth/
- 开发人员看测试之运行Github中的JBehave项目
- 如何高效地合并Spark社区PR到自己维护的分支
- 开发人员看测试之TDD和BDD
- AngularJS入门心得1——directive和controller如何通信
- AngularJS入门心得2——何为双向数据绑定
- AngularJS入门心得3——HTML的左右手指令
- AngularJS入门心得4——漫谈指令scope
- Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[上]
- 苹果就“电池门”公开致歉;微信下拉任务栏新增小游戏;美团打车进入北京
- 新华三《中国城市数字经济指数白皮书》:深圳数字经济发展水平国内居首
- NodeMCU模块写入MicroPython固件
- 如何证明Application Domain的隔离性
- Enterprise Library深入解析与灵活应用(8):WCF与Exception Handling AppBlock集成[下]
- 我所理解的Remoting(1):Marshaling & Activation[上篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 常用功能加载宏——拆分工作表
- MyVBA加载宏——添加自定义菜单04——功能实现
- CS学习笔记 | 14、powerup提权的方法
- VBA解压缩ZIP文件05——Huffman树
- JavaScript|jQuery基础语法
- VBA解压缩ZIP文件03——解压准备工作
- VBA解压缩ZIP文件04——解析ZIP文件结构
- 开发|Springboot简单实现文件上传
- VBA解压缩ZIP文件01——实现的功能
- MyVBA加载宏——添加自定义菜单03——功能分析
- MyVBA加载宏——添加自定义菜单02——给按钮添加单击事件
- 科研猫小课堂:敲黑板!竞争风险模型应该如何分析?
- 常用功能加载宏——快速定位合并单元格
- 常用功能加载宏——调用微信截图
- 常用功能加载宏——一维表转二维表