rails memcache development cache ruby-on-rails deployment caching

ruby on rails - memcache - Eliminando la prevención de caché en la producción de rieles



rails etag (3)

@Aupajo Me gusta esto, pero creo que puedo llevarlo un poco más allá. El problema aquí es que capistrano crea nuevas copias de todos los archivos en cada implementación, por lo que se cambian todas las cadenas que destruyen la memoria caché. Sin embargo, un MD5 del archivo solo cambiará cuando cambie el contenido del archivo.

Por supuesto, generar un MD5 es costoso y lento, pero puede almacenar en caché el MD5 de un archivo en Memcache, (marcada en el tiempo de cambio, como si el tiempo hubiera cambiado, el MD5 puede haber cambiado, pero si la marca de tiempo no ha cambiado el MD5 no habrá cambiado

Cuando despliegue una aplicación de rieles en modo de producción, agrega una cadena de fecha y hora como un param de consulta al final de todas las urls de recursos estáticos. Esto es para evitar que los navegadores utilicen copias caducadas anticuadas de los activos después de que vuelva a implementar la aplicación.

¿Existe alguna manera de hacer que los rieles utilicen las marcas de tiempo anteriores para los activos que no han cambiado (y solo los que no han cambiado) desde la última implementación? Quiero hacer esto para evitar que los usuarios tengan que volver a descargar los activos que no han cambiado.


Creo que puedes usar ENV [''RAILS_ASSET_ID''] para alterar la identificación del activo que destruye la memoria caché. Lamentablemente, esto es para todos los activos.

Pero si no está configurado, usa el tiempo de modificación de la fuente del activo. Si ese archivo no se ha modificado desde la última vez que lo usó, no debería ser un problema.

Si la identificación del activo está cambiando cuando no se han modificado, puede deberse a que el proceso de implementación alteró el tiempo de modificación y tal vez podría ver cómo ajustarlo.

Por último, siempre puede anular rails_asset_id con su propio método personalizado .

Espero que esto ayude.


Capistrano, por defecto, toca cada archivo que considera un ''activo''. Como dijiste, esto significa que después de cada despliegue, Rails piensa que todos los activos han cambiado y los navegadores descargarán una versión más nueva cada vez.

Puede deshabilitar esto en Capistrano con la siguiente configuración

set :normalize_asset_timestamps, false

Si está utilizando SVN, las fechas modificadas para sus archivos deben reflejar las fechas en que fueron modificadas por última vez en su repositorio, por lo que debería ser perfecto.

Si está utilizando Apache, puede agregar algo como esto para realmente hacer que el almacenamiento en caché funcione. Esto ayuda al decirle al navegador que confíe en las directivas de "Control de caché", lo que significa que si sabe que el activo está en caché, ni siquiera se molestará en solicitarlo.

#Etags should be based on the file parameters only (default includes INode) FileETag MTime Size #Rewrite stuff RewriteEngine On #This sets the environment variable (is_versioned) when the URL query string #looks like ?874353948543 or any string of digits RewriteCond %{QUERY_STRING} ^[0-9]+$ RewriteRule ^(.*)$ $1 [env=is_versioned:true] <Directory /deployed-rails-app/public/ > Options -Indexes FollowSymLinks -MultiViews AllowOverride None Order allow,deny allow from all #For files, force the browser to rely on cache-control directives and #Rails asset timestamps by removing Etags and Last-Modified dates #For all assets that aren''t stamped by rails, cache them for ~ 3 hours Header set "Cache-Control" "max-age=10000" Header unset Etag Header unset "Last-Modified" #For all assets that ARE stamped by rails, cache them for 30 days Header set "Cache-Control" "max-age=2592000" env=is_versioned </Directory>

Configuré mi servidor de producción de esta manera y ahora los visitantes devueltos solo realizan una solicitud (Get /) que devuelve el contenido dinámico y todos los activos (~ 40 - 50) se guardan en caché.