Наилучшая практика для настройки 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: Даже если это возможно, это правильный способ настройки? Какова лучшая практика здесь, учитывая, что:

  1. Веб-сервер / приложение ДОЛЖНЫ работать как пользователь данной учетной записи: группа
  2. ДОЛЖЕН иметь возможность запускать разные версии ruby ​​для каждого приложения
  3. Каждый пользователь ДОЛЖЕН иметь возможность запускать несколько приложений.
  4. Каждое приложение ДОЛЖНО содержаться в домашнем каталоге определенного пользователя.
  5. Пользователь ДОЛЖЕН быть помещен в "песочницу" на его / ее домашний каталог (не 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 не знаю точно.

Статьи / Документы, которые помогли:

  1. Несколько Рубинов с одним Пассажиром
  2. Как установить Redmine на Ubuntu 11.10 Server с использованием Apache и mod_passenger с опциями повышения производительности (в основном используется для настройки параметров типа производительности)
  3. Справочник по настройке Phusion Passenger (Apache)
Другие вопросы по тегам