@drawoharajag ❤️ det här! << klicka på mig 🐛 🫖 🧚
/a-sane-image-magick-configuration-for-your-rails-apps
publicerad den: 2013-03-19

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'