Наилучшая практика для настройки RVM, Passenger/Apache с несколькими Ruby и работы от имени определенных пользователей?
Моя цель - запускать приложения ruby под разными пользователями сервера с потенциально разными версиями 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: мне это вообще возможно? Я знаю, что passenger поддерживает версии ruby и пассажиров (я предполагаю, что пользователь пассажира эквивалентен указанию user:group для fcgi, php-fpm, SuExec) на уровне виртуального хоста, но все находящиеся в нем инструкции, кажется, устанавливают модуль apache из конкретный пользователь RVM, это кажется странным. Или это просто вопрос создания общего пользователя для установки модуля, а затем выполнения всего остального для каждой учетной записи?
Вопрос 2: Даже если это возможно, это правильный способ настройки? Какова лучшая практика здесь, учитывая, что:
- Веб-сервер / приложение ДОЛЖНЫ работать как пользователь данной учетной записи: группа
- ДОЛЖЕН иметь возможность запускать разные версии ruby для каждого приложения
- Каждый пользователь ДОЛЖЕН иметь возможность запускать несколько приложений.
- Каждое приложение ДОЛЖНО содержаться в домашнем каталоге определенного пользователя.
- Пользователь ДОЛЖЕН быть помещен в "песочницу" на его / ее домашний каталог (не sodoer)
(Примечание: я сам не являюсь пользователем / разработчиком ruby, за исключением нечетного сценария оболочки здесь или там, или использую compass/zurb-foundation, поэтому я открыт для опций, отличных от Passenger. Также этот сервер не предназначен для производственной среды.)
1 ответ
Когда я сначала опубликовал это, я пытался сэкономить время перехода по этому пути для установки, только чтобы она не работала. Через пару дней я просто попробовал. То, что я сделал, было:
Создайте пользователя для фактической установки пассажира. Я подозреваю, что вы могли бы использовать 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
Установите пассажирский и апачский модуль:
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
не знаю точно.
Статьи / Документы, которые помогли:
- Несколько Рубинов с одним Пассажиром
- Как установить Redmine на Ubuntu 11.10 Server с использованием Apache и mod_passenger с опциями повышения производительности (в основном используется для настройки параметров типа производительности)
- Справочник по настройке Phusion Passenger (Apache)