【发布时间】:2016-11-02 14:46:13
【问题描述】:
我在 Amazon S3 上托管了大型下载文件(有些大于 5 GB)。我的主服务器是 Nginx。 Amazon S3 没有公共访问权限。文件通过签名 URL 提供。
在使用 Amazon S3 时有没有办法限制带宽?我知道 Amazon S3 上没有选项,但我们可以使用 Nginx 作为代理并从那里制作它吗?
我正在尝试使用该链接中的示例:
https://coderwall.com/p/rlguog/nginx-as-proxy-for-amazon-s3-public-private-files
这个代码块:
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 '$1$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;
resolver 172.16.0.23 valid=300s;
resolver_timeout 10s;
proxy_pass http://$s3_bucket$url_full;
}
我不明白的是如何将创建的签名 URL 从 PHP 传递到 Nginx 配置?所以我可以告诉 Nginx 去那个签名的 URL 作为代理。
【问题讨论】:
-
这似乎可行——也许是
proxy_limit_rate?您真的要限制“带宽”,还是每个客户端每秒的请求数,还是其他? -
我的问题是;我正在使用一个插件为 Amazon S3 创建签名 URL。该插件使用 PHP 中的类似内容将用户重定向到签名 URL:header('Location: ' . $signedURL); 在这种情况下我可以在哪里放置 Nginx?
-
@Michael-sqlbot 我对服务器不是很好,所以请多多包涵。用户请求 example.com/files/file1.txt PHP,生成签名 URL。像 amazon/bucket/file1.txt 然后使用 PHP 的标头提供服务。我需要在 Nginx conf 中获取 amazon/bucket/file.txt URL 并在那里发出代理请求。我该怎么做?
-
简而言之:PHP 创建一个 URL,我想将其用作 Nginx 的代理地址。