Nginx 如何为 AWS S3 存储桶配置动态代理

Nginx How to configure the Dynamic Proxy for AWS S3 bucket

我们有如下nginx配置,对应每个s3 bucket,

location /bucketname1/ {
    proxy_pass https://bucketname1.s3.amazonaws.com/;
}

location /bucketname2/ {
    proxy_pass https://bucketname2.s3.amazonaws.com/;
}

location /bucketname3/ {
    proxy_pass https://bucketname3.s3.amazonaws.com/;
}

但是你可以看到,当创建的bucket越来越多的时候,这个location的配置也在增加。

我打算做一个通用的位置配置来彻底解决这个问题。

但是对于这个位置:

location  ~* ^/([^/]+) {
    proxy_pass https://.s3.amazonaws.com/;
}

我们遇到了“没有定义解析器来解析 bucketname1”的错误, 我们的 nginx 部署在 EC2 Linux 机器下,有谁知道我如何找到我的解析器 ip 或者有没有更好的方法来解决这种情况而不使用解析器?

谢谢

这是一个复杂的问题。然而:

您的 VPC 的解析器通常存在于 IP 上,IP 等于其基本 CIDR 范围,但以 2 结尾。

例如,如果您的 VPC 是 10.0.0.0/8,您会在 10.0.0.2 找到解析器地址。在 169.254.169.253 也有一个解析器。

如果您通过 ssh 进入同一个 VPC 中的 EC2 并使用 运行 dig 或 nslookup 命令,您将看到它成功解析。尝试:

dig @X.X.X.2 <bucket-name>.s3.amazonaws.com

dig @169.254.169.253 <bucket-name>.s3.amazonaws.com

将此添加到您的 nginx.conf 应该有助于解析这些 IP:

      resolver X.X.X.2 169.254.169.253;

本文介绍了使用您的 VPC 创建的两个默认 DNS 解析器 IP 地址:

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html

阅读服务器指令上的 nginx 文档很有帮助:

http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver

这两个堆栈溢出响应也可能对解决您的问题很有帮助:

https://serverfault.com/questions/875150/resolver-directive-for-setting-up-nginx-reverse-proxy

https://serverfault.com/questions/240476/how-to-force-nginx-to-resolve-dns-of-a-dynamic-hostname-everytime-when-doing-p