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,错误如下图。
Ceph RGW配置Nginx代理出现S3Error: 403 (Forbidden)_第1张图片
这里需要补充一点知识,就是 s3cmd 目前支持两种认真的方式一种是 v2,一种是 v4,而 s3cmd 2.x 版本默认用的是 v4,而 1.x 版本默认用的是 v2,这两种认证方式是有区别的,简单来说就是 v4 除了像 v2,那样需要S3桶的 accesskeysecretkey,还需要如 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

  1. https://github.com/minio/minio/issues/4120
  2. https://github.com/minio/minio/issues/5571
  3. https://serverfault.com/questions/732839/cant-connect-to-s3-with-nginx
  4. https://www.finbourne.com/blog/authenticating-s3-proxy
  5. https://www.finbourne.com/blog/authenticating-s3-proxy
  6. https://github.com/s3tools/s3cmd/issues/487
  7. http://sealblog.com/2018/03/02/rgw-auth/

你可能感兴趣的:(S3)