elastic aws amazon-web-services nginx amazon-s3 proxy http-headers

amazon-web-services - aws - elastic beanstalk nginx config



Recursos de Nginx proxy Amazon S3 (3)

A partir de una revisión arquitectónica, lo que está tratando de hacer es una forma incorrecta de hacerlo:

  • Presumiblemente, Amazon S3 está optimizado para ser un caché de alta disponibilidad; Al introducir una capa de proxy enrollada a mano encima, simplemente está introduciendo un retraso adicional innecesario y un gran punto de falla, y también está perdiendo todos los beneficios que se obtendrían de S3

  • Su análisis de rendimiento con respecto a la cantidad de archivos es incorrecto. Si tiene miles de archivos en S3, la solución correcta sería escribir un script de una sola vez para cambiar los atributos necesarios en S3, en lugar de hacer rodar a mano un mecanismo de representación que no comprende completamente, y que se ejecutaría muchas veces (ad nauseam). Hacer el proxy probablemente sería una curita y, en realidad, probablemente disminuirá el rendimiento, no lo aumentará (incluso si tuviera una herramienta automatizada sin estado que le diga lo contrario). Sin mencionar que también sería una pérdida innecesaria de recursos, y puede contribuir a problemas de rendimiento reales y errores en el futuro.

Dicho esto, si todavía está dispuesto a agregar los encabezados, la forma correcta de hacerlo con nginx sería utilizando la directiva de expires .

Por ejemplo, puede colocar expires max; antes o después de su directiva proxy_pass dentro de la ubicación adecuada.

La directiva de expires se encarga automáticamente de configurar un encabezado de Cache-Control correcto para usted; pero también puede usar la directiva add_header si desea agregar manualmente los encabezados de respuesta personalizados.

Estoy realizando algunas tareas de WPO, por lo que PageSpeed ​​me sugirió aprovechar el almacenamiento en caché del navegador. Lo he mejorado con éxito para algunos archivos estáticos en mi servidor Nginx, sin embargo, todavía faltan mis archivos de imagen almacenados en el servidor Amazon S3.

He leído un enfoque sobre la actualización de cada archivo en S3 para incluir algunos metatags de encabezado (Caduca y Control de caché). Creo que este no es un buen enfoque. Tengo miles de archivos, así que esto no es factible para mí.

Creo que el enfoque más conveniente es configurar mi servidor Nginx 1.6.0 para proxy de los archivos S3. He leído sobre esto, pero no soy experto en la configuración del servidor, así que obtuve un par de ejemplos de estos sitios: https://gist.github.com/benjaminbarbe/1961db5ffbaad57eff12

Agregué este código de ubicación dentro de mi bloque de servidor en mi archivo de configuración 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; }

Por supuesto, esto no está funcionando para mí. No se incluye encabezado en mis solicitudes. Entonces, primero creo que las solicitudes no coinciden con las ubicaciones.

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


Sin los detalles de los módulos con los que se compila Nginx, podemos decir dos maneras de agregar encabezados Expires y Cache-Control a todos los archivos.

Proxy Nginx S3

Esto es lo que preguntó: usar Nginx para agregar encabezados de control de caché de caducidad en archivos S3.

Nginx este módulo set-misc-nginx necesario para admitir el proxy Nginx S3 y cambiar / agregar caducar, control de caché sobre la marcha. Esta es una guía completa estándar desde la compilación hasta el uso, esta es una excelente guía para nginx-extras para el servidor Ubuntu . Esta es una guía completa con ejemplo con WordPress .

Hay más módulos S3 para cosas extra. Sin esos módulos, Nginx no comprenderá y la prueba de configuración ( nginx -t ) pasará la prueba con una configuración incorrecta. set-misc-nginx-module es mínimo para su necesidad. Lo que quieres tiene un mejor ejemplo de esta esencia de Github .

Como no todos se usan con la compilación y la configuración es realmente un poco difícil, también estoy escribiendo la forma de configurar el encabezado Expires y Cache-Control para todos los archivos en un bucket de Amazon S3.

Amazon S3 Bucket caduca y cabecera de control de caché

Además, es posible establecer encabezados de caducidad y control de caché para todos los objetos en un bucket de AWS S3 con script o línea de comando. Hay varias bibliotecas y scripts gratuitos en Github como este , el explorador de cubos , la herramienta de Amazon, este documento de Amazon y este documento . El comando será así para esa herramienta 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


Su enfoque para los archivos proxy S3 a través de Nginx tiene mucho sentido. Resuelve varios problemas y viene con beneficios adicionales como URL de enmascaramiento, caché proxy, acelerar la transferencia mediante descarga SSL / TLS. Lo haces casi bien, déjame mostrarte lo que queda para hacerlo perfecto.

Para consultas de muestra, uso el depósito S3 y una URL de imagen mencionada en el comentario público a la pregunta original.

Comenzamos con la inspección de los encabezados de los archivos de Amazon S3

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

Podemos ver la falta de control de caché pero los encabezados GET condicionales ya se han configurado. Cuando reutilizamos E-Tag / Last-Modified (así es como funciona el caché del lado del cliente de un navegador), obtenemos HTTP 304 junto con Content-Length vacío. Una interpretación de eso es que el cliente (curl en nuestro caso) consulta el recurso diciendo que no se requiere transferencia de datos a menos que el archivo se haya modificado en el servidor:

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 ​​sugirió aprovechar el almacenamiento en caché del navegador", lo que significa que Cache = falta el control. Nginx como proxy para archivos S3 resuelve no solo el problema con los encabezados faltantes, sino que también ahorra tráfico usando la caché de proxy Nginx.

Uso macOS pero la configuración de Nginx funciona en Linux exactamente de la misma manera sin modificaciones. Paso a paso:

1.Instale Nginx

brew update && brew install nginx

2.Configure Nginx en el proxy S3, consulte la configuración a continuación

3. Solicite el archivo a través de Nginx. Eche un vistazo al encabezado del servidor , ahora vemos Nginx en lugar de 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. Solicite el archivo usando el proxy Nginx con GET Condicional:

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. Solicite el archivo usando el caché proxy Nginx, eche un vistazo al encabezado X-Cache-Status , su valor es MISS hasta que el caché se haya calentado después de la primera solicitud

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

Basado en la documentación oficial de Nginx , proporciono la configuración de Nginx S3 con configuraciones de almacenamiento en caché optimizadas que admiten las siguientes opciones:

  • proxy_cache_revalidate indica a NGINX que use solicitudes GET condicionales al actualizar el contenido de los servidores de origen
  • el parámetro de actualización de la directiva proxy_cache_use_stale indica a NGINX que entregue contenido obsoleto cuando los clientes solicitan un elemento mientras se descarga una actualización desde el servidor de origen, en lugar de reenviar solicitudes repetidas al servidor
  • con proxy_cache_lock habilitado, si varios clientes solicitan un archivo que no está actualizado en el caché (un MISS), solo la primera de esas solicitudes se permite al servidor de origen

Configuración de Nginx :

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