Моя цель - запускать приложения ruby под разными пользователями сервера с потенциально разными версиями ruby.
Так что у меня были бы пользователи, которые по сути служат «учетной записью хостинга». Корневые файлы документов / файлы приложений будут находиться в своем домашнем каталоге вместе с рубиновыми версиями и гемсетами, управляемыми с помощью RVM. У пользователя будет одно или несколько веб-приложений, которые необходимо запустить. Виртуальные хосты для сайта этого пользователя будут указывать на корень документа в домашнем каталоге пользователя, и веб-сервер также будет эффективно работать как этот user:group
.
Пример макета:
/home/theuser
/.rvm
/applications
/railsapp1
/public
[ other rails dirs ]
/somephpapp (symfony, zf, etc.)
/public
[ other framework dirs ]
/www
/railsapp1.com (ln -s ../applications/railsapp1/public)
/somestaticsite.com
/somephpapp.com (ln -s ../applications/somephpapp/public)
Так...
Вопрос 1: Я это вообще возможно? Я знаю, что пассажир поддерживает версии Ruby и пользователей-пассажиров (я предполагаю, что пользователь-пассажир эквивалентен указанию пользователя: группа для fcgi, php-fpm, SuExec) на уровне виртуального хоста, но все найденные мной intstuctions, похоже, устанавливают модуль apache из конкретному пользователю RVM, что кажется странным. Или это просто вопрос создания общего пользователя для установки модуля, а затем выполнения всего остального для каждой учетной записи?
Вопрос 2: Даже если это возможно, правильно ли все устроить? Какая здесь лучшая практика, учитывая, что:
(Примечание: я сам не являюсь разработчиком / пользователем Ruby, кроме нечетного сценария оболочки здесь или там или использования compass / zurb-foundation, поэтому я открыт для других вариантов, кроме Passenger. Также этот сервер не предназначен в качестве производственной среды.)
Когда я изначально разместил это, я пытался сэкономить время, идя по этому пути, для настройки, только чтобы он не работал. Через пару дней я просто попробовал, и это сработало. Я сделал следующее:
Создайте пользователя для фактической установки пассажира. Я подозреваю, ты мог бы использовать root
для этого, но я создал отдельного пользователя уровня администратора с именем passenger
. Я также отключил удаленный доступ для этого пользователя.
sudo useradd -m -s /bin/bash passenger
Перейти на новый passenger
пользователь и установить rvm
и используйте его для установки моего предпочтительного дефолт Рубин (1.9.3-stable
):
su - passenger
curl -L https://get.rvm.io | bash
rvm install 1.9.3
Установите пассажира и модуль apache:
gem install passenger
passenger-install-apache2-module
Добавить passenger
файлы модов в /etc/apache2/mods-available
... .load
файл:
# /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /home/passenger/.rvm/gems/ruby-1.9.3-p429/gems/passenger-4.0.5/libout/apache2/mod_passenger.so
В .conf
файл:
# /etc/apache2/mods-available/passenger.conf
PassengerRoot /home/passenger/.rvm/gems/ruby-1.9.3-p429/gems/passenger-4.0.5
PassengerDefaultRuby /home/passenger/.rvm/wrappers/ruby-1.9.3-p429/ruby
PassengerUserSwitching on
PassengerDefaultUser www-data
PassengerDefaultGroup www-data
# Any other global-only configuration
Затем я включил модуль и запустил тест конфигурации с последующей перезагрузкой в случае успеха.
sudo a2enmod passenger
sudo apache2ctl configtest
sudo service apache2 graceful # if Syntax Ok from previous command
После этого я настроил свой виртуальный хост по мере необходимости ... пример:
<VirtualHost *:80>
ServerName appname.yourdomain.com
ServerAdmin appuser@yourdomain.com
DocumentRoot /home/appuser/path/to/doc/root
PassengerSpawnMethod smart
PassengerPoolIdleTime 300
PassengerMaxRequests 500
PassengerStatThrottleRate 5
PassengerMinInstances 2
PassengerRuby /home/appuser/.rvm/rubies/ruby-1.9.3-p429/bin/ruby
<Directory "/home/appuser/path/to/doc/root">
Options Indexes -ExecCGI FollowSymLinks -MultiViews
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
поскольку PassengerUserSwitching
является on
и PassengerRuby
принадлежит другому пользователю, пассажир автоматически запустит приложение, так как это user:group
. Однако есть определенные директивы для пассажиров, которые вы можете использовать для настройки пользователя и группы на уровне vhost. Должны ли они соответствовать владельцу PassengerRuby
я не знаю точно.
Статьи / документы, которые помогли: