Есть задача, даже две. Первая - разобраться с настройкой nginx для отдачи rails-статики
и балансировки двух (трёх, сколько нужно), mongrel-ов. Вторая - всё то же самое, но без mongrel,
а с использованием passenger и, главное, через capistrano.
Nginx + mongrels
Первую задачу я реализовывал локально, на своей уютненькой убунте и всё решилось сравнительно
мирно.
Убрал из дефолтной конфигурации все директивы server и upstream,
оставил только директивы include - так гибче, если что.
## |
Добавил в отдельный файл конфигурацию апстрима на двух монгрелах (важен был сам принцип, а не количество)
и сервер:
upstream mongrel { # <-- имя upstream-а для ссылок на него |
Отдельный пункт в первой задаче был - сохранить для использования в рельсовских контроллерах
субдомен, пришедший в запросе. Что и было реализовано при помощи server_name с регулярным выражением
и proxy_set_header с использованием пришедшего из регэкспа поля $subdomain. Без передачи параметра
Host в запросе к приложению приходил параметр “mongrel” с никаким субдоменом, а без передачи порта
возникали проблемы с открытием следующих страниц (редиректы, ссылки и т.п.)
Теперь заходим на organization_name.lvh.me:8084 и в приложение приходят запросы с указанным субдоменом
и разбрасываются между монгрелами. Как-то так.
Capistrano, а потом passenger
На самом деле, мне просто хотелось лёгкого деплоя. И поэтому я решил что на другую машину я буду
деплоить при помощи capistrano. А passenger всплыл уже потом.
Начинаем, как водится, с нуля:
cd /home/user_name/devel/rails/project_name |
Полученный Capfile оставляем в покое, а вот с config/deploy.rb пришлось потанцевать,
по целому ряду причин. Во-первых, мне категорически не хотелось использовать sudo
при деплое, во-вторых, мне не хотелось вводить пароли при каждом деплое, в третьих,
на удалённой машинке rvm был установлен из-под root-а.
Итак, берём deploy.rb и внимательно на него смотрим.
### Где всё будет происходить |
Примерно так стал выглядеть deploy.rb на моей машинке (если комментарии не считать).
В процессе мне пришлось разбираться, как настроить ssh-forwarding, как запускать
на удалённой машине ssh-agent и как запускать passenger в standalone режиме
и что man-ы и официальная документация are the developer’s best friends.
И всё было почти хорошо. И деплой проходил, не заканчиваясь сообщением, что какая-то команда
не прошла, но вот рестарт passenger-а не происходил. Вот если бы passenger-а можно было бы
запускать с командной строки, указывая, в каком каталоге будет производиться запуск, тогда бы,
возможно, следующую часть можно было бы и опустить. А так мне пришлось устанавливать passenger
в конкретном gemset-е, в нём же запускать установку nginx-модуля для passenger и настраивать
nginx уже на работу с /home/user_name/deploy_path/public.
$ sudo rvm 1.9.2@project gem install passenger |
Дальше - правки, внесенные в /opt/nginx/conf/nginx.conf
http { |
Перезапускаем nginx и идём пить кефир.