Cloudfront que ofrece CSS obsoleto para la aplicación Rails 3.2

4

Estoy ejecutando una aplicación Rails 3.2 en Heroku. Durante aproximadamente una semana estuvimos sirviendo activos a través de CloudFront estableciendo config.action_controller.asset_hostnuestra URL de CloudFront en nuestro archivo config / production.rb. Esto estaba funcionando con éxito.

Sin embargo, el fin de semana pasado, noté que después de una implementación en producción, nuestro sitio web se veía muy mal y la razón era que estaba sirviendo CSS obsoleto. Miré el archivo css que estaba sirviendo (usando el elemento inspeccionar en Chrome), y el CSS era un archivo application.css con hash md5 proveniente de CloudFront. Eliminé la línea asset_host (para que los activos se sirvieran directamente desde nuestra aplicación) y volví a implementar (sin cambiar ningún css), y noté que el sitio, que ahora se veía bien, mostraba application.css con un hash md5 diferente.

Entonces, parece que, por alguna razón, CloudFront estaba entregando una versión anterior de application.css, y supongo que esto se debe a que nuestra aplicación le estaba diciendo a los navegadores de los usuarios que entregaran una versión anterior de application.css.

Para agregar una variable más: almacenamos en caché la página de inicio y parte de nuestro archivo layouts / application.html.erb (que contiene la etiqueta de la hoja de estilo), pero en cada implementación borramos la caché a través de Rails.cache.clear.

Entonces, mi mejor suposición es que Rails.cache.clear podría no invalidar correctamente el caché. Usamos el cliente dalli Memcache, si eso ayuda.

¡Cualquier idea o sugerencia será muy apreciada!

Actualizar:

Intenté sacar el CSS del bloque en caché y volver a habilitar CloudFront, pero el CSS todavía parece estar roto. Por lo tanto, no parece estar relacionado con el almacenamiento en caché del encabezado.

Actualización 2:

Parece que esto es un problema de CloudFront, porque cuando inspecciono el elemento y cambio la URL de CSS en nuestro dominio raíz (en lugar del dominio de CDN), el CSS se representa correctamente.

Dado que una colisión md5-hash es extremadamente improbable, parece que CloudFront está sirviendo el archivo CSS incorrecto cuando solicito el archivo CSS con huellas digitales md5 correcto. ¿Algunas ideas?

0

los activos no se sincronizan automáticamente con su CDN cuando implementa una aplicación en heroku. En el script de implementación en heroku, hace los activos de rake: tarea de precompilación, pero luego no los coloca en su CDN. Tendrá que crear algún tipo de mecanismo para hacer esto por su cuenta en la implementación de su aplicación.

Alguien más hizo una pregunta similar y es posible que desee echar un vistazo a las sugerencias: ¿ Implementación automática de activos de Rails 3 en Amazon CloudFront?