从亚马逊 s3 存储桶中检索静态文件

Retrieve static file from amazom s3 bucket

我试图以这样一种方式配置我的 nginx,每当出现一些错误的网关响应时,我都会尝试从 s3 存储桶中获取静态 html 内容。

请求的url结构是some_bucket/folder1/folder2/text

数据存储在s3 bucket中,目录结构为s3.amazonaws.com/some_bucket/folder1/folder2/folder1_folder2.html

我无法确定 folder1 和 folder2 的值,因此我无法 html 动态文件并使用 proxy_pass。 另外,我试过 try_files 但我认为这对 url 不起作用。

知道如何解决这个问题。

谢谢。

Nginx S3代理可以处理动态构建URL,还可以隐藏一个目录甚至部分私有URL比如AWS Key:

例如基础URL如下:

https://your_bucket.s3.amazonaws.com/readme.txt?AWSAccessKeyId=YOUR_ONLY_ACCESS_KEY&Signature=sagw4gsafdhsd&Expires=3453445231

结果URL:

https://your_server/proxy_private_file/readme.txt?st=sagw4gsafdhsd&e=3453445231

配置不难:

location ~* ^/proxy_private_file/(.*) {
  set $s3_bucket        'your_bucket.s3.amazonaws.com';
  set $aws_access_key   'AWSAccessKeyId=YOUR_ONLY_ACCESS_KEY';
  set $url_expires      'Expires=$arg_e';
  set $url_signature    'Signature=$arg_st';
  set $url_full         '?$aws_access_key&$url_expires&$url_signature';

  proxy_http_version     1.1;
  proxy_set_header       Host $s3_bucket;
  proxy_set_header       Authorization '';
  proxy_hide_header      x-amz-id-2;
  proxy_hide_header      x-amz-request-id;
  proxy_hide_header      Set-Cookie;
  proxy_ignore_headers   "Set-Cookie";
  proxy_buffering        off;
  proxy_intercept_errors on;

  proxy_pass             http://$s3_bucket/$url_full;  
}

有关详细信息,请参阅 full configuration

这是我为可能遇到此问题的人(可能是新手)所做的。

 location ~* ^/some_bucket/(.*)/(.*)/.* {
      proxy_pass http://s3.amazonaws.com/some_bucket///_.html;
 }

~* 表示不区分大小写的正则表达式匹配 ^ 之前的意思 () 用于捕获参数。

例如, 用户输入 www.example.com/some_bucket/folder1/folder2/text

然后,处理为,

~* 确保不区分大小写的搜索(对于区分大小写的跳过 *(意味着只输入 ~))

^ 匹配 www.example.com.

然后匹配

/some_bucket/,

.* 表示任意数量的任意字符(对于任意数字,替换为 [0-9]*)

() 确保捕获匹配的值

所以,$1 捕获文件夹 1

$2 捕获文件夹2

然后

.* 不带括号匹配任何字符但不捕获匹配值

现在可以使用捕获的值在亚马逊存储桶中使用

查找文件

proxy_pass http://s3.amazonaws.com/some_bucket/$1/$2/$1_$2.html

https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms 会有帮助