Amazon web services Nginx代理amazons3资源
我正在执行一些WPO任务,因此PageSpeed建议我利用浏览器缓存。我已经为我的Nginx服务器中的一些静态文件成功地改进了它,但是我存储在amazons3服务器中的图像文件仍然丢失 我读过一篇关于更新S3中每个文件以包含一些头元标记(Expires和Cache Control)的方法。我认为这不是一个好办法。我有数千个文件,所以这对我来说是不可行的 我认为最方便的方法是配置我的nginx1.6.0服务器来代理S3文件。我读过这方面的文章,但我对服务器配置一点也不熟练,所以我从这些网站上得到了几个例子: 我在nginx配置文件中的服务器块中添加了此位置代码:Amazon web services Nginx代理amazons3资源,amazon-web-services,nginx,amazon-s3,proxy,http-headers,Amazon Web Services,Nginx,Amazon S3,Proxy,Http Headers,我正在执行一些WPO任务,因此PageSpeed建议我利用浏览器缓存。我已经为我的Nginx服务器中的一些静态文件成功地改进了它,但是我存储在amazons3服务器中的图像文件仍然丢失 我读过一篇关于更新S3中每个文件以包含一些头元标记(Expires和Cache Control)的方法。我认为这不是一个好办法。我有数千个文件,所以这对我来说是不可行的 我认为最方便的方法是配置我的nginx1.6.0服务器来代理S3文件。我读过这方面的文章,但我对服务器配置一点也不熟练,所以我从这些网站上得到了
#inside server block
location /mybucket.s3.amazonaws.com/ {
proxy_http_version 1.1;
proxy_set_header Host mybucket.s3.amazonaws.com;
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://mybucket.s3.amazonaws.com;
}
当然,这对我不起作用。我的请求中不包含标题。因此,首先我认为请求与位置不匹配
Accept-Ranges:bytes
Content-Length:90810
Content-Type:image/jpeg
Date:Fri, 23 Jun 2017 04:53:56 GMT
ETag:"4fd0be549fbcaf9b47c18a15146cdf16"
Last-Modified:Tue, 09 Jun 2015 09:47:13 GMT
Server:AmazonS3
x-amz-id-2:cKsq1qRra74DqVsTewh3P3sgzVUoPR8aAT2NFCuwA+JjCdDZfk7/7x/C0WPjBa51GEb4C8LyAIc=
x-amz-request-id:94EADB4EDD3DE1C1
在不详细说明编译Nginx使用哪些模块的情况下,我们可以说向所有文件添加Expires和Cache-Control头的两种方法 Nginx S3代理 这就是您要问的——使用Nginx在S3文件上添加expire、cache控制头 Nginx支持Nginx S3代理&动态更改/添加过期、缓存控制。从编译到使用,这是一个很好的例子。这是 有更多的S3模块用于额外的东西。如果没有这些模块,Nginx将无法理解,配置测试(
Nginx-t
)将通过配置错误的测试<代码>设置杂项nginx模块是满足您需求的最低要求。你想要的东西已经有了
由于并非所有文件都用于编译,而且设置确实有点困难,因此我还编写了一种方法,为一个AmazonS3存储桶中的所有文件设置Expires和Cache Control头
Amazon S3存储桶过期和缓存控制头
此外,还可以使用脚本或命令行为一个AWS S3存储桶中的所有对象设置过期和缓存控制头。Github、和上有几个这样的免费库和脚本。对于该cp CLI工具,命令如下所示:
aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2027-09-01T00:00:00Z --acl public-read --cache-control max-age=2000000,public
从架构审查来看,您试图做的是一种错误的方式:
- AmazonS3被认为是一个高度可用的缓存;通过在上面引入一个手动滚动代理层,您只会引入一个不必要的额外延迟和一个巨大的失败点,同时也失去了S3带来的所有好处
- 您对文件数量的性能分析不正确。如果S3上有数千个文件,正确的解决方案是编写一个一次性脚本来更改S3上必需的属性,而不是手动滚动一个您不完全理解的代理机制,该机制将被多次执行(非常讨厌)。做代理可能是一个创可贴,在现实中,可能会降低性能,而不是增加性能(即使你有一个无状态的自动化工具告诉你,否则)。更不用说,这也是一种不必要的资源消耗,可能会导致实际的性能问题和海森堡
这就是说,如果您仍然准备通过添加头进行代理,那么使用nginx进行代理的正确方法是使用指令 例如,您可以放置
expires max代码>在相应位置内的代理\u pass
指令之前或之后
expires
指令也会自动为您设置正确的Cache Control
头;但是,如果您希望手动添加任何自定义响应头,也可以使用指令。您通过Nginx处理代理S3文件的方法非常有意义。它解决了许多问题,并带来了额外的好处,如屏蔽URL、代理缓存、通过卸载SSL/TLS加快传输。你几乎做对了,让我展示一下剩下的东西,让它变得完美
对于示例查询,我使用了S3 bucket和原始问题中提到的图像URL
我们首先检查AmazonS3文件的头
curl -I http://yanpy.dev.s3.amazonaws.com/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg
HTTP/1.1 200 OK
Date: Sun, 25 Jun 2017 17:49:10 GMT
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Accept-Ranges: bytes
Content-Type: binary/octet-stream
Content-Length: 378843
Server: AmazonS3
我们可以看到缺少缓存控制,但是已经配置了条件GET头。当我们重用E-Tag/Last-Modified(浏览器的客户端缓存就是这样工作的)时,我们会得到HTTP 304和空内容长度。对此的解释是客户端(在我们的例子中是curl)查询资源,表示除非在服务器上修改了文件,否则不需要数据传输:
curl -I http://yanpy.dev.s3.amazonaws.com/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg
--header "If-None-Match: 37a907fc5dd7cfd0c428af78f09e95a9"
HTTP/1.1 304 Not Modified
Date: Sun, 25 Jun 2017 17:53:33 GMT
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Server: AmazonS3
curl -I http://yanpy.dev.s3.amazonaws.com/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg
--header "If-Modified-Since: Wed, 21 Jun 2017 07:42:31 GMT"
HTTP/1.1 304 Not Modified
Date: Sun, 25 Jun 2017 18:17:34 GMT
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Server: AmazonS3
“PageSpeed建议利用浏览器缓存”,这意味着
Cache=缺少控件。Nginx作为S3文件的代理
这不仅解决了缺少标题的问题,还节省了流量
使用Nginx代理缓存
我使用macOS,但Nginx配置在Linux上的工作方式完全相同,无需修改。逐步:
1.安装Nginx
brew update && brew install nginx
2.将Nginx设置为代理S3 bucket,请参见下面的配置
3.通过Nginx请求文件。请看一下服务器的标题,我们现在看到的是Nginx而不是Amazon S3:
curl -I http://localhost:8080/s3/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg
HTTP/1.1 200 OK
Server: nginx/1.12.0
Date: Sun, 25 Jun 2017 18:30:26 GMT
Content-Type: binary/octet-stream
Content-Length: 378843
Connection: keep-alive
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Accept-Ranges: bytes
Cache-Control: max-age=31536000
4.使用带有条件GET的Nginx代理请求文件:
curl -I http://localhost:8080/s3/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg
--header "If-None-Match: 37a907fc5dd7cfd0c428af78f09e95a9"
HTTP/1.1 304 Not Modified
Server: nginx/1.12.0
Date: Sun, 25 Jun 2017 18:32:16 GMT
Connection: keep-alive
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Cache-Control: max-age=31536000
5.使用Nginx代理缓存请求文件,请查看X-cache-Status头,在第一次请求后缓存预热之前,其值为MISS
curl -I http://localhost:8080/s3_cached/img/blog/sailing-routes-around-croatia-central-dalmatia-islands/yachts-anchored-paradise-cove-croatia-3.jpg
HTTP/1.1 200 OK
Server: nginx/1.12.0
Date: Sun, 25 Jun 2017 18:40:45 GMT
Content-Type: binary/octet-stream
Content-Length: 378843
Connection: keep-alive
Last-Modified: Wed, 21 Jun 2017 07:42:31 GMT
ETag: "37a907fc5dd7cfd0c428af78f09e95a9"
Expires: Fri, 21 Jul 2018 07:41:49 UTC
Cache-Control: max-age=31536000
X-Cache-Status: HIT
Accept-Ranges: bytes
基于此,我为Nginx S3配置提供了支持以下选项的优化缓存设置:
- proxy\u cache\u revalidate指示NGINX使用条件GET
从源服务器刷新内容时请求
- proxy\u cache\u use\u stale指令的更新参数指示NGINX在客户端请求项目时交付过时内容
从源服务器下载更新时,
而不是将重复的请求转发到服务器
- 使用代理缓存\u lo
worker_processes 1;
daemon off;
error_log /dev/stdout info;
pid /usr/local/var/nginx/nginx.pid;
events {
worker_connections 1024;
}
http {
default_type text/html;
access_log /dev/stdout;
sendfile on;
keepalive_timeout 65;
proxy_cache_path /tmp/ levels=1:2 keys_zone=s3_cache:10m max_size=500m
inactive=60m use_temp_path=off;
server {
listen 8080;
location /s3/ {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Authorization '';
proxy_set_header Host yanpy.dev.s3.amazonaws.com;
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header x-amz-meta-server-side-encryption;
proxy_hide_header x-amz-server-side-encryption;
proxy_hide_header Set-Cookie;
proxy_ignore_headers Set-Cookie;
proxy_intercept_errors on;
add_header Cache-Control max-age=31536000;
proxy_pass http://yanpy.dev.s3.amazonaws.com/;
}
location /s3_cached/ {
proxy_cache s3_cache;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Authorization '';
proxy_set_header Host yanpy.dev.s3.amazonaws.com;
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header x-amz-meta-server-side-encryption;
proxy_hide_header x-amz-server-side-encryption;
proxy_hide_header Set-Cookie;
proxy_ignore_headers Set-Cookie;
proxy_cache_revalidate on;
proxy_intercept_errors on;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_valid 200 304 60m;
add_header Cache-Control max-age=31536000;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://yanpy.dev.s3.amazonaws.com/;
}
}
}