Как определить, работает ли приложение rails под Unicorn? - PullRequest
4 голосов
/ 09 ноября 2011

Мне нужно установить соединение с внешним сервисом в моем приложении Rails. Я делаю это в инициализаторе. Проблема заключается в том, что сервисная библиотека использует многопоточную доставку (которая мне нужна, потому что у меня не получается, чтобы она затормаживала запросы), но жизненный цикл Unicorn приводит к тому, что поток прерывается, и работники его никогда не видят. Одно из решений состоит в том, чтобы вызывать новое соединение при каждом запросе, но это излишне расточительно.

Оптимальным решением является настройка соединения в блоке after_fork в конфигурации единорога. Проблема в том, что он не вызывается вне единорога, что означает, что мы не можем протестировать его в средах разработки / тестирования.

Итак, вопрос в том, как лучше всего определить, работает ли приложение Rails под Unicorn (основной или рабочий процесс)?

Ответы [ 5 ]

3 голосов
/ 20 декабря 2011

Существует переменная окружения, которая доступна в Rails (я знаю, что она существует в 3.0 и 3.1), проверьте значение env['SERVER_SOFTWARE'].Вы можете просто поставить регулярное выражение или сравнение строк с этим значением, чтобы определить, на каком сервере вы работаете.

У меня в администраторе есть шаблон, который проходит через переменную env и выплевывает его содержимое.

Единорог 4.0.1

env['SERVER_SOFTWARE'] => "Unicorn 4.0.1"

сервер рельсов (webrick)

env['SERVER_SOFTWARE'] => "WEBrick/1.3.1 (Ruby/1.9.3/2011-10-30)"
3 голосов
/ 28 марта 2013

Вы можете проверить на defined?(Unicorn) и в вашем наборе Gemfile: gem :unicorn, require: false На самом деле вам не нужна библиотека Unicorn, загруженная в ваше приложение rails. Сервер запускается командой unicorn из оболочки

1 голос
/ 09 января 2015

Проверка константы Unicorn кажется хорошим решением, НО очень сильно зависит от того, предоставляется ли require: false в Gemfile. Если это не так (что вполне вероятно), проверка может дать ложное срабатывание.

Я решил это очень просто:

# `config/unicorn.rb` (or alike):
ENV["UNICORN"] = 1

...

# `config/environments/development.rb` (or alike):
...
# Log to stdout if Web server is Unicorn.
if ENV["UNICORN"].to_i > 0
  config.logger = Logger.new(STDOUT)
end

Ура!

0 голосов
/ 28 июня 2014

Внутри config/unicorn.rb Определите переменную ENV как

ENV['RAILS_STDOUT_LOG']='1' worker_processes 3 timeout 90

и тогда эта переменная ENV['RAILS_STDOUT_LOG'] будет доступна в любом месте вашего рабочего потока приложения Rails.

мой номер: Я хотел вывести все журналы (SQL-запросы) на рабочих Unicorn, а не на других рабочих Heroku, поэтому я добавил переменную env в файл конфигурации Unicorn

0 голосов
/ 07 декабря 2011

Вы можете проверить, был ли модуль Unicorn определен с Object.constants.include?('Unicorn').

Это, конечно, очень специфично для Unicorn.Более общий подход состоит в том, чтобы иметь метод, который устанавливает ваше соединение и помнит, что это уже сделано.Если он вызывается несколько раз, он просто возвращает бездействие при последующих вызовах.Затем вы вызываете метод в after_fork и before_filter в вашем контроллере приложения.Если он был запущен в after_fork, он ничего не делает в before_filter, если он еще не был запущен, он выполняет свою работу при первом запросе и ничего не делает при последующих запросах.

...