Mejore el rendimiento del sitio web con AWS S3 y CloudFront

Vivimos en un mundo donde las personas esperan cada vez más y velocidades más rápidas. En fracciones de segundo, su sitio web puede perder visitantes valiosos y, a su vez, dinero. Aunque la mayoría de las personas piensan que los CDN son para los "perros grandes", en realidad son súper baratos e increíblemente fáciles de usar en estos días.

En este tutorial, le mostraré cómo configurar y usar los servicios web de Amazon S3 y CloudFront para disminuir el tiempo de carga del sitio web y para mostrar las diferencias de rendimiento..

¿Qué es un CDN??

Un CDN es una red de entrega (o distribución) de contenido. Es una red de computadoras con cada sistema colocado en diferentes puntos con los mismos datos en cada uno. Cuando alguien accede a la red, puede acceder al archivo en el sistema más cercano o al que tiene menos carga actual. Esto resulta en una mejor latencia menor y en la duración de la descarga del archivo. Para obtener más información sobre las CDN, consulte "Red de entrega de contenido" en Wikipedia.

En la imagen de ejemplo anterior, los visitantes acceden al servidor más cercano que proporcionará el mejor rendimiento posible. La red de servidores sería la CDN. Un servidor web normal tendría un servidor central al que todos los visitantes tendrían que acceder. Ese único servidor podría ubicarse solo en los Estados Unidos o quizás en Europa y daría lugar a tiempos de latencia y carga más largos para los visitantes que se encuentran más lejos..

El uso de más de un servidor, incluso en un solo continente, marcará la diferencia en el rendimiento.

Por qué y la prueba

Muchas personas me han preguntado por qué un CDN es importante, incluso para sitios web más pequeños, y por qué deberían molestarse en pagar por otro servicio web. La respuesta simple es: cuanto más rápido, mejor. ¿Y por qué no ofrecer a sus clientes (visitantes) lo mejor que pueda??

Cuanto más pequeño sea el sitio web, menor será el impacto que tendrá un CDN. Sin embargo, si sus visitantes se convierten en dinero para usted, entonces cada poco ayuda..

  • En 2006, las pruebas de Google mostraron que aumentar el tiempo de carga en 0,5 segundos daba como resultado una caída del 20% en el tráfico..
  • En 2007, las pruebas de Amazon mostraron que por cada 100 ms de tiempo de carga, las ventas disminuirían un 1%..
  • Este año (2009) Akamai (un líder de CDN) reveló en un estudio que 2 segundos es el nuevo umbral para los tiempos de respuesta de las páginas web de comercio electrónico..

Es barato. Es fácil. Y puede traducirse en más dinero en términos de clientes y ahorrar en sus gastos de host web habituales.

Servicios web de Amazon (AWS)

Amazon proporciona una gran cantidad de servicios web fantásticos. Usaremos el Servicio de almacenamiento simple (S3) de Amazon y CloudFront. S3 es una solución de almacenamiento de datos en la nube que puede vincularse a CloudFront, el CDN de Amazon..

Si está buscando una solución todo en uno, algo más simple, Rackspace Cloud Files es otra excelente opción. Se han asociado con el CDN de Limelight Network, que tiene un rendimiento ligeramente mejor que el CDN de Amazon actualmente. Sin embargo, su servicio tiene algunos inconvenientes que no encontrará con Amazon. No me ocuparé de todo esto, pero uno de los más importantes para mí fue la falta de soporte personalizado de CNAME, que supuestamente llegará en algún momento en el futuro. Con la compatibilidad con CNAME, puede configurar un subdominio personalizado para acceder a sus archivos, como "cdn.yourdomain.com".

Para ver comparaciones recientes de rendimiento, visite http://www.cloudclimate.com/cdns/

Precios

Aquí está el precio S3 de Amazon para los Estados Unidos. Para otras áreas, haga clic en la imagen para ver el precio completo..

Aquí está el precio de Amazon CloudFront para los Estados Unidos. Para otras áreas, haga clic en la imagen para ver el precio completo..

Use la calculadora mensual de Amazon para tener una mejor idea de su factura final. El mes pasado, mi factura total fue de menos de $ 5, con la mayoría de eso incurrida desde más de 20GB de almacenamiento de datos. Como puede ver, es muy, muy barato, especialmente si tiene en cuenta los beneficios de rendimiento y flexibilidad.

Configurar S3 y CloudFront

Para comenzar, debemos registrarnos en los servicios S3 y CloudFront de Amazon. Si ya tiene una cuenta en Amazon, solo tendrá que iniciar sesión y finalizar el registro. De lo contrario, deberá crear una cuenta y luego registrarse para S3 y CloudFront. El registro es simplemente agregar el servicio a su cuenta. No hay nada complicado involucrado.

Haga clic en cada imagen para ir a la página de información y registro del servicio..

Una vez que se haya registrado, obtendrá una ID de clave de acceso y una Clave de acceso secreta que se pueden encontrar en "Su cuenta"> "Credenciales de seguridad". Este es básicamente su nombre de usuario y contraseña para acceder a S3.

Setup S3 Bucket para archivos

Primero debemos crear un grupo para almacenar todos nuestros archivos. Para obtener más información sobre los "grupos", lea "Amazon S3 Buckets Described in Plain English".

Para hacer esto, primero iniciaremos sesión en nuestra cuenta S3 utilizando la ID de clave de acceso y la Clave de acceso secreta con una aplicación como Transmit (OS X), que es lo que usaré. Para ver más aplicaciones o complementos del navegador para acceder a S3, consulte "Servicio de almacenamiento simple de Amazon S3: todo lo que quería saber".

Una vez que haya iniciado sesión, crearemos un grupo para colocar nuestros archivos. He llamado a mío "files.jremick.com". Los cubos deben tener nombres únicos, deben tener entre 3 y 63 caracteres y pueden contener letras, números y guiones (pero no pueden terminar con un guión).

Por únicos, significan únicos en la red de AWS. Así que es una buena idea usar algo como una URL o algo similar.

Ahora se puede acceder a los archivos que colocamos en este cubo en "files.jremick.com.s3.amazonaws.com". Sin embargo, esta URL es bastante larga y podemos configurar rápidamente una más corta. Vamos a configurar una nueva entrada CNAME en nuestro servidor web para hacer esto.

Configurar subdominio S3 personalizado

Para acortar la URL predeterminada, crearemos una entrada CNAME como lo he hecho a continuación (esto es en su servidor web). He elegido "archivos" como mi subdominio pero podrías usar lo que quieras.

Ahora podemos acceder a estos archivos de depósito en "files.jremick.com". ¡Mucho mejor! Luego simplemente cargue los archivos que desee en el contenedor "files.jremick.com".

Una vez que se carguen sus archivos, querrá configurar la ACL (Lista de control de acceso) para que todos puedan leer los archivos (si los desea públicos). En Transmitir, simplemente haga clic con el botón derecho, seleccione obtener información, bajo los permisos establecidos en "Leer" en "Mundo" y haga clic en "Aplicar a los elementos adjuntos ...". Esto le dará a todos los archivos dentro de este cubo acceso de lectura al mundo.

De forma predeterminada, los archivos cargados en su cuenta S3 solo permitirán el acceso de lectura y escritura al propietario. Entonces, si carga nuevos archivos más adelante, deberá seguir estos pasos nuevamente o aplicar permisos diferentes solo para esos archivos..

Crear Distribución de CloudFiles

Ahora que configuramos S3, creamos una URL más corta y subimos nuestros archivos, desearemos que esos archivos sean accesibles a través de CloudFront para obtener una latencia súper baja para reducir nuestros tiempos de carga. Para ello necesitamos crear una distribución CloudFront..

Inicie sesión en su cuenta de AWS y navegue hasta la consola de administración de Amazon CloudFront (en el menú desplegable "Su cuenta"). Luego haga clic en el botón "Crear distribución".

Seleccionaremos el grupo de origen (el grupo que creamos anteriormente), activaremos el registro si lo desea, especificaremos un CNAME y comentarios y finalmente habilitaremos o inhabilitaremos la distribución. No es necesario que ingrese un CNAME o comentarios, pero más adelante desearemos configurar una URL más corta, como hicimos con S3. Me gustaría usar "cdn.jremick.com", así que eso es lo que estoy configurando aquí.

Como puedes ver, la URL por defecto es bastante fea. Eso no es algo que quieras recordar. Así que ahora vamos a configurar un CNAME para la URL bonita y corta.

Configurar subdominio de CloudFiles personalizados

Para configurar el subdominio de CloudFiles personalizado, realizaremos el mismo proceso que hicimos para S3.

Ahora podemos acceder a los archivos a través de CloudFront usando "cdn.jremick.com".

Cómo funciona todo

Cuando alguien accede a un archivo a través de su grupo de S3, actúa como un host de archivos normal. Sin embargo, cuando alguien accede a un archivo a través de CloudFiles, solicita el archivo de su grupo de S3 (el origen) y lo almacena en el servidor CDN más cercano a la solicitud original para todas las solicitudes posteriores. Es un poco más complicado que eso, pero esa es la idea general.

Piense en un CDN como una red inteligente que puede determinar la ruta más rápida posible para la entrega de solicitudes. Otro ejemplo sería si el servidor más cercano está atascado con el tráfico, puede ser más rápido obtener el archivo de un servidor un poco más lejos pero con menos tráfico. Entonces, CloudFront entregará el archivo solicitado desde esa ubicación..

Problemas de almacenamiento en caché

Una vez que un archivo se almacena en caché en los servidores de red de CloudFront, no se reemplaza hasta que caduca y se elimina automáticamente (después de 24 horas de inactividad de forma predeterminada). Esto puede ser un gran problema si está intentando eliminar las actualizaciones inmediatamente. Para solucionar esto necesitarás una versión de tus archivos. Por ejemplo, "my-stylesheet.css" podría ser "my-stylesheet-v1.0.css". Luego, cuando realice una actualización que deba salir inmediatamente, cambiará el nombre a "my-stylesheet-v1.1.css" o algo similar..

Pruebas de rendimiento

Nuestro contenido se carga en nuestro grupo de S3, nuestra distribución de CloudFront se implementa y nuestros subdominios personalizados se configuran para un fácil acceso. Es hora de ponerlo a prueba para ver qué tipo de beneficios de rendimiento podemos esperar.

He configurado 44 imágenes de ejemplo que varían en tamaño desde aproximadamente 2 KB hasta 45 KB. Podría estar pensando que se trata de más imágenes de las que cargarán la mayoría de los sitios web en una sola página. Eso puede ser cierto, pero hay muchos sitios web como carteras, sitios de comercio electrónico, blogs, etc. que cargan la misma cantidad y posiblemente más imágenes..

Aunque solo uso imágenes para este ejemplo, lo importante es el tamaño del archivo y la cantidad para la comparación. Los sitios web de hoy están cargando varios archivos javascript, CSS, HTML y de imagen en cada página. 44 solicitudes de archivos es probablemente menos de lo que la mayoría de los sitios web realizan, por lo que un CDN podría tener un impacto aún mayor en su sitio web del que veremos en esta comparación.

Estoy usando el Inspector web de Safari para ver los resultados de rendimiento, he deshabilitado las cachés y shift + refresh 10-15 veces (aproximadamente cada 2-3 segundos) para cada prueba para obtener un promedio decente del tiempo total de carga, latencia y duración.

  • 45 archivos totales (incluido el documento HTML)
  • Tamaño total de archivo combinado de 561.13 KB

Web Host Regular

Aquí están los resultados de rendimiento cuando se alojan a través de mi servidor web regular. Ordenado por latencia.

  • 1.82-1.95 segundos de tiempo de carga total
  • 90ms La latencia más rápida (última prueba)
  • 161ms de latencia más lenta (última prueba)
  • ~ 65% de las imágenes tenían una latencia inferior a 110ms

Ordenados por duración.

  • 92 ms de duración más rápida (última prueba)
  • 396ms de duración más lenta (última prueba)

Amazon S3

Los mismos archivos se utilizaron para probar S3. Ordenado por latencia.

  • 1.3-1.6 segundos de tiempo de carga total
  • 55ms de latencia más rápida (última prueba)
  • 135ms de latencia más lenta (última prueba)
  • ~ 90% de las imágenes tenían una latencia inferior a 100 ms

Ordenados por duración.

  • 56ms de duración más rápida (última prueba)
  • 279ms de duración más lenta (última prueba)

S3 es más rápido que mi host web normal pero solo marginalmente. Si no tenía ganas de perder el tiempo con un CDN, S3 sigue siendo una excelente opción para darle a su sitio web un aumento de velocidad decente. Aun así, recomiendo usar un CDN y veremos por qué en esta próxima prueba.

Amazon CloudFiles

Los mismos archivos se utilizaron para probar CloudFront.

  • Tiempo de carga total 750-850ms
  • La latencia más rápida de 25 ms (última prueba)
  • 112 ms de latencia más lenta (última prueba)
  • ~ 85% de las imágenes tenían una latencia inferior a 55ms.
  • Solo un archivo tuvo una latencia de más de 100 ms..

Ordenados por duración.

  • 38ms de duración más rápida (última prueba)
  • 183ms de duración más lenta (última prueba)

Comparación

Aquí hay un rápido desglose de la comparación de rendimiento entre mi servidor web normal y los mismos archivos en el servicio CloudFront de Amazon.

  • 1.82-1.95 segundos frente a 0.75-0.85 segundos de tiempo de carga total (~ 1.1 segundos más rápido)
  • La latencia más rápida de 90ms vs 25ms (65ms más rápido)
  • 161 ms frente a la latencia más lenta de 112 ms (49 ms más rápido)
  • CloudFront: solo un archivo con una latencia superior a 100 ms y el 85% de los archivos con una latencia inferior a 55 ms
  • Host web normal: solo el 65% de los archivos tenía una latencia inferior a 110 ms

Comparación de duración

  • 92ms vs 38ms de duración más rápida (54ms más rápido)
  • 396 ms frente a 183 ms La duración más lenta (213 ms más rápida)

50 ms o incluso 100 ms no suena como mucho tiempo de espera (0,1 segundos), pero cuando lo repites para 30, 40, 50 o más archivos, puedes ver cómo se acumulan rápidamente en segundos..

Comparacion visual

Aquí hay un video rápido para mostrar cuán notable es el aumento en el tiempo de carga. He deshabilitado las memorias caché y hago una actualización forzada (shift + actualizar) para asegurar que las imágenes no se almacenen en la memoria caché.

Otras formas de aumentar el rendimiento

Hay varias otras formas de aumentar el rendimiento del sitio web cuando se utiliza un CDN..

  • Crea diferentes subdominios para diferentes tipos de archivos para maximizar las descargas paralelas. Por ejemplo, cargue imágenes de "images.jremick.com" y otros archivos como scripts y CSS de "cdn.jremick.com". Esto permitirá que se carguen más archivos en paralelo, lo que reduce el tiempo total de carga.
  • Gzip archivos como JavaScript y CSS
  • Configurar ETags

Consulte Mejores prácticas para acelerar su sitio web para obtener más información..

Sirviendo archivos comprimidos desde archivos Cloud

Una de las opciones anteriores para aumentar aún más el rendimiento fue proporcionar archivos comprimidos. Desafortunadamente, CloudFront no puede determinar automáticamente si un visitante puede aceptar archivos comprimidos o no y entregar el correcto. Afortunadamente, todos los navegadores modernos admiten archivos comprimidos en estos días..

Crea y sube tus archivos comprimidos

Para servir archivos comprimidos desde CloudFront, podemos darle a nuestro sitio web cierta lógica para entregar los archivos correctos o podemos configurar la codificación de contenido y el tipo de contenido en algunos archivos específicos para simplificar un poco las cosas. Gzip los archivos que desee y cámbieles el nombre para que no los finalice .gz. Por ejemplo, "filename.css.gz" se convertiría en "filename.css" o para recordarse que se trata de un archivo comprimido, asígnele el nombre "filename.gz.css". Ahora cargue el archivo comprimido en gzip en la ubicación en su cubo de S3 que desee (no olvide configurar la ACL / Permisos).

Si no está seguro de cómo gzip un archivo, consulte http://www.gzip.org (OS X puede hacer esto en la terminal)

Establecer codificación de contenido y tipo de contenido

Necesitamos configurar la codificación de contenido y el tipo de contenido (si aún no está configurado) en nuestros archivos para que, cuando se solicite a través del navegador, sepa que el contenido está comprimido y que pueda descomprimirlo correctamente. De lo contrario, se verá así.

Podemos hacerlo fácilmente con Bucket Explorer. Una vez que lo haya descargado, ingrese su clave de acceso y clave secreta de AWS para iniciar sesión en su cuenta S3. Encuentre el archivo comprimido que cargó anteriormente, haga clic con el botón derecho y seleccione "Actualizar metadatos".

Como puede ver, ya tiene el tipo de contenido configurado en texto / css, por lo que no necesitamos establecerlo (javascript sería text / javascript). Solo necesitamos agregar la codificación de contenido correcta. Haga clic en "Agregar" y, en el cuadro de diálogo emergente, ingrese "Codificación de contenido" en el campo Clave y "gzip" en el campo Valor. Haga clic en Aceptar, luego Guardar y listo! Ahora el navegador verá el archivo correctamente.

Gzipping un archivo puede reducir enormemente el tamaño del archivo. Por ejemplo, esta hoja de estilo de prueba fue de alrededor de 22 KB y se redujo a aproximadamente 5 KB. Para mi blog, he combinado todos mis complementos de jQuery con las pestañas de interfaz de usuario de jQuery. Después de la minificación, se redujo a 26.49KB, luego de ser comprimido, se redujo a 8.17KB..

Conclusión

Hay muchas formas de aumentar el rendimiento de su sitio web y, en mi opinión, vale la pena intentarlo. Si los visitantes están a solo 0,5 segundos o incluso 1 segundo de abandonar su sitio web, una CDN podría evitar que eso suceda. Además, la mayoría de nosotros somos fanáticos de la velocidad de todos modos, ¿por qué no aumentar el rendimiento de su sitio web si puede? Especialmente si podría ahorrarle dinero en el proceso..

Si tiene alguna pregunta, hágamelo saber en los comentarios e intentaré responderlos. Gracias!

  • Síganos en Twitter o suscríbase a Nettuts + RSS Feed para obtener más artículos y artículos de desarrollo web diarios..