я часто казав, що завантаження файлів - це самонав'язана DOS-атака. Звичайно, не треба далеко ходити, щоб знайти приклади, коли, здавалося б, невелика функція додатку сіє хаос на багатьох серверах додатків: https://www.google.com/search?q=heroku+image+magick+timed+out
@dojo4 ми використовуємо можливість ImageMagick встановлювати обмеження через середовище як перший захист, щоб процеси магії були добре впорядковані.
спочатку трохи підготовки/інформації: ми часто розгортаємо пару файлів RAILS_ROOT/env.yml та RAILS_ROOT/env.rb, які програма Rails завантажує при запуску. вони не містять жодних залежностей Rails і можуть використовуватися у фонових скриптах для швидкого розуміння розгорнутої конфігурації Rails без необхідності завантажувати весь додаток Rails.
перший файл - це простий файл yaml із парами ключ=значення середовища.
# файл: 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
другий файл насправді є тим, який завантажується. він завантажує цей файл і динамічно встановлює додаткові змінні середовища
# файл: RAILS_ROOT/env.rb
#
# спочатку ми додаємо будь-які налаштування середовища, знайдені в
#
# RAILS_ROOT/env.yml
#
# уважно, щоб не замінювати жодні вручну встановлені змінні ENV. файл env.yml
# зазвичай створюється під час розгортання 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
те, що нас цікавить тут, - це розділ, в якому налаштовується середовище imagemagick.
ось він у всій своїй красі - коментарі повинні забезпечити контекст і пояснення:
# переконайтеся, що RAILS_* встановлені
#
ENV['RAILS_ENV'] ||= 'development'
ENV['RAILS_ROOT'] ||= File.dirname(File.dirname(__FILE__))
# встановіть середовище Imagick Magick
#
# посилання: http://www.imagemagick.org/script/resources.php
#
# використовуйте систему "convert -list resource" у консолі для перегляду
#
# зрозумійте, що ці налаштування є *на рівні процесу*, тому враховуйте кількість серверів додатків, які у вас працюють!
#
tmp = File.join(ENV['RAILS_ROOT'], 'tmp')
# тримайте ваші тимчасові файли поза системним простором, який на AWS є частиною кореневого
# тому!