Jag har ofta sagt att filuppladdningar är ett självutdiktat DOS-anfall. Visst behöver man inte leta långt för att hitta exempel på vad som verkar vara en liten applikationsfunktion som orsakar kaos på många appservrar: https://www.google.com/search?q=heroku+image+magick+timed+out
@dojo4 använder Image Magicks förmåga att ställa in gränser via miljön som första försvarslinje för att hålla magicka processer välbetedda.
först lite setup/bakgrund: vi distribuerar ofta en RAILS_ROOT/env.yml och RAILS_ROOT/env.rb filpar som rails-applikationen kommer att slurpa in vid start. De innehåller inga rails-beroenden och kan användas i bakgrundsskript för att snabbt förstå den distribuerade rails-konfigurationen utan att behöva ladda hela rails-applikationen.
den första filen är en enkel yaml-fil med k=v miljöpar.
# fil: 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
den andra är egentligen filen som krävs. Den laddar den här filen och har en dynamisk metod för att ställa in ytterligare miljövariabler
# fil: RAILS_ROOT/env.rb
#
# först, vi slår in alla miljöinställningar som hittas i
#
# RAILS_ROOT/env.yml
#
# var noga med att inte skriva över några manuellt inställda ENV-var. env.yml-filen skapas
# normalt under en cap-distribution.
#
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
vad vi är intresserade av här är avsnittet där imagemagick-miljön konfigureras.
här är det i all sin fulla glans - kommentarerna bör ge kontext och förklaring:
# se till att RAILS_* är inställda
#
ENV['RAILS_ENV'] ||= 'development'
ENV['RAILS_ROOT'] ||= File.dirname(File.dirname(__FILE__))
# ställ in Imagick Magick miljö
#
# ref: http://www.imagemagick.org/script/resources.php
#
# använd system "convert -list resource" i konsolen för att visa
#
# kom ihåg att dessa inställningar är *per-process* så flera gånger antalet
# appservrar du har igång!
#
tmp = File.join(ENV['RAILS_ROOT'], 'tmp')
# håll dina temporära filer utanför systemutrymmet, som på AWS är en del av rotvolymen!
#
ENV['TMPDIR'