Thinking Sphinx и runit
Thinking Sphinx является, пожалуй, наилучшим способом использовать Sphinx в Rails-приложении, но предлагаемый по-умолчанию вариант его запуска (rake thinking_sphinx:start) несколько сомнителен для production окружения. Как раз тут приходит на помощь runit.
Супервизор runit - идеальный способ для запуска и управления своими сервисами. Он реализует такой функционал, как:
- превращение любого процесса в демон;
- логирование вывода процесса и ротирование логов;
- запуск, остановка, рестарт, запрос состояния, управляющие скрипты для init.d;
- выключение и запуск сервисов автоматически при появлении новых сервисов в списке либо удалении старых из списка;
- возможность ведения нескольких независимых списков сервисов одновременно (например, для каждого пользователя отдельно и для системы в целом);
- удобный API для управления сервисами.
Звучит отлично! Но как же запустить через него наш Sphinx?
Для начала необходимо установить runit - apt-get install runit. Для каждого runit сервиса создаем директорию в /etc/sv, для примера назовем сервис rails_app_sphinx:
Также необходимо наличие скрипта run, который осуществляет запуск сервиса. Для запуска Sphinx с конфигурацией, полученной с использованием Thinking Sphinx, подойдет примерно такой скрипт (/etc/sv/rails_app_sphinx/run):
exec 2>&1
exec chpst -u rails:rails \
/usr/local/bin/searchd \
--nodetach \
--pidfile \
--config /path/to/rails_app/config/production.sphinx.conf
В этом скрипте необходимо заменить:
rails:rails- пользователь и группа, под которыми запускается Rails-приложение/usr/local/bin/searchd- полный путь кsearchd(одн из исполняемых файлов в составе Sphinx)/path/to/rails_app- путь к директории с Rails-приложением
Делаем скрипт запуска исполняемым:
Все готово, остается только дать возможность runit увидеть новый сервис:
После создании символической ссылки в директории /etc/service супервизор runit автоматически запустит наш сервис.
Теперь можно проверить статус:
Остановить его:
Или запустить снова:
Для интеграции с capistrano в config/deploy.rb необходимо подключить рецепты Thinking Sphinx и добавить остановку Sphinx после задачи deploy:restart:
...
after 'deploy:restart', 'thinking_sphinx:stop'
После остановки Sphinx будет заново запущен благодаря работе runit, который осуществляет мониторинг сервисов и осуществляет перезапуск в случае их завершения.
Более подробную информацию непосредственно о runit можно найти в статье на хабре.
Related posts:
о! рад, что эта статья увидела свет =) спасибо
yas
4 Дек 10 at 19:00