He dicho a menudo que las cargas de archivos son un ataque DOS autoinfligido. Ciertamente, no hay que buscar mucho para encontrar ejemplos de una función de aplicación aparentemente pequeña que causa estragos en muchos servidores de aplicaciones: https://www.google.com/search?q=heroku+image+magick+timed+out
En @dojo4 usamos la capacidad de ImageMagick para establecer límites a través del entorno como primera línea de defensa para mantener los procesos de magick bien comportados.
Primero, un poco de configuración/antecedentes: a menudo implementamos un par de archivos RAILS_ROOT/env.yml y RAILS_ROOT/env.rb que la aplicación rails absorberá al iniciarse. No contienen dependencias de rails y se pueden usar en scripts de fondo para comprender rápidamente la configuración de rails implementada sin necesidad de cargar toda la aplicación rails.
El primer archivo es un simple archivo yaml de pares de valores k=v.
# archivo: RAILS_ROOT/config/env.yml
# RAILS_ENV : production
# RAILS_STAGE : stage
# APP_RUBY : /usr/local/rbenv/versions/1.9.3-p0/bin/ruby
APP_RUBY_VERSION : 1.9.3
# APP_PORT : 4201
# APP_USER : dojo4
# APP_GROUP : dojo4
El segundo es el archivo que realmente se requiere. Carga este archivo y tiene un intento dinámico de establecer variables de entorno adicionales.
# archivo: RAILS_ROOT/env.rb
#
# primero, incorporamos cualquier configuración de entorno encontrada en
#
# RAILS_ROOT/env.yml
#
# teniendo cuidado de no sobrescribir ninguna variable de entorno configurada manualmente. El archivo env.yml es
# normalmente creado durante una implementación de cap.
#
require 'erb'
require 'yaml'
require 'rbconfig'
env_yml = File.expand_path('../env.yml', __FILE__)
if test(?s, env_yml)
buf = IO.read(env_yml)
expanded = ERB.new(buf).result(binding)
config = YAML.load(expanded)
config.each{|key, val| ENV[key.to_s] ||= val.to_s} if config.is_a?(Hash)
end
Lo que nos interesa aquí es la sección en la que se configura el entorno de ImageMagick.
Aquí está en toda su gloria completa; los comentarios deben proporcionar contexto y explicación:
# asegurar que RAILS_* estén establecidos
#
ENV['RAILS_ENV'] ||= 'development'
ENV['RAILS_ROOT'] ||= File.dirname(File.dirname(__FILE__))
# establecer el entorno de Imagick Magick
#
# ref: http://www.imagemagick.org/script/resources.php
#
# usar sistema "convert -list resource" en la consola para ver
#
# tener en cuenta que estos ajustes son *por proceso*, por lo que varias veces el número
# de servidores de aplicaciones que están ejecutando!
#
tmp = File.join(ENV['RAILS_ROOT'], 'tmp')
# mantén tus archivos temporales fuera del espacio del sistema, que en AWS es parte del volumen raíz!
#
#
ENV['TMPDIR'] = tmp
ENV['MAGICK_TMPDIR'] = tmp
# mantén solo este número de manejadores de archivos abiertos a la vez
#
ENV['MAGICK_FILE_LIMIT'] = 64
# ancho * alto < este valor se ajusta a la memoria. De lo contrario, usa la caché de píxeles
#
ENV['MAGICK_AREA_LIMIT'] = '64MB'
# no consumas más de esta cantidad de memoria
#
ENV[