#ruby #nginx #passenger #rvm
#ruby #nginx #пассажир #rvm
Вопрос:
Я загнал себя в немного раздражающий угол.
Я начал использовать RVM, и теперь одно из моих приложений счастливо сидит в собственном Ruby 1.8.7@appname
gemset. Я могу создать gemset с нуля и сделать bundle install
, чтобы установить все драгоценные камни.Все хорошо.
Итак, на сервере, где размещено приложение, под nginx с помощью passenger я установил RVM под пользователем «deploy», которому принадлежит папка приложения. Затем я установил все драгоценные камни с помощью bundle install. Затем я изменил конфигурацию nginx, чтобы указать на новую версию приложения, ту, которая работает под управлением RVM. БАЦ!, Пассажир начинает жаловаться на отсутствие драгоценных камней.
Я думаю, проблема в том, что nginx запускается от имени root, у которого не определен RVM. «Без проблем», — подумал я, — я установлю RVM приложения в качестве системного по умолчанию. Итак, я переключился на root, затем сделал rvm --default 1.8.7@appname
. Я получил:
rvm: command not found
итак, похоже, что RVM был установлен только для пользователя «deploy». Я предполагаю, что я должен был установить его для всех пользователей, следуя установочному документу RVM.
Должен ли я начинать все сначала? То есть, я должен переключиться обратно на пользователя «deploy», удалить RVM и все его следы, затем переустановить его как root? Или я могу запустить nginx / passenger в правильном RVM?
Ответ №1:
Предисловие: Я не являюсь текущим пользователем passenger. Итак, следующий материал — это только мысли и воспоминания.
Во-первых: если я правильно помню, то только основной процесс nginx определенно выполняется от имени root, но дочерние процессы выполняются под идентификатором пользователя / группы, который вы можете настроить в конфигурации nginx. (И вы должны это сделать, если заботитесь о безопасности!)
Не знаю, влияет ли это на пассажирский мод — я бы сказал, должно, потому что основной процесс предназначен только для объединения рабочих процессов, которые будут выполнять реальную работу. Также не могу сказать, выполняется ли вспомогательный процесс для passenger с теми же правами пользователя, что и у worker. (Это должно быть по той же причине, что и в первом абзаце.)
В nginx есть passenger_default_user
настройка, которую вы должны использовать. Это должно избежать проблем с вашим пользователем.
Во-вторых, попробуйте советы в разделе https://rvm.beginrescueend.com/integration/passenger /
Они могут быть полезны, особенно в случае пользовательских установок RVM.
Пожалуйста, внимательно прочитайте примечания к деталям, устранение неполадок и часто задаваемые вопросы!
И мой третий момент: я бы предпочел системную установку RVM в производственной системе. Таким образом, у вас есть возможность создавать разные настройки для разных пользователей (системы / сервиса), не испытывая проблем с пользовательскими областями.
Последнее, но не менее важное: в прошлом у меня не было такого хорошего опыта с настройкой RVM-passenger-nginx. Также я не сторонник перегруженных веб-серверов / балансировщиков нагрузки и поэтому никогда больше не буду использовать пассажирский модуль nginx. Не допускайте материал, который ему не принадлежит.
Кроме того, имейте в виду, что мод passenger-nginx лишает возможности использовать разные rubies и версии ruby с nginx passenger. Я бы сказал, что в этом случае имеет меньше смысла использовать RVM. Я предпочитаю использовать nginx только как прокси и позволяю выполнять работу веб-сервера с помощью unicorn / thin / чего угодно еще.
Заключение
Я бы сказал, это не проблема с пользователем root. Я думаю, что что-то в вашей настройке отсутствует или неправильно настроено.
Чтобы ответить на ваши последние вопросы: Нет, я думаю, что нет необходимости устанавливать системный rvm и да, должна быть возможность запускать passenger в nginx с правильным (пользовательским) rvm.
Комментарии:
1. «Я бы предпочел системную установку RVM в производственной системе».. Без крайней необходимости я бы не стал использовать RVM на производственном хостинге, поскольку я не буду сильно менять конфигурацию Ruby или gem, если вообще буду. Если мне нужно несколько Rubies, я бы установил их по отдельным путям в моем пути
/local
или/opt
и ссылался бы на них непосредственно в#!
строке или используя PATH для сеанса запуска приложения или настроив его с помощью скрипта оболочки запуска. Это всего лишь мои 0.02 доллара.2. Это звучит сложнее, и я думаю, что это было причиной разработки RVM: упрощенное управление несколькими rubies.
3. @железный дровосек — спасибо. В итоге я не использовал rvm на сервере: поскольку на нем размещен только один сайт, в этом нет необходимости, и это просто усложняло работу. По-прежнему неоценимо использовать rvm локально, поскольку это позволяет мне зеркально отображать среду производственного сервера, но отказ от него на сервере просто значительно упростил жизнь. Спасибо, что помогли мне обдумать это.
Ответ №2:
По умолчанию Passenger запускает приложение Rails под тем же UID, что и владелец файла config/environment.rb
, поэтому вы могли бы сохранить свое приложение под управлением пользователя deploy. Смотрите раздел Переключение пользователей в документации для пассажиров.
Также важно установить passenger_ruby
переменную в ngnix
конфигурации, указывающую на двоичный файл RVM ruby, например:
passenger_ruby /home/deploy/.rvm/bin/passenger_ruby;
Смотрите документацию по интеграции RVM Passenger для получения дополнительной информации.