Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Nginx代理amazons3资源_Amazon Web Services_Nginx_Amazon S3_Proxy_Http Headers - Fatal编程技术网

Amazon web services Nginx代理amazons3资源

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文件。我读过这方面的文章,但我对服务器配置一点也不熟练,所以我从这些网站上得到了

我正在执行一些WPO任务,因此PageSpeed建议我利用浏览器缓存。我已经为我的Nginx服务器中的一些静态文件成功地改进了它,但是我存储在amazons3服务器中的图像文件仍然丢失

我读过一篇关于更新S3中每个文件以包含一些头元标记(Expires和Cache Control)的方法。我认为这不是一个好办法。我有数千个文件,所以这对我来说是不可行的

我认为最方便的方法是配置我的nginx1.6.0服务器来代理S3文件。我读过这方面的文章,但我对服务器配置一点也不熟练,所以我从这些网站上得到了几个例子:

我在nginx配置文件中的服务器块中添加了此位置代码:

#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/;
        }
    
      }
    }