Tengo un servidor de producción con nginx -> unicorn -> rails. Precompilo activos, lo que coloca los activos en público/activos con una huella digital (hash) adjunta al nombre del archivo. Sin embargo, cuando se solicita una página web, las referencias a los activos application.css y application.js tendrán la huella digital incorrecta. Por ejemplo, la etiqueta de enlace_hoja de estilo auxiliar de Rails generará un nombre de archivo que no existe en public/assets en el servidor, porque la huella digital solicitada no coincide con la precompilada. Los recursos de imagen funcionan bien (las huellas dactilares coinciden).
Para solucionar este problema, precompilé activos en mi máquina local y la huella digital coincide con la huella digital precompilada en mi servidor. Además, cuando se ejecuta localmente con webrick en modo de producción, todo funciona. Luego intenté ejecutar webrick en mi servidor, lo cual funcionó, haciéndome pensar que unicornio es la fuente del problema.
Resolví este problema iniciando Unicorn con la opción --no-default-middleware (o -N), y esto hace que Unicorn se comporte como se esperaba con respecto a los activos precompilados. Tengo entendido que esto le dice a Unicorn que no cargue un conjunto predeterminado de middleware Rack que de otro modo cargaría. Sin embargo, no entiendo realmente por qué esto resuelve el problema o qué es lo que está fallando en primer lugar. ¿Qué está pasando?
Algunos detalles: Ubuntu 12.04, Rails 4.0.1, Ruby 2.1.0, bootstrap 3.0 con un tema de terceros
Actualizar:
La razón por la que no creo que esto sea un problema de nginx es que cuando solicito la página desde un navegador y luego veo el código fuente, el nombre del archivo application.css tiene una huella digital, por lo que en realidad se parece a application-3855b1928b94aa5bff5e1dac1aa56882. css. Esto no coincide con la huella digital real del archivo en mi servidor. Estoy convencido de que la huella digital en el servidor es correcta porque obtengo la misma huella digital en mi máquina de desarrollo local. Entonces, el cliente carga la página web y luego solicita al servidor el archivo .css... nginx recibe esa solicitud, pero no puede encontrar el archivo .css, porque en realidad no está allí, por lo que nginx se comporta como se esperaba. .
La huella digital se genera dos veces: una vez, cuando precompilo activos, lo cual funciona correctamente (bastante seguro) y ocurre sin la participación del unicornio. Y una segunda vez, cuando Rails en el contexto de un trabajador unicornio ve el ayudante stylesheet_link_tag y sobre la marcha calcula la huella digital (creo que esto es lo que está haciendo), que por alguna razón está generando una huella digital incorrecta. Este mismo proceso ocurre si reemplazo unicorn con webrick exactamente en el mismo servidor, pero en este caso las huellas digitales coinciden. Si comienzo unicornio con la bandera -N, las huellas dactilares coinciden, pero no sé por qué esto hace la diferencia, y no sé por qué nadie más parece tener que hacer esto.
Respuesta1
En Rails 4 necesitas realizar los siguientes cambios.
config.assets.compile = true
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
Esto funciona conmigo. utilice el siguiente comando para precompilar los activos
RAILS_ENV=production bundle exec rake assets:precompile
dehttps://stackoverflow.com/questions/18700219/rails-4-assets-not-loading-in-production