Назад | Перейти на главную страницу

Лучшая практика для настройки RVM, Passenger / Apache с несколькими Rubies и запуска от имени конкретных пользователей?

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

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

(Примечание: я сам не являюсь разработчиком / пользователем 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 я не знаю точно.

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

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