nginx 代理由 minio 服务托管的 S3 公共存储桶

nginx 代理由 minio 服务托管的 S3 公共存储桶

我正在尝试做我认为世界上最简单的代理指令,代理一个公共 S3 存储桶。

这是我的配置:

server {
    listen 80;
    listen [::]:80;

    server_name experiment.local;
    location /404.html {
      proxy_pass https://minio/bucket/404.html;
    }
    location / {
      error_page 404 = /404.html;
      proxy_pass https://minio/bucket/;
    }
}

当获取存储桶中不存在的页面时实际发生了什么我从 nginx 获得如下信息:

<Error>
  <Code>NoSuchKey</Code>
  <Message>The specified key does not exist.</Message>
  <Key>index.html1</Key>
  <BucketName>visar</BucketName>
  <Resource>/bucket/index.html1</Resource>
  <RequestId>SCRUBBED</RequestId>
  <HostId>SCRUBBED</HostId>
</Error>

我尝试过各种各样的方法,但总是得到类似的结果。nginx 正在正确转发 HTTP 返回代码,所以我得到了 404(最初我使用单行 proxy_pass 得到了 200)。

我知道我做了一些非常基本、非常错误的事情,但我就是说不出来到底是什么。

答案1

server {


    listen 80;
    listen [::]:80;

    server_name experiment.local;
    location /404.html {
      proxy_pass https://minio/bucket/404.html;
    }
    location / {
      proxy_pass https://minio/bucket/;
      proxy_intercept_errors on;
      error_page 404 = /404.html;
    }

}

显然,订购有些重要。

答案2

我遇到了类似的问题。对于我来说,解决方法是删除 proxy_pass 行上的尾部斜杠 ( / )。

改变

proxy_pass https://minio/bucket/;

proxy_pass https://minio/bucket;

我相信这是因为与您的位置块匹配的请求 URL 包含斜线 ( / )。因此您正在代理 https://minio/bucket//something,这将在 S3 端失败。

相关内容