14
  • estoy usando una aplicación Rails 3.2
  • creé una distribución Cloudfront con un origen S3
  • ya cambio config.action_controller.asset_host a mi activo CloudFront
  • estoy usando Capistrano

Quiero saber, cómo cargar mis activos precompilados a Cloudfront cada vez que desplegarrieles Cómo subir activos precompilados a Cloudfront

Respuesta

18

No es necesario el cubo s3 ya que Amazon Cloudfront ahora es compatible con "orígenes personalizados". Solía ​​ser que tenía que especificar un cubo s3 como origen, pero ahora puede apuntar su distribución en la nube a su aplicación de rieles.

http://aws.typepad.com/aws/2010/11/amazon-cloudfront-support-for-custom-origins.html

Así que, después de crear una distribución que está orientado hacia la aplicación de acceso público, se establece su anfitrión activo en el archivo de configuración apropiada, por ejemplo, production.rb y estás fuera de las carreras.

config.action_controller.asset_host = "url of your cloudfront distribution" 

Aquí es un artículo de medio decente sobre cómo configurar las cosas:

http://ryantownsend.co.uk/post/13126016608/cloudfront-cdn-on-rails

no se confunda con el bit sobre la configuración de recprds CNAME para un subdominio origen. Esto solo es relevante si desea usar su propio subdominio en lugar de amazonas.

+1

¿quieres decir directorio público? – eveevans

+8

La forma en que funcionan los orígenes personalizados es que Cloudfront actúa como un proxy para su contenido estático. Configura Rails para que sirva contenido estático desde la url de la nube, pero no copia nada. Luego, cuando un usuario solicita el contenido estático de la nube, Cloudfront dice "No tengo ese archivo, lo obtendré de la aplicación", descarga el archivo de su sitio y luego lo muestra. A partir de ese momento, todas las solicitudes de ese elemento estático provienen de la nube sin molestar a su aplicación. –

+0

¡esto es asombroso! gracias por la explicación. – chourobin

14

Después de instalar la gema AWS-s3, puede añadir esta en este extremo de su receta Capistrano:

set :cdn_user, "KEY ID" # This is called "CDN KEY API" for AWS 
set :cdn_api_key, "YOUR KEY SECRET" 
set :cdn_container, "bucket name" 

namespace :assets do 
    task :to_cdn do 
     require 'aws/s3' 
     AWS::S3::Base.establish_connection!(:access_key_id => cdn_user, :secret_access_key => cdn_api_key) 
     assets_dir = "#{shared_path}/assets" 
     Dir.glob(assets_dir + "/**/*").each do |file| 
     if !File.directory?(file) 
      cdn_filename = file.gsub(assets_dir,"assets") 
      AWS::S3::S3Object.store(cdn_filename, open(file) , cdn_container) 
     end 
     end 
    end 
end 

El uso de un disparador de esta manera:

after "deploy:assets:precompile", "assets:to_cdn" 

También tendrá que poner en marcha el compilación en algún momento de su receta con:

load 'deploy/assets' 

Resultado: al final de la compilación de activos, todos sus activos van a ser empujado en S3, y podrá acceder a ellos desde la nube.

Luego debe actualizar su config/environment/production.rb para que apunte a su URL de CDN.

config.action_controller.asset_host = "http://assets.example.com" 
+0

Gracias, Keyz, esa es una gran solución, pero tengo una pequeña duda, ¿qué pasó con los activos cuando implemento de nuevo, quiero decir, tendré problemas con los activos de caché o los encabezados de caducidad? – eveevans

+0

Se imprimen huellas dactilares en producción (se agrega un hash md5 al nombre) para que pueda mantener todas las versiones de sus activos en la misma carpeta. Magia de la cartera de activos. Esto previene el problema de caché en la actualización: las versiones antiguas persisten, todavía hay nuevas disponibles. –

+0

También debe leer el documento completo sobre el inventario de activos: http://guides.rubyonrails.org/asset_pipeline.html –

3

Hay una gran gema Ruby que se encarga de esto llamada AssetSync. Si lo combina con turbo-sprockets, puede asegurarse de que solo se copien los activos nuevos o actualizados en la implementación.

+0

Gracias, lo intentaré – eveevans

Cuestiones relacionadas